파일을 제거하려고 할 때“이러한 파일이나 디렉토리가 없습니다”파일이 존재합니까?


21

PHP 스크립트를 통해 서버에 업로드 된 png 이미지를 제거하려고합니다. ftp와 터미널을 통해 삭제하려고 할 때마다 오류가 발생합니다.

No such file or directory

그러나 ls디렉토리에 있을 때 파일이 나열되고 내 ftp 클라이언트에도 나열됩니다. 같은 이름의 파일을 만들려고했는데 같은 이름의 두 파일이 생겼습니다.

존재하지 않는 파일을 열 수는 있지만 여전히 제거 할 수는 없습니다. 또한 서버 재부팅을 시도했습니다. 어떤 아이디어가 문제가 될 수 있습니까? 64 비트 버전의 Ubuntu를 실행하고 있지만 32/64 비트 문제는 아닌 것 같습니다. 또한 동일한 PHP 스크립트로 업로드 한 다른 많은 png 파일을 제거했습니다.

출력 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

시도 할 때 출력 rm

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

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


ls -l디렉토리 의 출력 , 전체 rm명령 및 출력을 복사하십시오 .
heemayl

@heemayl total 224 -rw-r--r-- 1 www-data www-data 222838 5 월 13 일 04:14 qyxdshyikfr_fishing_timeout.png -rw-r--r-- 1 루트 루트 272 5 월 14 일 06:54 upload.php rm : 'qyxdshyikfr_fishing_timeout.png'를 제거 할 수 없습니다 : 해당 파일이나 디렉토리가 없습니다
DevinFrench

1
@DevinFrench 정보를 추가 하려면 질문을 편집 하십시오.
muru

어떤 디렉토리에서 rm명령을 실행하고 있습니까?
heemayl

1
@Samuel 왜 이것이 파일 시스템 문제를 암시합니까? unlink호출은 항상 존재하지 않는 파일을 찾을 수 없게됩니다. 내가 그 실행하는 경우 strace에 명령을 나는 그런 파일이 없습니다 알고 시스템, 그것과 유사한 출력을 생성합니다; 나는 나타냅니다 생각하지 않는다 내가 파일 시스템에 문제가! 다른 답변에서 제안한 것처럼 파일 이름을 표시 qyxdshyikfr_fishing_timeout.png하는 방식의 제한으로 인해 파일 이름이 약간 다르고 동일하게 나타납니다 ls.
Eliah Kagan

답변:


21

같은 이름의 파일을 만들려고했는데 같은 이름의 두 파일이 생겼습니다.

즉, 파일 시스템 손상이 없으면 인쇄되지 않은 문자 또는 문자 세트 / 글꼴에서 동일한 문자로 인해 동일한 두 개의 다른 이름가진 두 개의 파일 이 동일 하게 나타납니다 . --escape에 옵션 ls으로 같은 도구, 이러한 경우에 당신의 친구입니다 cat -v.

역시 rm -i -- *

추가 자료


파일을 만든 사람과 업로드 한 파일 이름이었습니다. upload.php의 전체 경로를 아는 유일한 사람이므로 아무도 내 서버를 방해하려고 시도 rm -i -- *하지 않았습니다.
DevinFrench

3
@DevinFrench이 답변으로 문제가 해결 되었다면, 투표 수 아래에있는 표시를 클릭하여 수락 된 답변으로 표시하여 향후 사용자가이 솔루션이 귀하에게 도움이되었다는 사실을 알 수 있도록하십시오.
kos

1
누군가 rm -i -- *명령을 설명 할 수 있습니까 ?
user3731622

내가 이해 한 것 : 전달 -i 하면 각 파일을 제거하기 전에 프롬프트가 표시됩니다. --before *는 이름에 특수 문자가 포함되는지 여부에 관계없이 모든 파일을 선택합니다. 참조 : https://explainshell.com/explain?cmd=rm+-i+--+*
MoltenMuffins

16

TL; DR : Run ls -1b, 파일 이름을 찾은 다음 나타나는 파일을 복사 한 후 파일 이름을 지정하십시오 rm.

