Usuń plik w systemie Linux, używając numeru i-węzła

15

Jeśli tworzysz plik w systemie UNIX / Linux ze znakami specjalnymi, takimi jak touch \"la*, nie możesz go usunąć za pomocą rm "la*. Musisz użyć numeru i-węzła (możesz, jeśli dodasz \przed nazwą, wiem, ale będziesz musiał zgadywać jako użytkownik, że został użyty podczas tworzenia pliku).

Sprawdziłem stronę podręczną pod kątem rm, ale nie ma wzmianki o numerze i-węzła. Robienie rm inodenumberteż nie działa.

Jakie jest na to polecenie?

KdgDev
źródło

Odpowiedzi:

24

Niektóre inne metody obejmują:

uciekając od znaków specjalnych:

[~] $ rm \ "la \ *

użyj polecenia find i przeszukaj tylko bieżący katalog. Polecenie find może wyszukiwać numery i-węzłów i ma wygodny -deleteprzełącznik:

[~] $ ls -i
7404301 "la *

[~] $ find. -maxdepth 1 -typ f -inum 7404301
./"la*

[~] $ find. -maxdepth 1 -type f -inum 7404301 -delete
[~] $ ls -i
[~] $
John T.
źródło
Heh, użycie find byłoby z pewnością łatwiejsze niż moja sugestia, nigdy nie zauważyłem -inum :)
Find ma wiele świetnych przełączników do zbadania, to moje szwajcarskie narzędzie do noży wojskowych, żeby być szczerym :)
John T
t: och, tak prawdziwe.
akira
Solaris nie ma opcji „-delete” z „-maxdepth”.
guthrie
Powinieneś ograniczyć wyszukiwanie za pomocą -xdevopcji, ponieważ inne zamontowane systemy plików mogą mieć również niepowiązane pliki o tym samym numerze i-węzła.
Jonas Berlin,
5

Może czegoś mi brakuje, ale ...

rm '"la*'

W każdym razie nazwy plików nie mają i-węzłów, a pliki mają. Próba usunięcia pliku bez usuwania wszystkich nazw plików, które go wskazują, spowoduje uszkodzenie systemu plików.

Ignacio Vazquez-Abrams
źródło
cóż, działałoby to tylko w bieżącym katalogu, ale rzeczywiście jest to uzasadniony powód do niepokoju. Głupie, że mi tego brakowało. Nadal jednak nie usuwa pliku.
KdgDev
3
Oczywiście nie. Plik jest usuwany tylko wtedy, gdy nie ma już żadnych wskazujących go nazw plików i procesów, które go utrzymują.
Ignacio Vazquez-Abrams,
5

Jeśli naprawdę chcesz to zrobić - a Twój przypadek użycia nie wygląda tak, jak trzeba, możesz wypróbować narzędzia do debugowania systemu plików. To znaczy, jeśli chcesz wszystko stracić.

Na przykład dla ext2 / 3/4 debugfspolecenie ma opcję „kill_file”, która zdaje się przyjmować i-węzeł. Jak wspomniano w innych odpowiedziach, spowoduje to uszkodzenie systemu plików, ponieważ będą wpisy katalogu wskazujące na nieistniejący plik. Uruchomienie fsckpóźniej może być w stanie to naprawić. Jest mało prawdopodobne, abyś mógł to zrobić w zamontowanym systemie plików.

Ale zdecydowanie zalecam, abyś po prostu używał odpowiednich znaków zmiany znaczenia / cytowania i usuwał takie pliki za pomocą zwykłego rmpolecenia, jak wspomniano we wcześniejszej odpowiedzi - i używaj rm -idla większego bezpieczeństwa w przypadku nazw plików zawierających znaki globowania, takie jak *


źródło
1

Chociaż zdecydowanie zalecam podejście „ucieczka przed znakami specjalnymi”, zawsze istnieje clripolecenie, gdy naprawdę chcesz naprawić naprawiony system plików.

mpez0
źródło
2
Należy zauważyć, że clrizwykle występuje tylko w systemach Oracle (np. SunOS).
can-ned_food
1

Możesz usunąć pliki zaczynające się od myślnika, dzwoniąc rm -- filename.

uli42
źródło
1
Wydaje się, że jest to komentarz do tej odpowiedzi, a nie odpowiedź na pytanie PO.
Mówię: Przywróć Monikę
1

Wyzwanie, jakie miałem, polegało na usunięciu nazwy pliku rozpoczynającej się od myślnika - rm zawsze chce interpretować ją jako nazwę hosta. Rozwiązałem to za pomocą:

rm ./-g4xxx
Anthony V Edwards
źródło