Como apagar um arquivo com nome de arquivo corrompido?

5

De alguma forma, um programa criou um arquivo com um nome de arquivo quebrado que não pode mais ser excluído. Qualquer tentativa de excluir o arquivo resulta em "Nenhum arquivo ou diretório", como se o arquivo não estivesse lá.

O problema parece ser um caractere de controle ASCII 2 no nome do arquivo.

$ 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 '??[??'$'
$ 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
...
2''??ة?X' ist nicht möglich: Datei oder Verzeichnis nicht gefunden $ rm * rm: das Entfernen von '??[??'$'
$ 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
2''??ة?X' ist nicht möglich: Datei oder Verzeichnis nicht gefunden $ ls -i 2532 ??[?????ة?X $ find -inum 2532 -delete find: ‘./??[??
$ 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
2??ة?X’ kann nicht gelöscht werden.: Datei oder Verzeichnis nicht gefunden

Eu tentei executar fsck após a reinicialização, mas o arquivo ainda está lá.

$ 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 '??[??'$'
$ 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
...
2''??ة?X' ist nicht möglich: Datei oder Verzeichnis nicht gefunden $ rm * rm: das Entfernen von '??[??'$'
$ 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
2''??ة?X' ist nicht möglich: Datei oder Verzeichnis nicht gefunden $ ls -i 2532 ??[?????ة?X $ find -inum 2532 -delete find: ‘./??[??
$ 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
2??ة?X’ kann nicht gelöscht werden.: Datei oder Verzeichnis nicht gefunden

Nenhuma indicação de que houve um problema. ("sauber" = limpo)

Eu até tentei escrever meu próprio programa de exclusão que falhou, assim como o comando rm :

%pre%

Eu encontrei perguntas semelhantes e as respostas não funcionam para mim:

Outras informações:

%pre%

Existe uma maneira de se livrar desse arquivo?

    
por theHacker 04.11.2017 / 23:19

2 respostas

2

Sempre verifique novamente em quais partições seus arquivos estão; -)

Acontece que o arquivo incorreto não estava na minha partição raiz, mas em uma cifs mount. Para se livrar do arquivo, a solução era exatamente como / a>:

Exclua o arquivo na maschine de destino. Lá, o comando rm funciona normalmente.

    
por 05.11.2017 / 11:06
3

Existem várias opções para excluir arquivos com nomes de arquivos não-ascii.

Consegui criar e excluir um arquivo com o nome do arquivo em discussão usando ANSI Citação :

# 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'

Veja este post:

Aqui está um comando retirado da postagem que deve excluir todos os arquivos no diretório atual cujos nomes contenham caracteres não ASCII:

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

Você pode modificar o padrão glob ou usar uma expressão regular para restringir as correspondências.

Aqui está outro post relevante:

Há uma sugestão para tentar excluir por inode. Primeiro, execute ls -lib para encontrar o inode do arquivo problemático e, em seguida, execute o seguinte comando para excluí-lo:

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

Você também pode achar o artigo a seguir bastante útil:

por 04.11.2017 / 23:57

Tags