rm
rekurencja działa tylko w dół, prawda?
rm -r x y
usunie x
i y
wszystko w nich (jeśli są to katalogi), ale nie ich rodzice ani nic poza nimi.
Uruchamianie: sudo rm -R *.QTFS
usunie wszystkie pliki * .QTFS z bieżącego katalogu i jego dzieci, prawda?
Nie. Spowoduje to usunięcie wszystkich nazwanych plików *.QTFS
, wszystkich plików rekurencyjnie w wywoływanych katalogach*.QTFS
i samych tych katalogów. Jeśli chcesz inne zachowanie związane z usuwaniem, użyj find -delete
.
bieżący katalog wyświetlany przez ls -lha
zawiera także .
i ..
linki z powodu braku lepszego słowa, więc dlaczego rekurencja nie podąża za nimi w drzewie katalogów? Czy istnieje granica sztuczna na rm aplikacji, albo .
i ..
nie są prawdziwe rzeczy?
To sztuczny limit rm
.
Nie jest to jednak wcale takie sztuczne - to jedyny sposób, w jaki mógłby kiedykolwiek działać. Jeśli rm
podążą za ..
linkami nadrzędnymi , każdy rm -r
usunie każdy plik w systemie, podążając za wszystkimi ..
linkami z powrotem do /
. rm
widzi wpisy ..
i .
w każdym katalogu, gdy wyświetla zawartość, i jawnie je ignoruje z tego powodu.
W rzeczywistości możesz to wypróbować. Uruchom, rm -r .
a większość rm
implementacji odmówi działania, jawnie zgłaszając błąd:
$ rm -r .
rm: refusing to remove ‘.’ or ‘..’ directory: skipping ‘.’
(ta wiadomość pochodzi z GNUrm
; inne są podobne). Kiedy napotyka te wpisy niejawnie, a nie jako wyraźne argumenty, po prostu je ignoruje i kontynuuje. Takie zachowanie jest wymagane przez POSIX . W GNU rm
i wielu BSD jest on dostarczany automatycznie przez fts_read
rodzinę funkcji przechodzących przez hierarchię.
lub .
i ..
czy nie są prawdziwe?
.
i ogólnie..
są to prawdziwe wpisy katalogu, chociaż jest to specyficzne dla systemu plików. Prawie zawsze będą prezentowane tak, jakby były prawdziwymi wpisami do całego kodu użytkownika, niezależnie od tego. Wiele programów (nie tylko ) specjalizuje się w ich zachowaniu w celu wychwycenia lub uniknięcia niekontrolowanej lub niepożądanej rekurencji.rm