다른 사람들이 제안했듯이, 이것은 아마도 ls제어 문자를 포함하는 것과 같은 이상한 파일 이름을 기본적으로 처리 하는 방식 과 클라이언트 및 서버 소프트웨어를 포함한 일부 다른 프로그램 의 제한 때문일 가능성이 큽니다 . JdeBP의 답변으로 성공한 것은 이것이 사실이라고 강력하게 암시하지만, 그 전에도 좋은 베팅이었을 것입니다.

  • ls경우 표준 출력 이 터미널 인 경우 ?문자가 대신 인쇄됩니다. 따라서 ls의 출력을 다른 명령으로 파이핑하지 않거나 (보기 위해 로그로 리디렉션) 파일 이름에 제어 문자가 포함되어 있지 않을 수 있습니다. 그러나 다른 문제가있는 문자가있을 수 있습니다. 예를 들어 파일 이름 뒤에 공백이 포함되어있을 수 있습니다.

    이 동작은 ls혼동 될 수 있지만 버그는 아니며 사용자가 명시 적으로 재정의 할 수 있습니다 (아래 참조).

  • 원격으로 파일에 액세스하거나 파일을 제거하려고 할 때 클라이언트 또는 서버 소프트웨어의 버그로 인해 이러한 문제가 발생할 수 있습니다.

    ftp이름에 후행 공백이 포함 된 파일을 포함하여 여러 번 나 자신을 통해 이런 종류의 일을 경험했습니다 . (내 FTP 클라이언트의 버그로 인해 작동하지 않았습니다.) 파일을 직접 만드는 방법에 따라 파일을 직접 만드는 경우에도 실수로 후행 공백 또는 기타 공백을 삽입하는 것이 때로는 쉽습니다. 그렇지 않은 경우에도 공백처럼 보일 수 있습니다.

이것은 ls -1b(또는 dir -1)가 편리한 상황입니다 .

  • -1ls한 줄에 하나의 항목을 표시하도록 지시 합니다. 이렇게하면 하나의 파일 이름이 끝나고 다른 파일 이름이 시작되는 위치에 대한 혼동이 없습니다. 이상한 이름의 파일에 편리합니다.
  • -bls특수 문자에 대한 이스케이프 시퀀스를 인쇄하도록 지시 합니다. 따옴표를 추가하지 않고ls -b 명령 의 결과를 그대로 문자로 복사하여 붙여 넣을 수 있습니다 . 문제가있는 모든 문자는 셸에서 문자를 그대로 인식하는 방식으로 이미 인용되어 있습니다.

한 가지주의 사항이 있습니다. 줄의 마지막 문자가로 표시 되면 공백을 인용 \한다는 의미 \이므로 그 뒤에 한 문자를 복사하십시오 .

그렇게 실행 ls -1b하거나 쉘 글로브 패턴을 전달할 수 있습니다 (예 :) ls -1b qyx*. 글 로빙 패턴에 나타나는 이름 부분에 제어 문자 (또는 다른 이상한 문자)가 있는지 여부에 따라 글 로빙이 파일을 찾거나 찾지 못할 수 있습니다.

에서 제공 한 \파일 이름 의 인용 버전 을 복사 한 후 ls명령에 붙여 넣을 수 있습니다. 어떤 식 으로든 수동으로 수정할 필요가 없습니다. 파일을 삭제하려면을 rm입력하고 공백을 입력 한 후 줄을 붙여넣고를 누르십시오 Enter.

더 읽을 거리 :


1
아주 멋진 -bthx =)와 +1
AB

OP에서 제외 한 것은 동일한 이름의 파일을 만들 때 ftp 클라이언트에서 문제가 발생한 첫 번째 파일을 삭제하려고 할 때 대신 새 파일을 삭제하는 것이 었습니다. 그렇기 때문에 나는 어떤 특수 문자가 포함되어 있다고 생각하지 않았으며, 내가 사용한 이후 특수 문자가 무엇인지 여전히 알지 못합니다 rm -i -- *.
DevinFrench

@DevinFrench 추가 문자는 파일 이름 끝에 공백입니다. 그것은 여전히 ls질문 의 출력에 있지만 "편집"을 클릭하면 텍스트 모드에서만 볼 수 있습니다.
이즈 카타

@ 이즈 카타 좋은 전화! 나는 그것을 확인하려고 생각했다. 편집 내역 에서 개정 3을 확장 할 때도 나타납니다 (후행 공간을 포함한 전체 파일 이름은 녹색으로 강조 표시되어 식별 할 수 있습니다). 당신이 말한 것은 지금까지 가장 명확하고 구체적으로 설명 된 것입니다. 후행 공백에서 비롯되었다는 것을 설명하는 답변을 게시하고 어떻게 알고 있는지, 어떤 명령이 파일을 제거 할 것인지 (OP가 여전히 가지고 있다면) 나는 그것을 찬성했다는 것을 안다.
Eliah Kagan

@EliahKagan 완료, 사진과 함께
이즈 카타

