Toto je opravdu jednoduchá vložka:
find Parent -empty -delete
Je to docela samovysvětlující. I když při kontrole jsem byl překvapen, že úspěšně smaže Parent/Child1. Obvykle byste očekávali, že zpracuje rodiče před potomkem, pokud nezadáte -depth
.
Toto funguje, protože -delete
znamená -depth
. Viz příručka GNU find:
-delete
Vymazat soubory; true, pokud bylo odstranění úspěšné. Pokud se odstranění nezdařilo, zobrazí se chybová zpráva. Pokud -delete selže, bude návratový stav find nenulový (když nakonec skončí). Použití -delete automaticky zapne volbu -depth.
Všimněte si, že tyto funkce nejsou součástí Posix Standardu, ale s největší pravděpodobností tam budou v mnoha distribucích Linuxu. Můžete mít specifický problém s menšími, jako je Alpine Linux, protože jsou založeny na Busybox, který nepodporuje -empty
.
Jiné systémy, které obsahují nestandardní -empty
a -delete
zahrnují BSD a OSX, ale zjevně ne AIX.
Zde je řešení se dvěma příkazy
Smažte prázdné soubory
find Parent/ -type f -size 0 -delete
Zkuste odstranit vše adresáře
find Parent/ -type d -depth -print0 | xargs -0 rmdir 2>/dev/null
NB rmdir
nemůže odstranit neprázdné adresáře, takže je bezpečný, ale způsobí chyby, které skrýváme
Jako výše, ale trochu konkrétnější ohledně ignorování chybových zpráv. Pokud se zpráva v různých distribucích liší, možná bude potřeba upravit.
find Parent/ -type d -depth -print0 | xargs -0 rmdir 2>&1 \
| grep -iv "Directory not empty$"
Můžete to udělat také pomocí fd
nástroj:
fd -t e -x rm -r
https://github.com/sharkdp/fd