Czy istnieje szybszy sposób na usunięcie katalogu niż „rm -rf”?

32

Mam folder z wieloma plikami, a wykonanie polecenia „rm -rf” zajmuje dużo czasu. Czy istnieje szybszy sposób na usunięcie katalogu i jego zawartości (podkatalogów itp.)?

Mohammad Moghimi
źródło
Dla wszystkich zainteresowanych patrz: slashroot.in/comment/1286#comment-1286 znajdź atuty perl
trumps

Odpowiedzi:

33

Możesz spróbować odłączyć i-węzeł dla katalogu, ale to dałoby ci cały ładunek sierocych plików, które fsck się przewracają.

rm jest tak dobre, jak to możliwe.


Kilka osób wspomina o przypadkach, w których niektóre rzeczy są szybsze od innych. Ale upewnijmy się, że porównujemy najlepsze wersje tych samych rzeczy.

Jeśli chcesz usunąć katalog i wszystko w nim, sugeruję ci:

rm -rf path/to/directory

rmwyświetli wewnętrznie listę plików i katalogów, które zamierza usunąć. I to wszystko w skompilowanej C . To dwa powody, dla których jest najszybszy.

To bardzo wyraźnie nie to samo, rm -rf path/to/directory/*co rozszerzy się na poziomie powłoki i przekaże do niej mnóstwo argumentów rm. Następnie rmmusi je przeanalizować, a następnie powrócić do każdego z nich. To dużo wolniej.

Podobnie jak „benchmark”, który porównuje, find path/to/directory -exec {} \;jest nonsensem. Działa rmraz na znaleziony plik. Tak wolno. Znajdź argumenty budujące polecenia w stylu xargs, -exec rm {} +ale jest to tak samo powolne jak ekspansja. Możesz zadzwonić, -deletektóra używa wewnętrznego unlinkwywołania do jądra (podobnie jak rmrobi), ale na początku będzie to działać tylko dla plików.

Powtarzam, chyba że wrzucisz dysk do ciekłej gorącej magmy, rmjest królem .


W powiązanej notatce różne systemy plików usuwają rzeczy w różnym tempie ze względu na ich strukturę. Jeśli robisz to regularnie, możesz chcieć przechowywać te pliki na partycji sformatowanej w XFS, która dość szybko radzi sobie z usuwaniem.

Lub użyj szybszego dysku. Jeśli masz mnóstwo pamięci RAM, użycie /dev/shm(dysku RAM) może być pomysłem.

Oli
źródło
W rzeczywistości nie można użyć unlinkwywołania systemowego w katalogach (pojawi się EISDIRbłąd), więc pierwsza opcja nie jest możliwa.
James Henstridge
Czy mv to / tmp będzie szybszy? Wygląda na to, że mv również zajmuje dużo czasu.
Mohammad Moghimi
@MohammadMoghimi: przechodzenie mvmiędzy różnymi systemami plików / partycjami oznacza, cppo których następuje rm.
enzotib
3
@enzotib Jeśli jednak /tmpjest w tym samym systemie plików, zastanawiam się, czy mvi ponowne uruchomienie byłoby szybsze? Nie jestem pewien, czy mimo wszystko /tmpzostanie wyczyszczony rm.
Sparhawk
1
rsyncw tym przypadku test jest szybszy niż rm -rf: web.archive.org/web/20130929001850/http://linuxnote.net/…
schmijos
11

Czasami find $DIR_TO_DELETE -type f -deletejest szybszy niż rm -rf.

Możesz także spróbować mkdir /tmp/empty && rsync -r --delete /tmp/empty/ $DIR_TO_DELETE.

W końcu, jeśli trzeba usunąć zawartość całej partycji, najszybciej będzie prawdopodobnie umount, mkfsi ponownie mount.

mivk
źródło
1
nie type -fma oznaczać pliku, a nie katalogu? dodawanie -printpokazuje również pliki, które są usuwane.
leetbacoon
8

Jeśli nie potrzebujesz wolnego miejsca, najszybszym sposobem jest opóźnienie usunięcia i zrób to w tle:

  • mkdir .delete_me
  • mv big-directory-that-i-want-gone .delete_me

Następnie wybierz crontab, który robi to w tle, w cichym czasie, z niskim poziomem wejścia / wyjścia:

3 3 * * * root ionice -c 3 nice find /path/to/.delete_me -maxdepth 1 ! -name \. -exec echo rm -rf "{}" +

Uwagi:

  • sprawdź swoją moc wyjściową przed usunięciem echa w crontab!
  • katalog .delete_me musi znajdować się w tym samym systemie plików - na wypadek, gdyby nie było to oczywiste dla wszystkich.

Aktualizacja: Znalazłem fajną sztuczkę, aby uruchomić wiele rm równolegle - to pomoże, jeśli masz dużą macierz dyskową:

ionice -c 3 nice find target_directory -depth -maxdepth 3 | xargs -d \n -P 5 -n 5 rm -rf
  • -depth, aby wykonać pierwszy ruch na głębokości.

  • -maxdepth, aby ograniczyć głębokość przechodzenia przez katalog, abyśmy nie słuchali pojedynczych plików.

  • -d \ n do obsługi spacji w nazwach plików.

  • -P i -n obsługuje stopień równoległości (sprawdź stronę podręcznika).

ref: http://blog.liw.fi/posts/rm-is-too-slow/#comment-3e028c69183a348ee748d904a7474019

Aktualizacja 2 (2018): Z ZFS dostarczonym z Ubuntu 18.04 używam go do wszystkiego i utworzę nowy zestaw danych dla każdego dużego projektu. Jeśli planujesz z wyprzedzeniem i zrobisz to wcześniej, możesz po prostu „zfs zniszczyć” system plików, gdy skończysz. ;-)

Użyłem instrukcji z wiki zfsonlinux, aby zainstalować Ubuntu na ZFS natywnie: https://github.com/zfsonlinux/zfs/wiki/Ubuntu-18.04-Root-on-ZFS

Lester Cheung
źródło
2
Zamiast tego ostatniego polecenia użyj find target_dir -maxdepth 3 -depth -type d -print0 | xargs -0 -P 5 rm -rf. Ta -depthopcja mówi, findaby najpierw wyświetlić listę dzieci.
muru,
2

Myślę, że problem polega na tym, że nie ma idealnego sposobu na usunięcie bardzo dużego katalogu i całego zestawu treści bez prawdziwego systemu indeksowania plików, który rozumie rozłączanie i nie oznacza, że ​​myśli, że brakuje mu plików FSAK. Musi być zaufanie.

Na przykład mam zoneminder biegający po polu golfowym. Skonstruowałem rajd linuksowy o pojemności 1,5 TB, aby poradzić sobie z ogromną ilością danych, które przechwytuje w ciągu dnia (12 kanałów z kamery), jak działa na dysku 120 GB jest poza mną. Krótko mówiąc, folder dla wszystkich przechwyconych danych zajmuje około 1,4 TB jej pamięci. Wiele do oczyszczenia

Ponowna instalacja ZM i wyczyszczenie starej biblioteki o pojemności 1,4 TB nie jest przyjemnością, ponieważ usunięcie starych zdjęć może potrwać 1–2 dni.

Prawdziwie zindeksowany FS pozwala na usunięcie katalogu i wie, że dane w nim zawarte są martwe, a zerowanie danych jest stratą naszego czasu i zasobów komputera. Powinna być opcja zerowania usuniętych danych. RM po prostu trwa długo w prawdziwym świecie na ext4.

Odpowiedź: Rekurencyjne odłączanie wszystkich plików byłoby nieznacznie szybsze, ale nadal musiałbyś przeznaczyć czas na uruchomienie FSCK.

Utwórz skrypt uruchamiający rekurencyjne polecenie „FOR”, które może „odłączyć” wszystkie pliki w twoich folderach, a następnie po prostu rm lub rmdir wszystkie foldery, aby go wyczyścić. Ręcznie uruchom FSCK, aby wyzerować resztę danych, gdy jest to wygodne. Trochę leniwy nie wypisałem tego przepraszam :).

Adam Lazo
źródło
0

Chociaż nie jest to przydatne, jeśli chcesz wyczyścić istniejący katalog, wspomnę, że możliwą strategią, jeśli wiesz, że będziesz mieć katalog z dużą ilością plików, które będziesz musiał regularnie czyścić, jest umieszczenie katalogu we własnym systemie plików ( np. partycja). Następnie, gdy musisz go wyczyścić, odmontuj go, uruchom mkfsi ponownie zainstaluj. Na przykład OpenBSD zaleca to zrobić w przypadku/usr/obj , gdy wiele plików jest tworzonych podczas kompilacji systemu i należy je usunąć przed następną kompilacją.

fkraiem
źródło