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 ls
w 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
ls -l
z katalogu, a także pełnerm
polecenie i jego wynik.rm
polecenie?unlink
Połączenie będzie zawsze uda się znaleźć plik, który nie istnieje. Kiedy uruchamiam tostrace
polecenie 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 innaqyxdshyikfr_fishing_timeout.png
i wydaje się taka sama z powodu ograniczeń w sposobiels
wyświetlania nazw plików, jak sugerowano w innych odpowiedziach.Odpowiedzi:
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.
--escape
Opcjals
jest twoim przyjacielem w takich przypadkach, jak to narzędzia takie jakcat -v
.Tak też jest
rm -i -- *
Dalsza lektura
źródło
rm -i -- *
udało się.rm -i -- *
polecenie?-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+--+*TL; DR: Uruchom
ls -1b
, znajdź nazwę pliku, skopiuj linię, na której się on pojawia, i podaj torm
.Jak sugerują inni, najprawdopodobniej wynika to z ograniczeń - i
ls
niektó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 niels
przesył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
ls
moż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
ftp
siebie 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
(lubdir -1
):-1
mówi,ls
aby 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.-b
każels
wydrukować sekwencje specjalne dla dowolnych znaków specjalnych. Dane wyjściowels -b
moż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 -1b
ten sposób lub przekazać do niego wzór globu powłoki (npls -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 plikuls
możesz wkleić ją do polecenia. Nie musisz go w żaden sposób modyfikować ręcznie. W twoim przypadku, jeśli chcesz usunąć plik, wpiszrm
, wpisz spację, wklej linię i naciśnij Enter.Dalsza lektura:
ls
: Wyświetl zawartość katalogu w podręczniku GNU coreutils .ls
(idir
) wyświetla dziwne nazwy plików.źródło
-b
=) i +1rm -i -- *
.ls
wyjściowych w pytaniu, ale można go zobaczyć tylko w trybie tekstowym po kliknięciu „edytuj”.Użyj
find
i sprawdź dane wyjściowe:Jeśli plik nie zostanie znaleziony,
*qyxdshyikfr*
nieznacznie skróć wyszukiwane hasło , np .:*qyxds*
lub*fishing*
.Jeśli ok, to użyj
find
wyszukiwanego terminu w kroku 1 irm
źródło
rm
po imieniu rurą odfind
celuxargs
, polecam po prostu za pomocąfind
„s-delete
działania. Równieżsudo
nie jest potrzebne. Mniej istotnie sugeruję pomijanie,-type f
chyba ż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ąć.-delete
Działanie nie będzie rekurencyjnie sprać katalogu; waszerm
rozkazy też nie będą , bo nie macie-r
. Więc nie zamierzasz przypadkowo walnąć całego (niepustego) folderu tutaj, nie używając-type
.find ... -delete
mówi „nie można usunąć ... Brak takiego pliku lub katalogu”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
ls
wynik, 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łemls
wynik w poście na tym zrzucie ekranu:Szybka, krótka sesja terminalowa w celu zduplikowania problemu, z komentarzami:
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 automatycznierm foo\<space><space>
, tak jak w ostatnim przykładzie w powyższym bloku kodu.źródło
ls
wyjś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 pytaniaraz 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
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:
widziałem / pamiętałem, że nazwa tego pliku to „Nautilus-root.desktop”
więc biegam:
pracował dla mnie, mam nadzieję, że to pomaga!
źródło
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.
źródło
Miałem podobną sytuację, po
rsync
utworzeniu 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: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.
źródło