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 find マニュアル:

-deleteファイルを削除します。削除が成功した場合は true になります。削除に失敗した場合は、エラー メッセージが発行されます。-delete が失敗した場合、find の終了ステータスは 0 以外になります (最終的に終了する場合)。-delete を使用すると、-depth オプションが自動的にオンになります。


これらの機能は、POSIX 標準、しかし、多くのLinuxディストリビューションではおそらく存在するでしょう。Alpine Linuxのような小規模なディストリビューションでは、特定の問題が発生する可能性があります。ビジーボックスをサポートしていません-empty

非標準を含む他のシステムには-empty-deleteBSDA のそして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$"

答え3

次のツールを使用してこれを行うこともできますfd:

fd -t e -x rm -r

https://github.com/sharkdp/fd

関連情報