私のフォルダ構造は次のとおりです。
./build
./module/build
./source
私が維持したいのは./buildとその内容だけです。
このコマンドfind . \! -path ./build -delete
は削除しませんが、./build
その内容をすべて削除します。
この状況を避ける方法は?
答え1
使用中のシェルの使用:
shopt -s extglob
rm -rfvi ./!(build)
答え2
努力する:
find . \! \( -wholename "./build/*" -o -wholename ./build \) -delete
実行する場合:
rm -rf /tmp/tmp2
mkdir /tmp/tmp2
cd /tmp/tmp2
mkdir -p build module/build source
touch .hidden build/abc build/abc2 source/def module/build/ghi
find . \! \( -wholename "./build/*" -o -wholename ./build \) -delete
find .
結果は次のとおりです。
./build
./build/abc
これは出力を解析するよりもはるかに安全ですls
。ファイルまたはディレクトリ名にスペースが含まれているか悪い場合は、挿入された改行文字を処理する必要がありますfind
。
答え3
Jimmyの完璧な答えを拡張すると、次のようになります。
shopt -s extglob
拡張パターンマッチングをbashにロードしています。からman bash
:
If the extglob shell option is enabled using the shopt builtin, several
extended pattern matching operators are recognized. In the following
description, a pattern-list is a list of one or more patterns separated
by a |. Composite patterns may be formed using one or more of the
following sub-patterns:
?(pattern-list)
Matches zero or one occurrence of the given patterns
*(pattern-list)
Matches zero or more occurrences of the given patterns
+(pattern-list)
Matches one or more occurrences of the given patterns
@(pattern-list)
Matches one of the given patterns
!(pattern-list)
Matches anything except one of the given patterns
だから:
rm -rfvi ./!(build)
この与えられたパターンを除くすべてを削除するように評価します。
答え4
find . \! -path ./build -do_something
については何もしませんが、./build
繰り返してその下のファイルと一致します。 findにディレクトリに移動しないように指示するには、アクションを渡します-prune
。
find . -path ./build -prune -o . -o -delete
「フルパスが次の場合は./build
巡回しないでください。そうでない場合は現在のディレクトリであれば何もしないでください。そうでない場合はファイルを削除してください。」