親ディレクトリ内のすべての空のファイルとディレクトリを再帰的にクリーンアップするにはどうすればよいですか?
次のディレクトリ構造があるとします。
Parent/
|____Child1/
|______ file11.txt (empty)
|______ Dir1/ (empty)
|____Child2/
|_______ file21.txt
|_______ file22.txt (empty)
|____ file1.txt
私はこれで終わるはずです:
Parent/
|____Child2/
|_______ file21.txt
|____ file1.txt
これは本当にシンプルなワンライナーです:
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 [〜#〜] 。
ここに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$"