„Brak takiego pliku lub katalogu” podczas próby usunięcia pliku, ale plik istnieje?


21

Próbuję usunąć obraz png, który został przesłany na mój serwer za pomocą skryptu PHP. Ilekroć próbuję usunąć go zarówno przez ftp, jak i terminal, pojawia się błąd

No such file or directory

Jednak gdy jestem lsw katalogu, plik jest wymieniony i jest również wymieniony w moim kliencie ftp. Próbowałem utworzyć plik o tej samej nazwie i ostatecznie otrzymałem dwa pliki o tej samej nazwie.

Mogę otworzyć plik, który podobno nie istnieje, ale nadal nie mogę go usunąć. Próbowałem również zrestartować mój serwer. Wszelkie pomysły, co może być problemem? Korzystam z 64-bitowej wersji Ubuntu, ale nie sądzę, że jest to problem 32/64-bitowy. Powinienem również zauważyć, że usunąłem wiele innych plików png przesłanych przez ten sam skrypt PHP.

Wyjście dla ls -l

total 224 
-rw-r--r-- 1 www-data www-data 222838 May 13 04:14 qyxdshyikfr_fishing_timeout.png 
-rw-r--r-- 1 root root 272 May 14 06:54 upload.php

Dane wyjściowe przy próbie rm

rm: cannot remove ‘qyxdshyikfr_fishing_timeout.png’: No such file or directory

upload.php: http://pastebin.com/z87eypTY


Skopiuj wklej dane wyjściowe ls -lz katalogu, a także pełne rmpolecenie i jego wynik.
heemayl

@heemayl razem 224 -rw-r - r-- 1 www-data www-data 222838 13 maja 04:14 qyxdshyikfr_fishing_timeout.png -rw-r - r-- 1 root root 272 14 maja 06:54 upload.php rm: nie można usunąć „qyxdshyikfr_fishing_timeout.png”: Brak takiego pliku lub katalogu
DevinFrench

1
@DevinFrench, edytuj swoje pytanie, aby dodać informacje.
muru

Z którego katalogu uruchamiasz rmpolecenie?
heemayl

1
@Samuel Dlaczego to sugeruje problem z systemem plików? unlinkPołączenie będzie zawsze uda się znaleźć plik, który nie istnieje. Kiedy uruchamiam to stracepolecenie w moim systemie, gdzie wiem, że nie mam takiego pliku, generuje on podobny wynik; Nie sądzę, że wskazuje, że problem systemu plików! Wydaje się znacznie bardziej prawdopodobne, że nazwa pliku jest nieco inna qyxdshyikfr_fishing_timeout.pngi wydaje się taka sama z powodu ograniczeń w sposobie lswyświetlania nazw plików, jak sugerowano w innych odpowiedziach.
Eliah Kagan

Odpowiedzi:


21

Próbowałem utworzyć plik o tej samej nazwie i ostatecznie otrzymałem dwa pliki o tej samej nazwie.

Oznacza to, że w przypadku braku uszkodzenia systemu plików masz dwa pliki o dwóch różnych nazwach, które wyglądają tak samo z powodu znaków niedrukowalnych lub znaków, które wyglądają tak samo w zestawie znaków / czcionce. --escapeOpcja lsjest twoim przyjacielem w takich przypadkach, jak to narzędzia takie jak cat -v.

Tak też jest rm -i -- *

Dalsza lektura


Byłem twórcą pliku i nazwy przesłanego pliku. Nikt nie próbował sabotować mojego serwera, ponieważ jestem jedyną osobą, która zna pełną ścieżkę do upload.php. Jednak rm -i -- *udało się.
DevinFrench

3
@DevinFrench Jeśli ta odpowiedź rozwiązała problem, zaznacz ją jako zaakceptowaną, klikając znak pod liczbą głosów pozytywnych, aby przyszli użytkownicy mogli wiedzieć, że to rozwiązanie działało dla Ciebie.
Kos

1
Czy ktoś może wyjaśnić rm -i -- *polecenie?
user3731622,

Z tego, co rozumiem: Przekazywanie -i wyświetli monit przed usunięciem każdego pliku. --przed *zaznacza wszystkie pliki bez względu na to, czy ich nazwy zawierają znaki specjalne. Odniesienie: https://explainshell.com/explain?cmd=rm+-i+--+*
MoltenMuffins

16

TL; DR: Uruchom ls -1b, znajdź nazwę pliku, skopiuj linię, na której się on pojawia, i podaj to rm.

