파일 이름에 특수 문자가있는 파일을 삭제 / 이동할 수 없습니다 aalap

아래에서 볼 수 있듯이 파일에는 일반적이지 않은 문자가 있습니다.

파일 관리자 스크린 샷

터미널이나 돌고래에서 삭제하면 오류가 반환됩니다.

그러한 파일이나 디렉토리가 없습니다

ls -la디렉토리에서 실행 하면이 출력이 나옵니다.

-rw-rw-r--  1 aalap aalap      0 Nov 14 01:05 ??
-rw-rw-r--  1 aalap aalap      0 Nov 14 01:05 ?2?.???љ?!?Gb??σ?[?F?
-rw-rw-r--  1 aalap aalap      0 Nov 14 01:05 ??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??
-rw-rw-r--  1 aalap aalap      0 Nov 14 01:05 3l??#g?w????O?JKB7?co??քH??bT?NA???S???X?I?A?qC??M?I???
-rw-rw-r--  1 aalap aalap      0 Nov 14 01:05 ??8??-?@,?Zp?[?bI????7^?ñ[?ڏ??z?O???ч??eEȰ?+??,OF??h

fsck다른 OS의 파티션에서 명령을 실행 했지만 아무것도 변경되지 않았습니다.

이 파일들을 어떻게 제거합니까?



답변

간단한 방법은 이러한 파일을 inode로 제거하는 것입니다. 🙂

사용 ls -li예를 들어, 각 파일의 아이 노드 번호를 표시하는 드문 문자로 디렉토리에,

$ ls -li
total 0
133370 -rw-r--r-- 1 malte malte 0 Dec 30 19:00 ?2?.???љ?!?Gb??σ?[?F?
132584 -rw-r--r-- 1 malte malte 0 Dec 30 18:59 ??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??

다음 find유틸리티를 사용 find <somepath> -inum <inode_number> -exec rm -i {} \;하여 다음 예제와 같이 구문을 사용하여 해당 파일을 이름별로 삭제하십시오 .

$ find . -inum 133370 -exec rm -i {} \;
rm: remove regular empty file ‘./?2?.???љ?!?Gb??σ?[?F?’? y
$ ls -li
total 0
132584 -rw-r--r-- 1 malte malte 0 Dec 30 18:59 ??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??

-i에 대한 옵션은 rm그냥 제거 말은하지 않았다 실수로 삭제 된 파일에서 당신을 유지하는 데 추가, 정말 필요가 없습니다. 🙂 rm삭제하려는 각 파일에 대해 확인을 요청합니다.

inode로 여러 파일을 제거하려면 다음에 대해 -o(의미 또는 ) 구문을 사용할 수 있습니다 find.

$ find .  \( -inum 133370 -o -inum 132584 \) -exec rm -i {} \;
rm: remove regular empty file ‘./?2?.???љ?!?Gb??σ?[?F?’? y
rm: remove regular empty file ‘./??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??’? y

표현식을 괄호로 묶어 더 많은 -o -inum <inode_number>표현식을 사용 하여 더 많은 inode 번호를 추가 할 수 있습니다 .


답변

이것이 “파일 시스템 손상”의 종류 가 아님 을 이해하는 것이 중요합니다 fsck. 파일 시스템에 관한 한, 단일 바이트가 0x00 (ASCII NUL, C 문자열 끝 마커) 또는 0x2F ( 디렉토리 분리 자) 값을 갖지 않는 한 파일 이름은 임의의 바이트 시퀀스 일 수 있습니다 /. (파일 이름에 어떻게 든 00 또는 2F 바이트가 포함되어 있으면 fsck수정해야합니다.)

오히려 응용 프로그램 소프트웨어 (Dolphin, ls)에 “로케일”에 표시 할 수 없는 문자가 포함되어 있다고 생각 하는 파일 이름이 있으므로 자리 표시 자 문자로 대체합니다. 해당 문자를 입력 할 수 없으므로 파일을 조작하는 것이 더 어렵지만 이름을 입력하거나 복사하여 붙여 넣지 않고도 파일을 조작 할 수 있습니다. 예를 들어 Dolphin 내에서 문제 파일을 직접 삭제하거나 이름을 바꾸면 그냥 작동합니다 (작동하지 않으면 Dolphin의 버그입니다).

쉘에서 그들에 대해 무언가를해야하는 경우 (예를 들어, rootGUI 프로그램 이 소유 하고 따라서 GUI 프로그램으로 수정할 수없는 경우) “글로브”패턴을 사용하여 간접적으로 이름을 지정할 수 있습니다.이 패턴은 올바른 순서로 확장됩니다. 바이트 수와 함께 전달되었습니다.

물론, 글로브 패턴이 너무 일치하여 실수로 물건을 삭제하고 싶지 않으므로 Perl rename유틸리티를 사용하여 각 파일 이름을 16 진수 인코딩으로 변환 하는 것이 좋습니다 .

$ rename '$_ = unpack("H*", $_)' *

이것은 정보 자체를 손상시키지 않습니다. 파일 자체도 아니고 파일 이름이 원래 엉망이되기 전에 인코딩 된 의미도 없습니다. 예를 들어 특정 파일의 경우에는 취소 할 수 있습니다.

$ rename '$_ = pack("H*", $_)' 696d706f7274616e742e646f63

주의 : 이름 rename이 서로 다른 두 개의 프로그램이 있습니다. 위의 명령은 Perl에서 시작된 명령에서만 작동합니다. 우분투에서 원하는 것은 “util-linux”패키지가 아닌 “rename”패키지에있는 것입니다. rename -h구별합니다 : 이것은 당신이 원하는 것입니다 …

$ rename -h
Usage:
    rename [ -h|-m|-V ] [ -v ] [ -n ] [ -f ] [ -e|-E perlexpr]*|perlexpr
    [ files ]
# ...

… 이것은 당신이 원하는 것이 아닙니다 …

$ rename -h

Usage:
 rename [options] <expression> <replacement> <file>...
# ...

중요한 것은 “perlexpr”입니다. 위의 모든 옵션을 이해하지 못하는 이전 버전의 Perl 이름 변경이있을 수 있지만, 내가 보여준 명령은 여전히 ​​작동합니다.

편집 : 14.04 .5에서 포함 된 perl 스크립트 rename 는 -h 스위치를 지원하지 않습니다. 맨 페이지에 맨 페이지가 포함 man rename되어 있는지 맨 페이지를 확인하여 올바른 것을 확인할 수 있습니다.

RENAME (1) Perl 프로그래머 참조 안내서 RENAME (1)


답변