作業ディレクトリ内のすべてのディレクトリ(「エンコードされた」を除く)を見つけて、すべて削除します。

作業ディレクトリ内のすべてのディレクトリ(「エンコードされた」を除く)を見つけて、すべて削除します。

このシナリオをテストしようとしていますが、次のファイルがあります。

/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を区切り文字として結果を出力し、結果をxargsGive toに提供しますrm -rf。このバリアントを実行する前に、以下を試してください。

find * -maxdepth 0 ! -name encoded -type d

出力が予想と一致することを確認してください。

-prune一致を無視するのではなく、一致に陥るのを防ぐため、この例ではリストを続けてからencodedtestでフィルタリングします-name

おすすめ記事