親ディレクトリ内のすべての空のファイルとディレクトリを再帰的にクリーンアップするにはどうすればよいですか?
次のようなディレクトリ構造があるとします:
Parent/
|____Child1/
|______ file11.txt (empty)
|______ Dir1/ (empty)
|____Child2/
|_______ file21.txt
|_______ file22.txt (empty)
|____ file1.txt
最終的には次のようになるはずです:
Parent/
|____Child2/
|_______ file21.txt
|____ file1.txt
答え1
これは本当にシンプルなワンライナーです:
find Parent -empty -delete
かなり自明です。しかし、確認してみると、Parent/Child1 が正常に削除されていることに驚きました。通常は、 を指定しない限り、子の前に親が処理されると予想されます-depth
。
-delete
これはを意味するため機能します-depth
。GNU find マニュアル:
-delete
ファイルを削除します。削除が成功した場合は true になります。削除に失敗した場合は、エラー メッセージが発行されます。-delete が失敗した場合、find の終了ステータスは 0 以外になります (最終的に終了する場合)。-delete を使用すると、-depth オプションが自動的にオンになります。
これらの機能は、POSIX 標準、しかし、多くのLinuxディストリビューションではおそらく存在するでしょう。Alpine Linuxのような小規模なディストリビューションでは、特定の問題が発生する可能性があります。ビジーボックスをサポートしていません-empty
。
非標準を含む他のシステムには-empty
、-delete
BSDA のそしてOSXしかし、どうやらそうではないようだエイエックス。
答え2
2つのコマンドで解決できる
空のファイルを削除する
find Parent/ -type f -size 0 -delete
削除してみてください全てディレクトリ
find Parent/ -type d -depth -print0 | xargs -0 rmdir 2>/dev/null
NBはrmdir
空でないディレクトリを削除できないため、実行しても安全ですが、エラーが発生します。これは非表示になっています。
上記と同じですが、無視されるエラー メッセージについてもう少し具体的に説明します。メッセージがディストリビューションによって異なる場合は修正する必要があるかもしれません。
find Parent/ -type d -depth -print0 | xargs -0 rmdir 2>&1 \
| grep -iv "Directory not empty$"