最近、特定のパターンに一致するものを除いて、ディレクトリ内のすべてのファイル/フォルダーを削除するタスクに直面しました。だから私は仕事をするために一行のunixコマンドを作り上げました。1行だけにする必要がありますか?私はそうではないと思いますが、それは間違いなくそのように涼しいです!
問題はかなり単純ですが、結局のところ、私のソリューションがどれほど複雑になっているかに少し驚いていました。これが私が使ったコマンドです。注:改行文字を含むファイル名を処理しないため、これは不適切なソリューションです(私の状況では問題ではありませんでした)。
ls | grep -v PATTERN | xargs -n1 -IREPLACE rm -rf REPLACE
PATTERNに一致するフォルダに再帰的に戻りたくないため、「find」コマンドを使用しませんでした。たとえば、次のファイル構造を考えます。
file_foo.txt
first_dir
|
+--> contents
+--> ...
foo_dir
|
+--> anotherfile.txt
+--> morefiles.log
foo_file.txt
somefile.txt
パターン "foo"を使用すると、 "first_dir"(もちろんその内容)と "somefile.txt"("anotherfile.txt"や "morefiles.log"ではない)のみが削除されます。
質問、これを達成するためのより優れた(よりエレガントで正しい)方法はありますか?
編集:
最近、「検索」がより良いオプションである可能性があることに私の注意が向けられました:
find * -maxdepth 0 ! -name PATTERN -print0 | xargs -0n1 rm -rf
このソリューションは、改行文字を含むパスを正しく処理します。