Jakoś udało mi się stworzyć plik, który wydaje się nie mieć nazwy pliku. W poniższym wątku znalazłem informacje na temat uzyskiwania dodatkowych informacji o pliku .
Jednak wypróbowałem niektóre z wymienionych sugestii i nie mogę usunąć pliku. Nie jestem pewien, co zrobiłem, aby go utworzyć, ale stało się to podczas próby skopiowania pliku xml.
Niektóre informacje o pliku są następujące;
> ls -lb
total 296
-rw-r--r-- 1 voyager endeavor 137627 Jan 12 12:49 \177
> file *
: XML document
> ls -i
417777
Próbowałem znaleźć za pomocą przełącznika inum, a następnie przesłać go do rm, ponieważ wydawało się to najbardziej niezawodnym sposobem na pozbycie się go. Jednak przykład podany na dole wątku, do którego link znajduje się poniżej, zawiódł mnie. Przykładem było:
> find -inum 41777 -exec ls -al {} \;
find: illegal option -- i
find: [-H | -L] path-list predicate-list
więc najpierw spróbowałem użyć listy ścieżek, jak poniżej, ale to też nie działało:
> find . -inum 41777 -exec ls -al {} \;
Nie jestem pewien, co to jest znak niedrukowalny \ 177 ani w jaki sposób mogę przekazać to rm
polecenie, ale naprawdę chcę się upewnić, że nie zepsuję żadnych innych plików / katalogów podczas próby usunięcia tego pliku.
źródło
\177
jestDEL
znakiem ASCII .0
?Odpowiedzi:
Plik ma nazwę, ale składa się ze znaków niedrukowalnych. Jeśli używasz ksh93, bash, zsh, mksh lub FreeBSD sh, możesz spróbować go usunąć, podając jego nazwę, która nie może być wydrukowana. Najpierw upewnij się, że nazwa jest poprawna z:
ls -ld $'\177'
Jeśli pokazuje odpowiedni plik, użyj rm:rm $'\177'
Innym (nieco bardziej ryzykownym) podejściem jest zastosowanie
rm -i -- *
. Z opcją -i rm wymaga potwierdzenia przed usunięciem pliku, więc możesz pominąć wszystkie pliki, które chcesz zachować oprócz jednego.Powodzenia!
źródło
rm -i *
że nie zadziałałoby w tym przypadku; z powodu nowych linii powłoka rozwijałaby się*
do czegoś,rm
co nie rozpoznałoby nazwy pliku.bash
i GNUrm
. W moim systemierm *
,rm -i *
irm Ctrl-V DEL TAB ENTER
wszystko działa poprawnie, nawet jeśli nazwa pliku zawiera znak nowej linii (kiedyś"\177foo\nbar\n"
). Niektóre polecenia nie radzą sobie dobrze z takimi nazwami plików, ale narzędzia GNU wydają się niezawodne; wersje tych samych narzędzi inne niż GNU mogą nie zachowywać się tak samo. W każdym razie przydatne są różne sztuczki zawarte w tych odpowiedziach.rm
nigdy nie wykonuje żadnej formy podziału słów, niezależnie od tego, czy jest to GNU,rm
czy nie. Powłoka rozszerza globusy i po wykonaniu żądanego polecenia przekazuje wynikowe nazwy plików jako argumenty rozdzielone zerami (w kodzie C). Niebezpieczne jest przesuwanie listy plików do czegoś, co używa znaku nowej linii jako ogranicznika; zobacz Dlaczego zapętlanie wyjścia find jest złą praktyką?Dla tych, którzy go używają,
vim
uruchom go w bieżącym katalogu roboczym:i przejdź do pliku za pomocą klawiszy strzałek lub
j/k
. Następnie naciśnijShift+D
i potwierdź usunięcie za pomocąy
.źródło
Prawdopodobnie istnieje sposób na przekazanie nazwy pliku
rm
, ale jeśli martwisz się o coś zepsuć, możesz użyć menedżera plików GUI. Emacs posiada tryb edycji katalogu, z którego można korzystać, jeśli jest zainstalowany:Otwórz folder w
emacs
. Możesz uruchomićemacs /path/to/folder
lub otworzyć emacsa, nacisnąć Esc+ xi uruchomićdired
, co wyświetli monit o podanie ścieżkihttp://so.mrozekma.com/unix-dired-delete1.png
Przejdź do wiersza z plikiem, który chcesz usunąć, i naciśnij d. Powinieneś zobaczyć
D
na lewym marginesie obok pliku:http://so.mrozekma.com/unix-dired-delete2.png
Naciśnij, xaby zapisać zmiany. Zostanie wyświetlony monit o upewnienie się, że chcesz usunąć plik; naciśnij y:
http://so.mrozekma.com/unix-dired-delete3.png
źródło
vim
uruchom go w bieżącym katalogu roboczym:vim ./
i przejdź do pliku za pomocą klawiszy strzałek. Następnie naciśnijShift+D
i potwierdź usunięcie za pomocąy
.vim
się wesprzećWykazałeś już,
file *
że powłoka glob (*
) jest w stanie pobrać ten plik, więc teraz po prostu zróbrm
na tym globu.rm -i *
n
dla wszystkich plików oprócz tego z pozornie niewidoczną nazwą plikuźródło
Plik faktycznie ma nazwę, ale składa się ze znaków niedrukowalnych.
Prostą metodą jest poleganie na zakończeniu powłoki: naciskaj Tabwielokrotnie, aż wstawiona zostanie „dziwna” nazwa pliku. Musisz mieć skonfigurowaną powłokę, aby przełączała się między możliwymi uzupełnieniami:
menu-complete
, która nie jest związana domyślnie zamiastcomplete
, który jest związany z Tabdomyślnie. Alternatywnie użyj, Esc *aby wstawić uzupełnienia dla wszystkich plików i usunąć te, których nie chcesz usuwać z wiersza poleceń.setopt auto_menu
lubsetopt menu_complete
ustawić.Jeśli zakończenie nie jest pomocne w twojej powłoce, możesz zadzwonić
rm -i -- *
i odpowiedzieć „nie”, z wyjątkiem tego konkretnego pliku. Jeśli nazwa pliku nie zaczyna się od znaku drukowalnego, możesz ograniczyć dopasowania do plików, których pierwszy znak nie znajduje się w zestawie znaków drukowalnych:(Uwaga, jeśli wzorzec może pasować do pliku o nazwie
-f
, któryrm
traktuje jako opcję).Inną metodą jest wywołanie w
ls -i
celu znalezienia i-węzła pliku (i-węzeł jednoznacznie identyfikuje plik w danym systemie plików), a następniefind -inum
działanie na tym konkretnym pliku. Ta metoda jest szczególnie przydatna, gdy katalog zawiera wiele plików.Jeśli
find
nie masz-delete
opcji, zadzwońrm
:(Tak, wiem, że większość z nich została już opublikowana. Ale odpowiedzi z odpowiednimi informacjami sprawiają, że jest to bardziej skomplikowane niż powinno.)
źródło
Spróbuj użyć,
echo -e
aby zdobyć postać\177
, a następniexargs
przekazać jąrm
.Okazuje się, żeecho
nie przyjmuje przecinków dziesiętnych, więc przekonwertuj na hex:177
jest ósemkowa;echo
wymaga\0
(dosłownego, nie zerowego bajtu) przed:źródło
\xb1
jest liczbą dziesiętną177
,\0
kończy ją zerem i-0
mówixargs
o przyjęciu nazwy zakończonej znakiem null zamiast nazwy zakończonej znakiem nowej linii.echo
, tak jak jest, wysyła 2 nazwy plików do xargs, a następnie dorm
... druga nazwa pliku to\n
... Powoduje to błąd lub usunięcie pliku o tej nazwie ('\ n')-n
aby pozbyć się nowej linii.Mogę tylko o zagwarantowanie, że plik nie ma nazwy. Zdarza się, że jest to nazwa zawierająca znaki niedrukowalne.
Jeśli
rm
nie zadziałało, użycie wynikufind
z-inum
opcją jako argumenturm
raczej nie pomoże; przekaże ten sam argument dorm
tego samego problemu.Plik jest jedynym w tym katalogu, prawda?
Pierwszą rzeczą, którą spróbuję, to
cd
wejść do katalogu, a następnie wpisaćrm ./
, a następnie nacisnąć klawisz Tab. Powinno to rozwinąć argument do rzeczywistej nazwy pliku, a powyższe./
powinno uniemożliwićrm
interpretację argumentu jako czegoś innego niż nazwa pliku.Innym rozwiązaniem jest
cd
przejście do katalogu nadrzędnego, a następnie użycierm -r
(lub, jeśli to koniecznerm -rf
) w katalogu. To powinno usunąć katalog i całą jego zawartość, niezależnie od nazwy. Następnie można użyćmkdir
do odtworzenia katalogu (i być możechmod
do przywrócenia jego uprawnień).EDYTOWAĆ :
Patrząc
ls -lb
ponownie na dane wyjściowe, myślę, że nazwa pliku zaczyna się od znaku ASCIIDEL
(który jest zły, a nie śmiertelny) i zawiera jeden lub więcej znaków nowej linii (co jest naprawdę złe). O ile mi wiadomo,rm
polecenie nie może interpretować nowego wiersza jako części nazwy pliku.Ale
unlink()
połączenie systemowe może. Oto skrypt Perla, który rzuciłem razem, który będzie iterował pliki w bieżącym katalogu i poprosił o każdy z nich, czy chcesz go usunąć. Nie używa zewnętrznego polecenia, takiego jakrm
usuwanie plików, więc powinno być w stanie obsłużyć wszelkie śmieszne znaki obsługiwane przez system plików (cokolwiek innego niż ASCIINUL
i/
).Wykonanie
rm -r
lubrm -rf
w katalogu zawierającym powinno nadal działać, ale jeśli chcesz usunąć pojedynczy plik, możesz spróbować.(Innym rozwiązaniem, jeśli w katalogu są inne pliki, które chcesz zachować, jest przeniesienie wszystkich innych plików do katalogu tymczasowego, a następnie nuke i odtworzenie katalogu i przeniesienie pozostałych plików z powrotem.)
(Och, i cokolwiek zrobiłeś, aby utworzyć ten plik, spróbuj nie robić tego ponownie!)
źródło
Jeśli możesz znaleźć dokładnie ten plik za pomocą
find
polecenia, możesz użyć-delete
predykatu. Bądź ostrożny i ustaw-delete
ostatni parametr polecenia find, bo inaczej będzie bardzo bolało ...źródło
Jesteś blisko. Krok po kroku, oto jak usunąć plik według numeru i-węzła.
Najpierw znajdź numer i-węzła żądanego pliku, używając
ls -li
. Numer i-węzła będzie w pierwszej kolumnie wyniku.Na przykład:
W tym przypadku numer i-węzła to 311010
Służy
find
do wyszukiwania pliku według numeru i-węzła.Upewnij się, że
find
zwraca tylko nazwę pliku, który chcesz usunąć. Na przykład:Gdy masz pewność, że
find
znajdziesz odpowiedni plik, przekaż-delete
parametr dofind
. Spowoduje to usunięcie pliku za Ciebie.źródło
Inne odpowiedzi są świetne i będą działać w prawie wszystkich środowiskach.
Ale jeśli masz uruchomione GUI, po prostu otwórz katalog w nautilus, delfinach, konquerorze lub ulubionym menedżerze plików i powinieneś być w stanie łatwo zobaczyć i usunąć każdy plik o niedziałającej nazwie za pomocą kilku kliknięć myszką .
Jeśli nie jesteś zwykłym użytkownikiem emacsa lub vima (jak opisano w kilku innych odpowiedziach), może to być najłatwiejszy sposób.
źródło
Miał podobny problem z plikiem o nazwie „\ 033” (faktyczny znak „Escape”).
Powyższe monituje o usunięcie plików w bieżącym katalogu, które nie zaczynają się od litery lub cyfry.
źródło
Zamiast tego możesz zmienić nazwę bieżącego katalogu na
DirX_OLD
, utworzyć nowy katalog z nazwąDirX
i przenieść wszystkie wymagane pliki zDirX_OLD
doDirX
. Po skopiowaniu plików możesz je usunąćDirX_OLD
źródło
Na wypadek, gdyby to pomogło komukolwiek dodać moje dwa centy. Udało mi się uzyskać nazwy plików przy użyciu
stat
symboli wieloznacznych w następujący sposób:Wynik:
Następnie mógłbym użyć ciągów cytowanych w ANSI C (zgodnie z przyjętą odpowiedzią), aby uzyskać dostęp do plików:
źródło
Każdy plik ma nazwę, wystarczy znaleźć dokładnie to, które.
Użyję tych plików jako przykładów:
Te pliki będą wyświetlane jak
?
zwyklels
:Ale jeśli
ls
zezwolisz na tę-Q
opcję, powinno być jasne, jaka jest prawdziwa nazwa pliku:są to numery i-węzłów i „Cytowane” nazwy w
1
kolumnie plików w pwd.Oznacza to, że używa możliwości powłoki (POSIX) do używania rozszerzeń (globbing):
Aby mieć nazwy z dowolnym znakiem niedrukowalnym:
Aby wyświetlić listę plików, które mogą mieć tylko znaki niedrukowalne:
Następnie, aby selektywnie (
-i
opcja (interaktywna)) je usunąć, użyj:Musisz tylko wybrać, które chcesz usunąć, odpowiadając
y
na powyższe pytanie.źródło
Jeśli masz bash z autouzupełnianiem, może to działać dla ciebie. Wpisałem znak pokazany na liście katalogów. Następnie uruchomiłem autouzupełnianie i przemianowałem rzecz na coś do wydrukowania.
Oto, co zadziałało dla mnie:
źródło
pracował dla mnie.
źródło