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


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) -inum은 findinode 번호로 파일을 찾도록 지시 합니다. (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.