Kiedy używam
find /home/user/parentdir -type d -empty -delete
szuka rekurencyjnie pustych podfolderów wewnątrz /home/user/parentdir
i usuwa je. Ale jeśli /home/user/parentdir
jest również pusty, usuwa również parentdir
folder, co jest dla mnie niepożądane.
Chcę zachować to parentdir
w rsync
niektórych plikach do utworzenia kopii zapasowej lub w chmurze. Po przetworzeniu muszę usunąć puste foldery, ale ich odtwarzanie za parentdir
każdym razem wydaje się bezproduktywne .
Wszelkie sugestie do zachowania parentdir
? Myślałem o utworzeniu w nim .nocopy
pliku i wykluczeniu go rsync
, ale wygląda to na przesadę. Czy istnieje bardziej elegancki sposób?
command-line
bash
rsync
find
TNT
źródło
źródło
-mindepth 1
?Odpowiedzi:
Po prostu zrób
find /home/user/parentdir -mindepth 1 -type d -empty -delete
.Popatrz:
Odpowiedź
find /home/user/parentdir/*
w AmourK jest niepożądana, gdy jest dużo plików i jest nadmiernie skomplikowana.źródło
Dodając
/*
do końcaparentdir
, wykonujesz akcję na wszystkich podkatalogach parentdir, a nie naparentdir
sobie. I w ten sam sposób/home/user/
nie zostanie usunięty ze starego polecenia,parentdir
nie zostanie usunięty z polecenia poniżej.*
jest nazywany operatorem globalnym i pasuje do dowolnego ciągu znaków.find /home/user/parentdir/* -type d -empty -delete
źródło
/home/user/parentdir/
, rozwinięty glob może przekroczyćARG_MAX
, co powoduje, że lista argumentów jest zbyt długa . Możesz zmniejszyć ryzyko takiego zdarzenia, zmieniając glob na*/
tak, aby pasował tylko do katalogów./tmp
, utworzeniu podkatalogu, rozpakowaniu tam skompresowanego archiwum, uruchomieniu instalatora i oczyszczeniu. Nowicjusz pomyślał, żerm -rf /tmp/foo-install
jest to właściwy sposób, a doświadczona ręka powiedziała „Noooooo” w swoim najlepszym wrażeniu Darth-Vadera na końcu odcinka III, newb dowiedział się, jak blisko jest / i klawisze Enter były do siebie. Musieliśmy uruchomić system z dysku przywracania oprogramowania do tworzenia kopii zapasowych i ponownie załadować cały serwer z taśmy.jeśli masz zainstalowane php-cli,
źródło
foreach (RecursiveIteratorIterator(RecursiveDirectoryIterator($dir)) as $p) if (empty($skipped)) $skipped = TRUE; elseif ($p->isDir()) @rmdir($p->getPathname());
lub coś podobnego.$skipped
zajmuje się pomijaniem pierwszego,@rmdir
próbuje usunąć katalog i po cichu (to jest @) kończy się niepowodzeniem, jeśli nie jest puste.Gdy potrzebujesz tylko jednego poziomu (pozostawienie folderu nadrzędnego, ale usunięcie pustych folderów podrzędnych), możesz zastosować łatwą sztuczkę
rmdir
.Usuwa wszystkie puste podfoldery, ale drukuje tylko błąd plików i niepustych folderów.
Nie działa to rekurencyjnie, ale znajomość struktury folderów może być najszybszym sposobem na zrobienie czegoś takiego
Zaleta: łatwy do zapamiętania, szybki w pisaniu, mały potencjał wyboru niewłaściwego parametru.
Wada: mniej elastyczny, prawdopodobnie dużo komunikatów o błędach w twoim terminalu.
źródło