Zastanawiam się ogólnie nad kierunkiem rekurencji, a konkretnie rm.
rekurencja rm działa tylko w dół, prawda?
Uruchamianie: sudo rm -R *.QTFS
usunie wszystkie pliki * .QTFS z bieżącego katalogu i jego dzieci, prawda?
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?
Odpowiedzi:
rm -r x y
usuniex
iy
wszystko w nich (jeśli są to katalogi), ale nie ich rodzice ani nic poza nimi.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żyjfind -delete
.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żdyrm -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:(ta wiadomość pochodzi z GNU
rm
; 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 GNUrm
i wielu BSD jest on dostarczany automatycznie przezfts_read
rodzinę funkcji przechodzących przez hierarchię..
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
źródło
fts_read
implementacji, ten dotyczy tylko argumentów wiersza poleceń.rm
nawet nie widzi,*.QTFS
ponieważ jest rozszerzony globalnie do nazw plików przez bash przed wywołaniem pliku binarnego rm. Odpowiedź @ tobyink zauważa, że..
i..
zachowanie w szczególnych przypadkach są przyczyną istnieniaOprócz tego, co napisał Michael Homer, istnieje jeszcze jeden czynnik, który utrudnia przypadkowe ponowne przejście do katalogu nadrzędnego.
Przejdź do katalogu domowego i wpisz coś takiego:
Zobaczysz, że pokazuje listę plików i katalogów zawierających literę „s”. Jednak żadne pliki zaczynające się od wiodącej kropki nie są wyświetlane. Aby je pokazać, możesz użyć:
Wynika to z faktu, że powłoka odmawia rozszerzenia,
*
aby objąć wiodącą kropkę. To znaczy że:Nie powróci do
..
.źródło