Jak sugerują inni, najprawdopodobniej wynika to z ograniczeń - i lsniektóre inne programy, w tym oprogramowanie klienckie i serwerowe - domyślnie obsługują dziwne nazwy plików, takie jak te zawierające znaki kontrolne. Twój sukces z odpowiedzią JdeBP zdecydowanie sugeruje, że tak było, chociaż wcześniej byłby to dobry zakład.

  • Dla ls, gdy standardowe wyjście jest terminal, ?znaki są drukowane w ich miejsce. Więc jeśli nie lsprzesyłasz danych wyjściowych do żadnego innego polecenia (lub przekierowujesz je do dziennika w celu przeglądania), prawdopodobnie twoja nazwa pliku nie zawiera znaków kontrolnych. Są jednak inne problematyczne znaki - na przykład nazwa pliku zawiera końcowe białe znaki.

    Takie zachowanie lsmoże być mylące, ale nie jest błędem, może zostać jawnie zastąpione przez użytkownika (patrz poniżej).

  • Podczas próby zdalnego dostępu lub usunięcia pliku błędy w oprogramowaniu klienta lub serwera mogą powodować takie problemy.

    Doświadczyłem tego rodzaju rzeczy przez ftpsiebie kilka razy , w tym w przypadku plików, których nazwy zawierają spacje końcowe. (To, że nie działało, było spowodowane błędem w moim kliencie ftp.) Nawet jeśli ręcznie tworzysz plik, w zależności od tego, jak go tworzysz, czasami dość łatwo jest przypadkowo wstawić końcowe spacje lub inne białe znaki, które mogą wyglądać jak przestrzenie, chociaż tak nie jest.

Jest to sytuacja, w której przydaje się ls -1b(lub dir -1):

  • -1mówi, lsaby pokazać jeden wpis w wierszu. W ten sposób nie ma wątpliwości co do tego, gdzie kończy się jedna nazwa pliku, a druga zaczyna. Jest to przydatne w przypadku plików o dziwnych nazwach.
  • -bkaże lswydrukować sekwencje specjalne dla dowolnych znaków specjalnych. Dane wyjściowe ls -bmożna kopiować i wklejać dosłownie do polecenia, bez dodawania cudzysłowu: wszystkie problematyczne znaki są już cytowane w sposób, który powoduje, że powłoka rozpoznaje je jako takie.

Jest tylko jedno zastrzeżenie: jeśli wydaje się \, że ostatnim znakiem w wierszu jest , skopiuj jeden znak później, ponieważ oznacza \to zacytowanie spacji.

Możesz działać w ls -1bten sposób lub przekazać do niego wzór globu powłoki (np ls -1b qyx*.). Globbing może znaleźć plik, ale nie musi, w zależności od tego, czy znaki kontrolne (lub inne dziwne znaki) są obecne w części nazwy pojawiającej się we wzorcu globowania.

Po skopiowaniu \podanej przez ciebie cytowanej wersji nazwy pliku lsmożesz wkleić ją do polecenia. Nie musisz go w żaden sposób modyfikować ręcznie. W twoim przypadku, jeśli chcesz usunąć plik, wpisz rm, wpisz spację, wklej linię i naciśnij Enter.

Dalsza lektura:


1
Bardzo fajne dzięki -b=) i +1
AB

Pominąłem OP podczas tworzenia pliku o tej samej nazwie w moim kliencie ftp, gdy próbowałem usunąć pierwszy plik, z którym miałem problemy, zamiast tego usuną nowy plik, który utworzyłem. Właśnie dlatego nie sądziłem, że w grę wchodzą jakieś specjalne postacie i wciąż nie wiem, jaką postacią specjalną był, odkąd go użyłem rm -i -- *.
DevinFrench

@DevinFrench Dodatkowy znak to spacja na końcu nazwy pliku. Wciąż jest w danych lswyjściowych w pytaniu, ale można go zobaczyć tylko w trybie tekstowym po kliknięciu „edytuj”.
Izkata

@Izkata Dobra rozmowa! Powinienem był to sprawdzić. Pojawia się również, gdy rozwijam wersję 3 w historii edycji (pełna nazwa pliku, w tym spacja końcowa, jest podświetlona na zielono, dzięki czemu jest dostrzegalna). To, co powiedziałeś, jest jak dotąd najbardziej ostatecznym i szczególnie poprawnym wyjaśnieniem - jeśli opublikowałeś odpowiedź wyjaśniającą, że pochodzi ona ze spacji końcowej i skąd wiesz, oraz jakie polecenie usunie plik (jeśli OP nadal go miałby) , Wiem, że głosowałbym za tym.
Eliah Kagan

@EliahKagan Gotowe, ze zdjęciami
Izkata

3
  1. Użyj findi sprawdź dane wyjściowe:

    Jeśli plik nie zostanie znaleziony, *qyxdshyikfr*nieznacznie skróć wyszukiwane hasło , np .: *qyxds*lub *fishing*.

    sudo find . -maxdepth 1 -type f -name "*qyxdshyikfr*"
    
  2. Jeśli ok, to użyj findwyszukiwanego terminu w kroku 1 irm

    find . -maxdepth 1 -type f -name "*qyxdshyikfr*" -print0 | xargs -0  rm
    

