파일 이름이 손상된 파일을 삭제하는 방법은 무엇입니까?

파일 이름이 손상된 파일을 삭제하는 방법은 무엇입니까?

어떤 이유로 프로그램이 더 이상 삭제할 수 없는 손상된 파일 이름을 가진 파일을 생성했습니다. 파일을 삭제하려고 하면 파일이 존재하지 않는 것처럼 "해당 파일 또는 디렉터리가 없습니다"라는 메시지가 표시됩니다.

문제는 파일 이름의 제어 문자 ASCII 2인 것 같습니다.

$ ls
??[????ة?X

$ ls | xxd
00000000: 3f3f 5b3f 3f02 3f3f d8a9 3f58 0a         ??[??.??..?X.

# Typing '?' and letting the bash complete the filename
$ rm \?\?\[\?\?^B\?\?ة\?X 
rm: das Entfernen von '??[??'$'\002''??ة?X' ist nicht möglich: Datei oder Verzeichnis nicht gefunden

$ rm *
rm: das Entfernen von '??[??'$'\002''??ة?X' ist nicht möglich: Datei oder Verzeichnis nicht gefunden

$ ls -i
2532 ??[?????ة?X
$ find -inum 2532 -delete
find: ‘./??[??\002??ة?X’ kann nicht gelöscht werden.: Datei oder Verzeichnis nicht gefunden

재부팅 후 실행을 시도했지만 fsck파일이 여전히 남아 있습니다.

$ zcat /var/log/upstart/mountall.log.1.gz
...
fsck von util-linux 2.25.1
/dev/sdc3: sauber, 544937/6815744 Dateien, 21618552/27242752 Blöcke
...

문제가 있다는 징후가 없습니다. ("자우버" = 깨끗함)

자체 삭제 프로그램을 작성해 보았지만 rm명령이 실패했습니다.

$ cat fix.c
#include <stdio.h>
#include <errno.h>

int main() {
    char filename[20];
    sprintf(filename, "%c%c%c%c%c%c%c%c%c%c%c%c", 0x3f,0x3f,0x5b,0x3f,0x3f,0x02,0x3f,0x3f,0xd8,0xa9,0x3f,0x58);
    printf("filename = %s\n", filename);

    int result = remove(filename);
    printf("result = %d\n", result);
    printf("errno = %d\n", errno);
    perror("Error");
    return 0;
}

$ gcc -o fix fix.c && ./fix
filename = ??[????ة?X
result = -1
errno = 2
Error: No such file or directory

비슷한 질문을 찾았는데 그에 대한 답변이 효과가 없었습니다.

기타 정보:

$ mount | grep " / "
/dev/sdc3 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)

$ uname -a
Linux hera 4.13.0-16-generic #19-Ubuntu SMP Wed Oct 11 18:35:14 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/issue
Ubuntu 17.10 \n \l

이 파일을 제거할 수 있는 방법이 있나요?

답변1

ASCII가 아닌 파일 이름을 가진 파일을 삭제하는 데는 다양한 옵션이 있습니다.

문제의 파일 이름을 사용하여 파일을 생성하고 삭제할 수 있습니다.ANSI C 견적:

# Create the offending file
touch $'\x3f\x3f\x5b\x3f\x3f\x02\x3f\x3f\xd8\xa9\x3f\x58\x0a'

# Verify that the file was created
ls -lib

# Remove the offending file
rm $'\x3f\x3f\x5b\x3f\x3f\x02\x3f\x3f\xd8\xa9\x3f\x58\x0a'

이 게시물을 확인하세요:

다음은 해당 게시물에서 가져온 명령으로, 현재 디렉터리에서 이름에 ASCII가 아닌 문자가 포함된 모든 파일을 삭제해야 합니다.

LC_ALL=C find . -maxdepth 0 -name '*[! -~]*' -delete

전역 패턴을 수정하거나 정규식을 사용하여 일치 범위를 좁힐 수 있습니다.

또 다른 관련 게시물은 다음과 같습니다.

한 가지 제안은 inode를 통해 삭제를 시도하는 것입니다. 먼저 실행하여 ls -lib문제가 있는 파일의 inode를 찾은 후 다음 명령을 실행하여 삭제합니다.

find . -maxdepth 1 -inum ${INODE_NUM} -delete

다음 문서도 일반적으로 유용할 수 있습니다.

답변2

파일이 어느 파티션에 있는지 다시 확인하세요 ;-)

잘못된 파일은 내 루트 파티션이 아닌 cifs마운트 지점에 있는 것으로 나타났습니다. 파일을 삭제하려면 솔루션은 다음과 같습니다.거기:

대상 컴퓨터에서 파일을 삭제합니다. 거기의 명령은 rm잘 작동합니다.

관련 정보