3
  1. find출력을 사용 하고 확인하십시오.

    파일을 찾을 수 없으면 검색어를 *qyxdshyikfr*약간 단축하십시오 ( 예 : *qyxds*또는) *fishing*.

    sudo find . -maxdepth 1 -type f -name "*qyxdshyikfr*"
    
  2. 괜찮 으면 find1 단계의 검색어와 함께 사용 하는 것보다rm

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

1
rm에서 find까지 파이프를 통해 이름으로 전화 하는 대신 xargs단순히 find-delete작업을 사용하는 것이 좋습니다 . 또한 sudo필요하지 않습니다. 덜 중요한 -type f것은 분명히 도움이되는 곳을 제외하고 생략 하는 것이 좋습니다. 예를 들어 OP가 삭제하려는 항목이 심볼릭 링크 인 것으로 판명 된 경우에도 해당 항목을 찾고 여전히 삭제하려고합니다. 이 -delete작업은 디렉토리를 재귀 적으로 방해하지 않습니다. rm당신이 없기 때문에 당신 의 명령 도 마찬가지입니다 -r. 따라서 실수로 빈 폴더가 아닌 전체 폴더를 사용하지 않을 것 -type입니다.
Eliah Kagan

알았어, 잠깐만
AB

제 경우에는 find ... -delete"삭제할 수 없습니다 ... 해당 파일이나 디렉토리가 없습니다"라고 말
하십시오.

1

엘리아의 대답에 대한 나의 의견에서 더 자세하게 다시 게시하다

문제는 보이지 않지만 무엇을 찾아야하는지 알 수 있습니다. 파일 이름 끝에 공백이 있습니다. 전체 ls출력 을 복사 / 붙여 넣기 때문에 출력을 강조 표시하거나 게시물을 편집하고 커서를 끝으로 이동하거나 (엘리아가 지적한대로) 편집 기록의 diff를 보면 질문에서 볼 수 있습니다. ls이 스크린 샷에서 게시물 의 출력을 강조 표시했습니다 .

여분의 공간

주석과 함께 문제를 복제하는 빠른 작은 터미널 세션 :

$ 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

bash가 공백을 올바르게 벗어날 수있을만큼 똑똑하기 때문에 탭 완성을 사용 하면 문제를 완전히 회피 할 수 있습니다 (일반적으로 좋은 습관이기도하며 입력 경로가 너무 빨라집니다) .

예를 들어, 내가 입력 한 rm f<tab>경우 rm foo\<space><space>위의 코드 블록의 마지막 예와 같이로 자동 완성됩니다 .


lsStackOverflow에서 비슷한 일이 한 번 발생했기 때문에 출력 복사 / 붙여 넣기에 대해 특별히 언급 합니다. 질문을 게시 할 때 사용자가 코드를 다시 입력하는 대신 복사 / 붙여
넣기도

0

한 번, 노틸러스를 루트로 여는 파일을 만들었지 만 노틸러스에서 볼 때 파일 이름은 "파일 브라우저 (루트)"였습니다.

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

내가 가진 유일한 대답은 "rm : 'File Browser (Root) .desktop'을 제거 할 수 없습니다 : 그런 파일이나 디렉토리가 없습니다"

그런 다음 내가 실행할 때 :

$ ls -l

파일 이름이 실제로 "Nautilus-root.desktop"인 것을 보았습니다.

그래서 나는 달린다.

$ sudo rm "Nautilus-root.desktop"

나를 위해 일한, 그것이 도움이되기를 바랍니다!


0

그래서 나는이 문제가 있었고 이것들 중 어느 것도 나를 위해 일하지 않았다. 효과가 있었던 것은 정확히 같은 이름의 파일을 만드는 것이 었습니다. 이름이 Example.1.2.3 인 폴더이므로 새 폴더를 만들고 삭제하지 않은 폴더와 정확히 동일한 이름을 지정했습니다. 이전 폴더가 사라지고 새 폴더를 삭제했습니다.


0

Mac에서 Pictures 디렉토리 rsync를 백업 하고 Ubuntu에서 읽은 후에 비슷한 상황이 발생 했습니다. 이름은 다르지만 내용은 같은 두 개의 파일 (실제로는 디렉토리)이있었습니다. 노틸러스를 사용하여 휴지통에 하나를 삭제했지만 명령 행에서도 다른 것을 삭제할 수 없습니다. 그것은 말할 것이다 :

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

ls -i -l로 inode 번호를 확인한 후 두 디렉토리 모두 동일한 inode 번호를 갖는 것으로 나타났습니다. 하드 링크처럼 보입니다 ...

해결책은 놀랍도록 간단했습니다. 아이콘을 마우스 오른쪽 버튼으로 클릭하여 휴지통을 비 웁니다. 그 후 두 디렉토리가 모두 사라졌습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.