web-dev-qa-db-ja.com

Linuxですべての空のファイルとディレクトリを再帰的に削除するにはどうすればよいですか?

親ディレクトリ内のすべての空のファイルとディレクトリを再帰的にクリーンアップするにはどうすればよいですか?

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

Parent/
  |____Child1/
        |______ file11.txt (empty)
        |______ Dir1/ (empty)

  |____Child2/
        |_______ file21.txt
        |_______ file22.txt (empty)

  |____ file1.txt

私はこれで終わるはずです:

Parent/
  |____Child2/
        |_______ file21.txt

  |____ file1.txt
15
mohammed wazeem

これは本当にシンプルなワンライナーです:

find Parent -empty -delete

それはかなり自明です。チェックしたところ、Parent/Child1が正常に削除されたことに驚きました。通常、-depthを指定しない限り、子より先に親を処理することが期待されます。

これは、-delete-depthを意味するため機能します。 GNU findマニュアル を参照してください:

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


これらの機能は Posix Standard の一部ではありませんが、多くのLinuxディストリビューションでは存在する可能性が高いことに注意してください。 Alpine Linuxなどの小さな問題は Busybox に基づいているため、-emptyをサポートしていないため、特定の問題が発生する場合があります。

非標準の-emptyおよび-deleteを含む他のシステムには、 [〜#〜] bsd [〜#〜] および [〜#〜] osx [が含まれます〜#〜] だが、明らかに [〜#〜] aix [〜#〜]

35
Philip Couling

ここに2つのコマンドソリューションがあります

空のファイルを削除する

find Parent/ -type f -size 0 -delete

allディレクトリを削除してみてください

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

これは、fdツールでも実行できます。

fd -t e -x rm -r

https://github.com/sharkdp/fd

2
Steven Penny