1
Zamiast nazywając rmpo imieniu rurą od findcelu xargs, polecam po prostu za pomocą find„s -deletedziałania. Również sudonie jest potrzebne. Mniej istotnie sugeruję pomijanie, -type fchyba że jest to wyraźnie pomocne. Przypuszczalnie, jeśli wpis, który OP chce usunąć, okazał się linkiem symbolicznym, na przykład nadal chcieliby go znaleźć i nadal chcą go usunąć. -deleteDziałanie nie będzie rekurencyjnie sprać katalogu; wasze rmrozkazy też nie będą , bo nie macie -r. Więc nie zamierzasz przypadkowo walnąć całego (niepustego) folderu tutaj, nie używając -type.
Eliah Kagan

OK, daj mi chwilę.
AB

W moim przypadku nawet find ... -deletemówi „nie można usunąć ... Brak takiego pliku lub katalogu”
Stop Harming Monica

1

Przekazując szczegółowo, rozwinął się z mojego komentarza do odpowiedzi Eliasza

Problem jest niewidoczny, ale można go zobaczyć, jeśli wiesz, czego szukać: nazwa pliku zawiera spację na końcu. Ponieważ skopiowałeś / wkleiłeś cały lswynik, możesz to zobaczyć w pytaniu, jeśli podświetlisz wynik, edytujesz post i przesuniesz kursor na koniec, lub (jak zauważył Eliah) spójrz na różnicę w historii edycji. Podkreśliłem lswynik w poście na tym zrzucie ekranu:

Dodatkowa przestrzeń

Szybka, krótka sesja terminalowa w celu zduplikowania problemu, z komentarzami:

$ touch 'foo '        # Create file with a space at the end
$ ls -l               # Space is not visible in ls output
total 0
-rw-rw-r-- 1 izkata izkata 0 May 14 21:59 foo 

$ rm foo              # Cannot remove it when not specifying the space
rm: cannot remove ‘foo’: No such file or directory

$ rm 'foo '           # Can remove it if we quote the file name and include the space
$ rm foo\             # Or can escape the space to tell bash to include it as part of the filename

Korzystanie z uzupełniania tabulatorów również całkowicie pomogłoby w rozwiązaniu problemu, ponieważ bash jest wystarczająco inteligentny, aby poprawnie uciec ze spacji (ogólnie jest to również dobry nawyk, bardzo przyspiesza ścieżki pisania) .

Na przykład, gdybym wpisał rm f<tab>, wykonałby to automatycznie rm foo\<space><space>, tak jak w ostatnim przykładzie w powyższym bloku kodu.


W szczególności wspominam o kopiowaniu / wklejaniu danych lswyjściowych, ponieważ coś podobnego wydarzyło się kiedyś na StackOverflow (i to jest cały powód, dla którego chciałem to poszukać): ktoś ma w kodzie znak niedrukowalny i jedyny powód, dla którego ktoś to wymyślił to dlatego, że użytkownik ten kopiuje / wkleja zamiast wpisywać swój kod podczas publikowania pytania
Izkata

0

raz utworzyłem plik, aby otworzyć Nautilus jako root, ale nazwa pliku widziana z nautilus to „Przeglądarka plików (root)”, a następnie, gdy próbowałem usunąć jako

$ rm "File Browser (Root)"
$ sudo rm "File Browser (Root)"
$ sudo rm "File Browser (Root).desktop"

jedyną odpowiedzią, jaką otrzymałem, było: „rm: nie można usunąć„ Przeglądarki plików (root) .desktop ”: Brak takiego pliku lub katalogu”

wtedy kiedy uruchamiam:

$ ls -l

widziałem / pamiętałem, że nazwa tego pliku to „Nautilus-root.desktop”

więc biegam:

$ sudo rm "Nautilus-root.desktop"

pracował dla mnie, mam nadzieję, że to pomaga!


0

Miałem więc ten problem i żadna z tych rzeczy nie działała dla mnie. Udało się stworzyć plik o dokładnie takiej samej nazwie. Był to folder o nazwie Przykład 1.2.3, więc utworzyłem nowy folder i nazwałem go dokładnie tak, jak ten, który nie chciałby zostać usunięty. Stary folder zniknął, a ja usunąłem nowy.


0

Miałem podobną sytuację, po rsyncutworzeniu kopii zapasowej katalogu Pictures na komputerze Mac i przeczytaniu go na Ubuntu. Były dwa pliki (właściwie katalogi) o różnych nazwach, ale o tej samej zawartości. Usunąłem jeden z nich do Kosza (używając Nautilusa), ale nie mogłem usunąć drugiego, nawet z wiersza poleceń. Powiedziałoby to:

$ rmdir Pictures
rmdir: failed to remove 'Pictures': No such file or directory
$ rm Pictures
rm: cannot remove 'Pictures': Is a directory

Po sprawdzeniu numerów i-węzłów za pomocą ls -i -l okazało się, że oba katalogi mają ten sam numer i-węzła. Wygląda jak twardy link ...

Rozwiązanie było zaskakująco proste - opróżnij Kosz, klikając prawym przyciskiem myszy ikonę. Potem oba katalogi zniknęły.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.