bash で find を使用して拡張子パターンに基づいてファイルを操作する

bash で find を使用して拡張子パターンに基づいてファイルを操作する

私は「find」コマンドを使用して、コマンドを実行しているディレクトリにあるすべてのサブフォルダーから、指定された拡張子の不要なファイルをいくつか削除しています。

find -type f -name *.txt -delete
find -type f -name *.xml -delete
find -type f -name *.pdbqt -delete
find -type f -name *.txt -delete

これら 4 つのコマンドを 1 つに組み合わせて、1 つのコマンドで 4 種類のファイルを削除することは可能ですか? 代わりに、find を使用して、*.dlg 拡張子に属さないすべてのファイルを削除することは可能ですか?

答え1

引用符なし*.txtはダメです。findユーティリティはワイルドカードを使用するとすべてのファイルを出力しない

これら 4 つのコマンドを 1 つにまとめることは可能ですか?

はい。find複数のコマンドを1つにまとめる

find . \( -name '*.txt' -o -name '*.xml' -o -name '*.pdbqt' \) …

(4 番目のコマンドは 1 番目のコマンドを複製するため、同じパターンを 2 回使用しても意味がないため、3 つのパターンを使用します。)

find拡張子に属さないすべてのファイルを削除するために、代わりに を使用することは可能ですか*.dlg?

はい(すべてのファイルではなく、通常のファイルが必要なのだと思います)ファイル):

find . -type f ! -name '*.dlg'        # -delete

上記のコマンドで本当に削除したいファイルが出力される場合は、#削除して実行してください。

テスト! -name '*.dlg'は否定されます。が失敗する-name '*.dlg'場合にのみ成功します。-name '*.dlg'

-delete質問で使用しましたので、find明らかにサポートしています。権限の少ないユーザーfindfind: -exec rm {} \;vs. -delete- なぜ前者が広く推奨されているのでしょうか?

あなたの場合、 bare はfindのように動作することに注意してください。の実装によっては、コマンド ラインに少なくとも 1 つのパスが必要なので、を明示的にfind .使用しました。find .find

関連情報