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


17

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

파일 관리자 스크린 샷

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

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

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의 파티션에서 명령을 실행 했지만 아무것도 변경되지 않았습니다.

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


1
암호화 된 홈 디렉토리를 갖도록 시스템을 설정 했습니까?
dobey

@dobey 나는하지 않았다.
karjedavpalaa

5
@Panther 당신은 착각합니다. 이것은 그 자체로는 손상된 파일 시스템을 나타내는 것이 아니며 , 어떤 종류의 데이터 손상 으로 인해 발생 하더라도 fsck는 그것에 대해 아무 것도하지 않습니다.
zwol


1
이름에 인식 할 수없는 문자가있는 파일이 있습니다. 파일 이름 바꾸기가 효과가있었습니다. 그런 다음 삭제할 수 있습니다.
ravery

답변:


35

간단한 방법은 이러한 파일을 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 번호를 추가 할 수 있습니다 .


4
어때요 rm -ri .?
브렌트 바 칼라

이것은 작동했습니다 : find <somepath> -inum <inode_number> -exec rm -i {} \; 명령에서 '-inum', '{}'및 '\'의 기능은 무엇입니까?
karjedavpalaa 2014

한 번에 여러 파일을 어떻게 제거합니까? 또한, 당신은 내 하루를 만들어 주셔서 감사합니다!
karjedavpalaa 2014

2
@BrentBaccala rm -ri .는 inode로 파일을 삭제하지 않습니다. 그것은 전체 작업 디렉토리를 통해 재귀하고 각 파일을 제거 할 것인지 묻습니다. 원치 않는 파일을 실수로 제거하지 않도록 요청하는 파일을 매우 세 심하게 고려해야합니다. 확실히 내 홈 디렉토리 에이 명령을 사용하고 싶지 않습니다. 많은 파일이 포함되어 있습니다. ;)
Malte Skoruppa

3
@karjedavpalaa (1) -inumfindinode 번호로 파일을 찾도록 지시 합니다. (2) {}에서 찾은 파일과 일치합니다 grep. (3) \는 ;기호를 이스케이프 하여-exec 옵션으로find . (4) 여러 파일을 한 번에 제거하는 방법을 설명하기 위해 답변을 편집했습니다.
Malte Skoruppa

13

이것이 "파일 시스템 손상"의 종류 가 아님 을 이해하는 것이 중요합니다 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)


rename --version 알 수없는 옵션 : version
Geek

@ElderGeek 무엇을 file $(which rename)인쇄합니까? ( file먼저 패키지가 설치되어 있는지 확인하십시오 .)
zwol

/usr/bin/rename: symbolic link to /etc/alternatives/rename( file기본적으로 설치되어 있음) 실제로 심볼릭 링크를 쫓아 내야 /usr/bin/file-rename: a /usr/bin/perl -w script, ASCII text executable 하지만 man rename더 빠른 표시입니다.
Geek

@ElderGeek 만약 그것이 펄 스크립트라면, 아마도 "펄에서 유래 한 것"의 구 버전 일 것입니다 --version; 내가 제안한 명령은 여전히 ​​작동합니다. (데비안 불안정을 실행하는 내 컴퓨터의 /usr/share/doc/rename/changelog.gz --version는 2013 년에 Perl 이름 변경 버전 0.10에 추가 되었음을 나타냅니다 . 그러나이 프로그램은 2007 년 이후 실제로 기능을 변경하지 않았 으므로 (!) 괜찮습니다.)
zwol

아! 그것은 혼란을 설명합니다. 반대 주장에도 불구하고 데비안은 우분투가 아닙니다. 모든 릴리스에 대해 말할 수는 없지만 현재 지원되는 일부 Ubuntu LTS (14.04) 버전에는 아직 해당 기능이 없습니다. (16.04는하지만)
Geek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.