Czy jest jakaś kolejność operacji rm
? Wystąpiłem rm
w dużym katalogu i jestem ciekawy, gdzie powinienem sprawdzić, co mogło zostać usunięte. Czy rm
najpierw 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 time
polecenia 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 ls
na 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, rm
co spowodowało spustoszenie w moim katalogu Dest /? Czy to rm
naprawdę takie powolne (na szczęście!)?
Jeśli nie, w jaki sposób można rm
rekurencyjnie 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:
rm -r
działa kolejno na każdy z jego argumentów. Jeśli argument jest katalogiem, wyświetla katalog (z funkcjamiopendir
ireaddir
lub 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 -Rf
itpKolejność 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
ls
lubecho *
posortuj pliki w porządku leksykograficznym według ich nazw.find
ils -f
nie 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, żeDest/
był nietknięty. Jeśli goC/
nie ma, możesz dowiedzieć się, gdzie pliki zostały usunięteDest/
, sprawdzając czasy modyfikacji katalogu i porównując je z czasemC/
usunięcia lub czasem zakończenia kopiowania. Pierwszym plikiem, który należy usunąć, może być plik bezpośrednio wDest/
hierarchii lub gdzieś głęboko w hierarchii, w zależności od tego, czy pierwszy wpis wDest/
tym pliku, któryrm
się przechodził, był katalogiem, czy nie.Szybkość
rm
zależ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.źródło
-f
Opcjals
jest udokumentowana jako równoważne-aU
, gdzie-a
lista Środki wszystkie pliki i-U
elementy sortowane. Niejasno pamiętam napotkanie wersji,ls
w której-f
nie działała (myślę, że została zdefiniowana jako coś innego), ale działała-aU
.-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.-U
po prostu nieposortowane jest cechą GNU, nie sądzę, żeby istniała gdzie indziej.ls -U
w katalogu. Jest to ta sama kolejność,rm -r
która działałaby w tym katalogu. Pamiętaj, że dodanie lub usunięcie pliku może zmienić kolejność innych plików.ls -U
nie 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?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.
źródło