이상한 문자로 파일 이름을 바꾸는 방법

이상한 문자로 파일 이름을 바꾸는 방법

그리스어 또는 키릴 문자가 포함된 파일이 있습니다.

그것은 나의 것이 아니고 웹서버 사용자(www)의 것입니다.

쉘을 웹 서버 사용자(www)나 루트로 사용할 수는 없었지만 (웹 서버 사용자가 실행한) 스크립트를 사용하여 modbits 디렉토리를 777로, 파일 자체를 666으로 설정했습니다.

파일 이름을 바꾸거나 삭제할 수 없습니다. inode를 사용하고 다음을 사용해도 find:

$ ls -i1
19120017 Idezbox - коробка.jpeg

$ find . -inum 19120017 -exec mv -i {} sane \;
mv: cannot move `./Idezbox - коробка.jpeg' to `sane': No such file or directory

와일드카드 실패:

$ mv Idezbox*.jpeg sane
mv: cannot move `Idezbox - коробка.jpeg' to `sane': No such file or directory

다음 Perl 스크립트도 실패합니다.

find . -type f -print0 | \
perl -n0e '$new = $_; if($new =~ s/[^[:ascii:]]/x/g) {
  print("Renaming $_ to $new\n");
  rename($_, $new);
}'

다음과 같이 인쇄됩니다.

Renaming Idezbox - коробка.jpeg to Idezbox - xxxxxxxxxxxxxx.jpeg

그러나 후속 이름 바꾸기 명령은 효과가 없습니다.
그러나 7개의 그리스 문자와 14개의 "x"-es가 있다는 점에 유의하세요.

위의 디렉터리로 이동하여 "휴지통"을 삭제해 보세요.

$ rm -riv Junk
rm: descend into directory `Junk'? yes
rm: cannot remove `Junk/Idezbox - коробка.jpeg': No such file or directory

일부 요청된 출력:

$ mount | grep "on /ifi/asgard/k00"
asgard:/ifi/asgard/k00 on /ifi/asgard/k00 type nfs (rw,tcp,rsize=32768,wsize=32768,hard,intr,addr=xxx.xxx.xxx.xxx)

$ df .
Filesystem           1K-blocks      Used Available Use% Mounted on
asgard:/ifi/asgard/k00
                     104857600  53201568  51656032  51% /ifi/asgard/k00
$ ls -al
total 88
drwxrwxrwx  2 www     ifiweb   4096 2014-08-11 14:16 .
drwxrwsrwx 14 inf5270 inf5270  4096 2014-08-11 14:15 ..
-rw-rw-rw-  1 www     ifiweb  35176 2012-04-14 13:38 Idezbox - коробка.jpeg
-rwxrw-r--  1 gisle   ifi-a     139 2014-08-11 14:15 perl-rename.sh

$ who ami i
gisle    pts/122      2014-08-11 11:37 (safir.ifi.uio.no:13.0)

모든 댓글과 답변(모두 감사합니다!)을 읽은 후에는 더 이상 이것이 단지 키릴 문자를 이스케이프 처리하거나 인용하는 것이 아니라고 생각합니다. NFS 관점을 살펴봐야 합니다.

2015년 10월 2일에 수정됨:

문제는 NFS와 관련된 것으로 밝혀졌습니다. 파일은 NFS 마운트 볼륨(다른 컴퓨터에서 액세스)에 직접 생성되므로 아무런 효과가 없습니다. 루트로 서버에 직접 로그인하면 시스템 관리자(저는 이 특정 시스템의 사용자일 뿐이므로 이 작업을 수행할 수 없습니다)가 파일을 삭제할 수 있습니다(그리스 문자를 이스케이프하는 표준 방법을 사용함). 고마워하는G-맨(댓글에서) 나를 계속 추적하십시오. 만약에G-맨그래도 그의 의견을 답변으로 바꾸면 수락하겠습니다.

답변1

나는 이것이 오래되었다는 것을 알고 있지만 이상한 문자로 파일 이름을 바꾸려면 다음을 사용할 수 있습니다.

find . -inum INODE -exec rename {} NEW_NAME \;

따라서 이 경우 다음을 사용할 수 있습니다.

find . inum 19120017 -exec rename {} sane \;

답변2

질문의 해당 부분을 고려하지 않고 NFS며칠 전에 이름이 없거나 이름이 비어 있는 파일을 삭제하려고 할 때 비슷한 문제가 발생했습니다. 실제로는 비어 있지 않습니다. 이름은 end of transmission문자 ( )의 8진수 코드 입니다 \004. 그곳에서 어떻게 만들어졌는지는 전혀 모릅니다. 그러나 삭제할 때 수행하는 작업은 echo해당 파일 이름을 명령에 전달하는 것입니다.xargsrm

  1. 먼저, 나는 얻었습니다.진짜실행하여 이름이 지정됨

    ls -lb
    

    그러면 디렉터리에 있는 파일의 8진수 이름이 표시됩니다. 이 경우에는 \004.

  2. 그런 다음 다음과 같이 실행했습니다.

    echo "\004" | xargs rm 
    

Idezbox - коробка.jpeg내 해결 방법은 다음과 같습니다. 위와 같은 방법을 시도할 수 있지만 전체 파일 이름을 8진수( )로 사용하는 것이 좋습니다.

답변3

귀하의 질문은 문제 파일이 NFS 마운트 파일 시스템에 있고 RHEL 클라이언트에서 수행하는 어떤 작업도 파일에 성공적으로 도달할 수 없음을 나타냅니다. 이는 문제가 클라이언트와 NFS 서버 간의 인터페이스와 관련되어 있음을 나타냅니다. 파일을 조작하려면 서버에 직접 로그인해야 하거나 최소한 다른 운영 체제를 실행하는 워크스테이션에서 파일에 액세스해야 할 수도 있습니다.

답변4

@pacoseventeen의 답변은 기본적으로 정확합니다. 중괄호를 큰따옴표로 묶어야 한다고 생각합니다. 나는 대량 이름 바꾸기를 위해 이름 바꾸기를 사용하지 않을 것입니다.

find . -inum INODE -exec mv "{}" NEW_NAME \;

ls -Q방금 "\033\033"으로 식별된 ??라는 파일에 사용했습니다 .

관련 정보