
親ディレクトリのすべての空のファイルとディレクトリを再帰的にクリーンアップする方法は?
次のディレクトリ構造があるとします。
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検索マニュアル:
-delete
ファイルを削除します。削除に成功した場合はtrueです。削除に失敗すると、エラーメッセージが表示されます。 -deleteが失敗した場合、findの終了ステータスは0ではありません(最後に終了したとき)。 -delete を使用すると、-deep オプションが自動的にオンになります。
これらの機能は以下の一部ではありません。POSIX規格しかし、多くのLinuxディストリビューションに存在する可能性が高いです。 Alpine Linuxなどの小規模Linuxでは、特定の問題が発生する可能性があります。忙しい箱サポートしていません-empty
。
他のシステムには非標準システムが含まれ、以下が-empty
含ま-delete
れます。BSDそしてOSXしかし明らかにそうではありませんAIX。
答え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$"