그리스어 또는 키릴 문자가 포함된 파일이 있습니다.
그것은 나의 것이 아니고 웹서버 사용자(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
해당 파일 이름을 명령에 전달하는 것입니다.xargs
rm
먼저, 나는 얻었습니다.진짜실행하여 이름이 지정됨
ls -lb
그러면 디렉터리에 있는 파일의 8진수 이름이 표시됩니다. 이 경우에는
\004
.그런 다음 다음과 같이 실행했습니다.
echo "\004" | xargs rm
Idezbox - коробка.jpeg
내 해결 방법은 다음과 같습니다. 위와 같은 방법을 시도할 수 있지만 전체 파일 이름을 8진수( )로 사용하는 것이 좋습니다.
답변3
귀하의 질문은 문제 파일이 NFS 마운트 파일 시스템에 있고 RHEL 클라이언트에서 수행하는 어떤 작업도 파일에 성공적으로 도달할 수 없음을 나타냅니다. 이는 문제가 클라이언트와 NFS 서버 간의 인터페이스와 관련되어 있음을 나타냅니다. 파일을 조작하려면 서버에 직접 로그인해야 하거나 최소한 다른 운영 체제를 실행하는 워크스테이션에서 파일에 액세스해야 할 수도 있습니다.
답변4
@pacoseventeen의 답변은 기본적으로 정확합니다. 중괄호를 큰따옴표로 묶어야 한다고 생각합니다. 나는 대량 이름 바꾸기를 위해 이름 바꾸기를 사용하지 않을 것입니다.
find . -inum INODE -exec mv "{}" NEW_NAME \;
ls -Q
방금 "\033\033"으로 식별된 ??라는 파일에 사용했습니다 .