W jaki sposób rm -r zajmuje się rekurencyjnym usuwaniem? W jakiej kolejności?


30

Czy jest jakaś kolejność operacji rm? Wystąpiłem rmw dużym katalogu i jestem ciekawy, gdzie powinienem sprawdzić, co mogło zostać usunięte. Czy rmnajpierw działa na plikach, a potem na katalogach? A może opiera się na niektórych informacjach w tabeli i-węzłów?

Specyfikacja: rm z systemu GNU coreutils 8.22: Arch Linux działający na systemie plików beagleboneblack działający na zewnętrznym dysku twardym Seagate (ext4) korzystał z USB 2.0.

Historia:

Przeprowadziłem czyszczenie katalogu i wykonałem

cp -r A/ B/ C/ Dest/

Nieświadomie podążyłem za tym

rm -r A/ B/ C/ Dest/

kiedy chciałem po prostu występować

rm -r A/ B/ C/

Złapałem to i wcisnąłem Ctrl+, Czanim minęło zbyt wiele czasu. W szczególności było to <3 sekundy, ponieważ korzystałem z timepolecenia w połączeniu z rm& cp. Wszedłem i zbadałem, Dest/spodziewając się, że nie będzie on istniał, ale oto był cały i wydawało się, że nie ma na niego wpływu. Jest to nieco zaskakujące, ponieważ A/ B/ C/były dość małe. Może w sumie 100–200 MB. Dest/jest jednak po prostu nieśmiały 1 TB. Wykonanie lsna Dest / pokazało, że na obu końcach alfabetu były zarówno pliki, jak i katalogi (np. AFile.txt.... .... Zoo.txt).

Czy miałam szczęście i anulowałam to, rmco spowodowało spustoszenie w moim katalogu Dest /? Czy to rmnaprawdę takie powolne (na szczęście!)?

Jeśli nie, w jaki sposób można rmrekurencyjnie usuwać takie rzeczy, że mogę zgadnąć, co mogło zostać utracone?

Naprawdę nie oczekuję, że odzyskam to, co mogłem stracić, po prostu ciekawy, co potencjalnie zostało zdmuchnięte.


Odpowiedzi:


34

rm -rdziała kolejno na każdy z jego argumentów. Jeśli argument jest katalogiem, wyświetla katalog (z funkcjami opendiri readdirlub inną równoważną metodą) i działa kolejno na każdym wpisie. Jeśli pozycja jest katalogiem, rekursywnie bada ją.

To jest dokładnie ten sam sposób, że inne aplikacje używają do katalogów przemieszczenia rekurencyjnie - find, ls -Rfitp

Kolejność przejścia jest nieprzewidywalna. W większości systemów plików kolejność jest odtwarzalna, dopóki żaden plik nie jest dodawany, usuwany ani zmieniany jego nazwa w katalogu (kolejność może teoretycznie być całkowicie losowa i zmieniać się za każdym razem, ale nie mogę wymyślić systemu plików, w którym to się dzieje). W niektórych systemach plików kolejność można ogólnie wywnioskować z nazw plików lub z kolejności, w której pliki zostały utworzone, lub z kombinacji obu, ale musisz znać dokładne szczegóły systemu plików, i może się różnić w zależności od wersja sterownika. Kolejność przechodzenia nie jest czymś, na czym można polegać.

Zauważ, że lslub echo *posortuj pliki w porządku leksykograficznym według ich nazw. findi ls -fnie sortuj.

Jedyną rzeczą, na której możesz polegać, jest to, że argumenty są obsługiwane w kolejności. Więc jeśli C/nadal był częściowo obecny, oznaczałoby to, że Dest/był nietknięty. Jeśli go C/nie ma, możesz dowiedzieć się, gdzie pliki zostały usunięte Dest/, sprawdzając czasy modyfikacji katalogu i porównując je z czasem C/usunięcia lub czasem zakończenia kopiowania. Pierwszym plikiem, który należy usunąć, może być plik bezpośrednio w Dest/hierarchii lub gdzieś głęboko w hierarchii, w zależności od tego, czy pierwszy wpis w Dest/tym pliku, który rmsię przechodził, był katalogiem, czy nie.

Szybkość rmzależy głównie od liczby plików do usunięcia. Bardzo duży plik wymaga zauważalnego wpływu na czas usuwania. Większość pracy polega na usuwaniu kolejno każdej pozycji katalogu. Dane pliku nie są usuwane, usuwanie zawartości pliku wymaga jedynie oznaczenia bloków, których używał jako wolnych, co jest stosunkowo szybkie.


2
-fOpcja lsjest udokumentowana jako równoważne -aU, gdzie -alista Środki wszystkie pliki i -Uelementy sortowane. Niejasno pamiętam napotkanie wersji, lsw której -fnie działała (myślę, że została zdefiniowana jako coś innego), ale działała -aU.
G-Man mówi „Reinstate Monica”

2
@ G-Man POSIX definiuje -f(jako rozszerzenie XSI ); w rzeczywistości ma inne skutki poza nieposortowane. Wraca do wersji 7, więc trudno byłoby znaleźć implementację bez niej oprócz, co dziwne, BusyBox. -Upo prostu nieposortowane jest cechą GNU, nie sądzę, żeby istniała gdzie indziej.
Gilles „SO- przestań być zły”


@Tim Nie. Możesz przetestować, uruchamiając ls -Uw katalogu. Jest to ta sama kolejność, rm -rktóra działałaby w tym katalogu. Pamiętaj, że dodanie lub usunięcie pliku może zmienić kolejność innych plików.
Gilles „SO- przestań być zły”

Dzięki. (1) „dodanie lub usunięcie pliku może zmienić kolejność innych plików.”, Więc po przypadkowym częściowym usunięciu ls -Unie pomaga dowiedzieć się, czy pozostałe katalogi pozostały nietknięte? (2) -U oznacza „pozycje listy w kolejności katalogów”. Czy -U oznacza kolejność wpisów do katalogu w katalogu?
Tim

5

Jak mówi Gilles, ogólnie nie można przewidzieć kolejności usuwania w katalogu, tylko że katalogi najwyższego poziomu będą przetwarzane w kolejności w wierszu poleceń.

Jednak masz również gwarancję, że usunie hierarchie katalogów od podstaw, ponieważ Unix pozwala na usuwanie katalogów tylko wtedy, gdy są puste. Aby więc usunąć katalog, musi on najpierw usunąć wszystko z niego. Jeśli zawiera podkatalogi, musi najpierw usunąć ich zawartość i tak dalej.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.