Linuxで空のファイルとディレクトリの両方を再帰的に削除する方法は?

Linuxで空のファイルとディレクトリの両方を再帰的に削除する方法は?

親ディレクトリのすべての空のファイルとディレクトリを再帰的にクリーンアップする方法は?

次のディレクトリ構造があるとします。

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これは意味するので有効です-depthGNU検索マニュアル:

-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$"

答え3

fdこのツールを使用して、次のこともできます。

fd -t e -x rm -r

https://github.com/sharkdp/fd

関連情報