인쇄되지 않는 문자가 포함된 파일 제거 [중복]

인쇄되지 않는 문자가 포함된 파일 제거 [중복]

실수로 생성되어 이름이 매우 잘못된 파일을 발견했습니다. 출력 ls -lq:

ls -lq
total 2
-rw-r--r--. 1 mbyx7ag2 zk01 0 May  1  2014 ???E@X?p@8?@

나는 이것을 죽이려고 여러 번 시도했지만 지금까지 소용이 없었습니다. ls파일을 표시하고 사용할 수 있음에도 불구하고 파일이 존재하지 않아 오류가 발생할 때마다 stat:

stat ^A?E\@X?p\@8^H\@ 
  File: `\001\360\265E@X\342p@8\b@'
  Size: 0           Blocks: 3          IO Block: 32768  regular empty file
Device: 1ah/26d Inode: 5239755888  Links: 1
Access: (0644/-rw-r--r--)  Uid: (231058/mbyx7ag2)   Gid: (10027/    zk01)
Access: 2014-05-01 15:47:28.638919596 +0100
Modify: 2014-05-01 15:47:28.638919596 +0100
Change: 2014-05-01 15:47:28.638919596 +0100

흥미롭게도 거기에 있는 stat 명령은 탭 완성의 결과이며 다른 곳에서 사용되는 이름과 완전히 다르게 보입니다.

나는 다음 질문에 대한 아이디어를 시도했습니다.

이름이 없는 파일을 삭제하는 방법

인쇄할 수 없는 문자만 포함된 파일을 찾는 방법이 있습니까?

저도 이 두 가지 방법을 시도해 보았는데요파일 이름에서 인쇄되지 않는 문자 제거 - Arctic Regional Supercomputing Center("인쇄되지 않는 문자 제거" 아래).

걱정스럽게도 inode를 사용하는 소위 "완벽한" 기술은 다음과 같습니다.

ls -i
5239755888 ???E@X?p@8?@
find . -inum 5239755888 -delete
find: cannot delete `./\001\360\265E@X\342p@8\b@': No such file or directory

작동하지 않습니다.

이 파일을 삭제하는 데 사용할 수 있는 다른 방법을 아는 사람이 있나요?

답변1

인쇄한 통계가 올바른 파일 이름인 것 같습니다(디렉토리에 저장되어 있음).

  File: `\001\360\265E@X\342p@8\b@'

다음을 사용하여 이름(바이트 단위)을 재구성할 수 있습니다.

$ printf '%b' '\001\360\265E@X\342p@8\b@' | od -An -tx1
soh   p   5   E   @   X   b   p   @   8  bs   @
 01  f0  b5  45  40  58  e2  70  40  38  08  40

보시다시피 문자열은 제어 문자(soh) 또는 16진수 0x01(8진수\001)로 시작됩니다. 이로 인해 나쁜 결과(파일을 지우기 어려움)와 좋은 결과(동일한 이름을 가진 파일이 디렉터리에 존재할 가능성이 낮아짐)가 모두 발생합니다.

(안전을 위해) 모든 (기타) 파일을 디렉토리 밖으로 이동한 후.

rm을 입력한 다음 파일의 첫 번째 문자(soh)를 입력하고 별표( )를 입력하여 파일을 삭제해 볼 수 있습니다 *(실행한 것과 유사 ) erase a*. 타이핑의 요령 0x01은 와 를 동시에 입력 Ctrl 하고 v, 와 를 입력하는 것 Ctrl입니다 A(교대 필요 없음). ^A커서 위치에 나타나야 합니다. 그런 다음 별표를 입력합니다 *. 콘솔에 다음 줄이 표시되어야 합니다.

rm ^A*

그런 다음 Enter를 누르면 파일이 사라집니다.

그래도 작동하지 않으면(몇 번 시도) 항상 핵무기 솔루션이 있습니다. 다른 모든 파일을 이동 및 삭제하고 상위 디렉터리로 변경한 후 다음을 수행합니다.

rm -rf ./CorrectDirectory        ### Be careful this will erase ANYthing.

전체 디렉터리(파일 포함)가 사라집니다.

답변2

이름의 실제 문자를 알고 있으므로 다음에 설명된 대로 파일 이름에 대한 올바른 이스케이프 시퀀스를 작성하기만 하면 됩니다.http://tldp.org/LDP/abs/html/escapingsection.html

  1. 만들다

    $ echo test > $'\001\360\265E@X\342p@8\b@'
    $ stat $'\001\360\265E@X\342p@8\b@'
      Fichier : ''$'\001\360\265''E@X'$'\342''p@8'$'\b''@'
       Taille : 5           Blocs : 8          Blocs d'E/S : 4096       fichier
    Périphérique : 10302h/66306d    Inœud : 6948089     Liens : 1
    Accès : (0640/-rw-r-----)  UID : ( 1001/username)   GID : (                                 1003/jrousseau)
    Accès : 2018-06-20 11:40:44.333208199 +0200
    Modif. : 2018-06-20 11:40:47.589113454 +0200
    Changt : 2018-06-20 11:40:47.589113454 +0200
      Créé : -
    
  2. 삭제

    $ rm -i $'\001\360\265E@X\342p@8\b@'
    rm : supprimer fichier ''$'\001\360\265''E@X'$'\342''p@8'$'\b''@' ? y
    $
    

답변3

간단한 방법은 mc.

귀하의 경우에는 stat파일을 볼 수 있지만 rm볼 수는 없습니다. 이것은 매우 이상합니다. 이는 실제로 파일 시스템에 문제가 있을 수 있습니다. (노력하다 fsck.)

strace추가 디버깅을 위해 한 명령은 파일을 볼 수 있고 다른 명령은 볼 수 없는 이유를 조사해 볼 수도 있습니다 .

또 다른 아이디어는 rm -r전체 디렉토리를 삭제하는 것입니다. (아마도 내부의 중요한 파일을 모두 백업한 후일 것입니다.)

답변4

  • 디렉토리의 모든 파일을 나열하고 이름을 file_list에 저장합니다.
  • 삭제하려는 파일을 제외한 모든 파일을 삭제하려면 file_list를 편집하세요.

for f in \`cat file_list\` 
do
   /bin/rm  -i  $f   # option i to be extra safe 
done 

관련 정보