어떤 이유로 프로그램이 더 이상 삭제할 수 없는 손상된 파일 이름을 가진 파일을 생성했습니다. 파일을 삭제하려고 하면 파일이 존재하지 않는 것처럼 "해당 파일 또는 디렉터리가 없습니다"라는 메시지가 표시됩니다.
문제는 파일 이름의 제어 문자 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
비슷한 질문을 찾았는데 그에 대한 답변이 효과가 없었습니다.
- https://serverfault.com/questions/565914/remove-corrupt-file-with-bad-file-name-linux
- 삭제할 수 없는 디렉터리를 삭제하는 방법은 무엇입니까?
기타 정보:
$ 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
잘 작동합니다.