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.)?
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.)?
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 -rf path/to/directory
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ów rm
. Następnie rm
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ła rm
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ętrznego unlink
wywołania do jądra (podobnie jak rm
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.
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ępuje rm
.
/tmp
jest w tym samym systemie plików, zastanawiam się, czy mv
i ponowne uruchomienie byłoby szybsze? Nie jestem pewien, czy mimo wszystko /tmp
zostanie wyczyszczony rm
.
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 ponownie mount
.
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:
3 3 * * * root ionice -c 3 nice find /path/to/.delete_me -maxdepth 1 ! -name \. -exec echo rm -rf "{}" +
Uwagi:
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
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 :).
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ą.