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.)?
Możesz spróbować odłączyć i-węzeł dla katalogu, ale to dałoby ci cały ładunek sierocych plików, które fscksię 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.
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.
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. ;-)
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 :).
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ą.
Odpowiedzi:
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
wyś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ówrm
. Następnierm
musi 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łarm
raz 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ć,-delete
która używa wewnętrznegounlink
wywołania do jądra (podobnie jakrm
robi), ale na początku będzie to działać tylko dla plików.Powtarzam, chyba że wrzucisz dysk do ciekłej gorącej magmy,
rm
jest 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.źródło
unlink
wywołania systemowego w katalogach (pojawi sięEISDIR
błąd), więc pierwsza opcja nie jest możliwa.mv
między różnymi systemami plików / partycjami oznacza,cp
po których następujerm
./tmp
jest w tym samym systemie plików, zastanawiam się, czymv
i ponowne uruchomienie byłoby szybsze? Nie jestem pewien, czy mimo wszystko/tmp
zostanie wyczyszczonyrm
.rsync
w tym przypadku test jest szybszy niżrm -rf
: web.archive.org/web/20130929001850/http://linuxnote.net/…Czasami
find $DIR_TO_DELETE -type f -delete
jest 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
,mkfs
i ponowniemount
.źródło
type -f
ma oznaczać pliku, a nie katalogu? dodawanie-print
pokazuje również pliki, które są usuwane.Jeśli nie potrzebujesz wolnego miejsca, najszybszym sposobem jest opóźnienie usunięcia i zrób to w tle:
Następnie wybierz crontab, który robi to w tle, w cichym czasie, z niskim poziomem wejścia / wyjścia:
Uwagi:
Aktualizacja: Znalazłem fajną sztuczkę, aby uruchomić wiele rm równolegle - to pomoże, jeśli masz dużą macierz dyskową:
-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
źródło
find target_dir -maxdepth 3 -depth -type d -print0 | xargs -0 -P 5 rm -rf
. Ta-depth
opcja mówi,find
aby najpierw wyświetlić listę dzieci.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 :).
źródło
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
mkfs
i 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ą.źródło