Jak mogę szybko usunąć folder z dużą ilością podfolderów?

15

Mam folder z 266778 podfolderami. Jak mogę go usunąć?

próbowałem

cd ~/.local/share/Trash/
sudo rm -rf *

ale to zajmuje dużo czasu. Po 1 minucie 25 sekundach w czasie rzeczywistym i 0,072 sekundach użytkownika usunął tylko 2500 folderów. W ten sposób usunięcie tego folderu potrwa ponad dwie godziny.

Czy istnieje szybszy sposób na usunięcie tego folderu? Dlaczego istnieje tak duża różnica między czasem użytkownika a czasem rzeczywistym?

real    1m25.474s
user    0m0.072s
sys     0m28.142s

Używam Linux 2.6.32 (Ubuntu 10.04.4 LTS).

Martin Thoma
źródło
Właśnie przejrzałem ten problem i wydaje się, że niektórzy ludzie odkryli, że rsync może być dość skutecznie używany jako narzędzie do „usuwania wielu plików”. To, czy naprawdę jest szybsze, zależy od ciebie.
Johan
2
Co jest warte: wydajność podczas usuwania wielu folderów / plików zależy w dużym stopniu od systemu plików. Z mojego doświadczenia wynika, że ​​różnica przy usuwaniu milionów małych plików na ext3 (powolnym) w porównaniu z XFS (szybkim) może wynosić kilka godzin.
pdo
Jeśli często masz ten przypadek i możesz planować z wyprzedzeniem, korzystając z systemu plików takiego jak btrfs i wykorzystując podwolumeny, możesz przyspieszyć wszystko, po prostu zrzucając to podwolumeny.
PlasmaHH
Tutaj znajdziesz odpowiedź. Perl jest najszybszy. unix.stackexchange.com/questions/37329/…
SDsolar

Odpowiedzi:

17

Jeśli twoja wersja polecenia „find” implementuje komendę -delete, możesz spróbować

find directory -delete

W tym przypadku:

find ~/.local/share/Trash/ -delete

Niektóre polecenia, takie jak rm, wykonują większość swojej pracy w jądrze. Dokładniej w procedurach systemu plików. Czas spędzony na wykonywaniu wywołań systemowych jest rozliczany w ten sposób, więc chociaż polecenie „rm” działa przez długi czas, nie wykonuje dużej pracy w obszarze użytkownika - wywołania systemowe wykonują większość pracy.

Johan
źródło
+1; chociaż to również usuwa katalog macierzysty i podejrzewam, że OP chciał tylko usunąć zawartość folderu Kosz, a nie sam folder
don_crissti
1
@don_crissti: dobra uwaga. jeśli OP chciał usunąć tylko podkatalogi w ~ / .local / share / Trash (a nie pliki na 1. poziomie), to: find ~/.local/share/Trash/*/ -delete (oczywiście spowoduje to również usunięcie plików (i katalogów) z dowolnego z tych Trash / * / subdirs również)
Olivier Dulac
2
+1 za wyjaśnienie dziwnego zachowaniatime
Martin Thoma
3
Czy find directory -deletenaprawdę jest szybszy niż rm -rf directory? W końcu wykonują tę samą pracę i nie ma na to dwóch sposobów.
Gilles „SO- przestań być zły”
1
@Johan find jest naprawdę szybki. Czy kiedykolwiek miałeś okazję znaleźć przyczynę?
Harshdeep
20

To zależy od twojej definicji postu . Odpowiedzi już tutaj dają dobre rozwiązanie do faktycznego usunięcia katalogów z systemu plików, ale jeśli naprawdę potrzebujesz zwolnić nazwę katalogu tak szybko, jak to możliwe, zmiana nazwy w tym samym systemie plików jest natychmiastowa:

{ mv directory directory.gone && rm -rf directory.gone; } &

Technicznie jest to oszustwo, ponieważ nie przyspieszyłem faktycznego usunięcia, ale praktycznie jest to bardzo przydatne: używam tej sztuczki przez cały czas, więc nie muszę czekać na powolne usuwanie.

kojiro
źródło
Świetny. Jaki jest twój przykład użycia, aby to robić cały czas? Jeśli często to robisz, czy nie ma niebezpieczeństwa, że ​​zalegniesz, zdobędziesz wiele plików „directory.gone” i zakończysz się niepowodzeniem? Zakładam, że używasz sufiksu typu „$$” lub „% (data ...)”
smci
1
Gdybym tego potrzebował, prawdopodobnie mógłbym użyć mktemp z argumentami, które zapewnią, że pozostanie w tym samym systemie plików. Ale nie mogę powiedzieć, że mam teraz konkretny przykład.
kojiro
kojiro tak, dziękuję, mktempto jest to , co próbowałem zapamiętać ...
smci
1

rm -rf directorylub rm -rf *oczywiście jest to najszybsza metoda, chyba że lokalna rmimplementacja jest zepsuta.

Korzystanie findnie daje żadnych korzyści.

To, czy jest to szybkie czy wolne, zależy głównie od systemu plików i implementacji systemu operacyjnego. Pytanie wydaje się więc niewłaściwe.

UFS i ZFS w systemie Solaris są znane z tego, że są bardzo szybkie w tego rodzaju zadaniach, ponieważ obie implementacje systemu plików zawierają opóźniony kod usuwania tła, który powoduje, że wywołania unlink()i rmdir()zwracają się szybko, nawet jeśli powiązany obiekt zajmie w sumie więcej czasu.

Dzięki opóźnionemu usuwaniu tła w jądrze aktualizacje katalogu mogą być również wykonywane szybko, co pomaga przyspieszyć całą operację.

schily
źródło
Chociaż można wybaczyć, że tak jest, to tak naprawdę nie jest to prawdą, jak opisuje ta odpowiedź .
Hitechcomputergeek,
0

To tylko częściowa odpowiedź, rzucająca światło na trzy wartości zwracane przez polecenie; cytowane ze time(1)strony :

(i) upłynął w czasie rzeczywistym między wezwaniem i zakończenia, (ii) czas CPU użytkownika (sumy tms_utimei tms_cutimewartości w struct tmszwracanego przez times(2)) oraz (iii) czas procesora systemu (sumą tms_stimei tms_cstimewartości w struct tmsw postaci zwróconej przez times(2)) ”.

schaiba
źródło