このシナリオをテストしようとしていますが、次のファイルがあります。
/encoded
encode <~~~ a bash script
/dir1
/dir2
.../dir2-sub
test.meta
私が望むのは、find
現在の(除外)エンコーディングのすべてのディレクトリを検索してすべてを削除することです。
結局このスクリプトを使うようになりました。
find . -name encoded -prune -o -maxdepth 10 ! -name 'encode*' ! -name '.*' | xargs rm -rf
私が考えるのは、フォルダを表示してencoded
から-prune
無視することです。そうですか?その後、拡張されていない他の項目についてはそれを削除して(これを行うと、すべてのディレクトリが保証されます)rm
ところで問題は…拡張子のないbashスクリプトもあって結局削除されましたね。
私のBashスクリプトが上記のものとまったく同じ構造を持つことを望みます。 (ディレクトリ以外のすべてのファイルはそのままにして、/encodedフォルダとその内容に触れず、エンコードされたbashスクリプトを削除しないでください。)
/encoded
encode <~~~ a bash script
test.meta
上記の結果をどのように取得できますか?
ベストアンサー1
これを行うためにディレクトリを繰り返し列挙する必要はありませんrm -rf
。削除する最上位ディレクトリだけを一覧表示します。ディレクトリエントリがファイルではなくディレクトリであることを確認するには、のテストを使用するのがfind
良い指標ではありません。-type d
.
これはあなたが助けるでしょう:
find * -maxdepth 0 ! -name encoded -type d -print0 | xargs -0 rm -rf
これは、現在のディレクトリ内のすべてのエントリから始まり(リストを避けるため.
)、名前付きのすべてのエントリを削除し、ディレクトリのみをencoded
残し、nullを区切り文字として結果を出力し、結果をxargs
Give toに提供しますrm -rf
。このバリアントを実行する前に、以下を試してください。
find * -maxdepth 0 ! -name encoded -type d
出力が予想と一致することを確認してください。
-prune
一致を無視するのではなく、一致に陥るのを防ぐため、この例ではリストを続けてからencoded
testでフィルタリングします-name
。