Removendo um arquivo com caracteres não imprimíveis [duplicado]

3

Eu me deparei com um arquivo criado acidentalmente e com um nome de arquivo realmente errado. A saída de ls -lq :

ls -lq
total 2
-rw-r--r--. 1 mbyx7ag2 zk01 0 May  1  2014 ???E@X?p@8?@

Eu fiz várias tentativas para matar essa coisa, mas até agora sem sucesso. Toda vez que recebo erros porque o arquivo não existe, apesar de ls mostrar lá e poder stat it:

stat ^A?E\@X?p\@8^H\@ 
  File: '
ls -i
5239755888 ???E@X?p@8?@
find . -inum 5239755888 -delete
find: cannot delete './
ls -lq
total 2
-rw-r--r--. 1 mbyx7ag2 zk01 0 May  1  2014 ???E@X?p@8?@
105E@X2p@8\b@': No such file or directory
105E@X2p@8\b@' Size: 0 Blocks: 3 IO Block: 32768 regular empty file Device: 1ah/26d Inode: 5239755888 Links: 1 Access: (0644/-rw-r--r--) Uid: (231058/mbyx7ag2) Gid: (10027/ zk01) Access: 2014-05-01 15:47:28.638919596 +0100 Modify: 2014-05-01 15:47:28.638919596 +0100 Change: 2014-05-01 15:47:28.638919596 +0100

Curiosamente, o comando stat é o resultado da conclusão da tabulação e não se parece em nada com os nomes usados em qualquer outro lugar.

Eu tentei as ideias nessas perguntas:

Como posso excluir um arquivo sem nome

Existe uma maneira de encontrar arquivos contendo apenas caracteres não imprimíveis?

Eu também tentei os dois métodos de Removendo caracteres não imprimíveis de nomes de arquivos - Supercomputação da região do Ártico Centro (em "Extirpar caracteres não imprimíveis").

O mais preocupante é que o truque supostamente 'infalível' de usar inodes como este:

stat ^A?E\@X?p\@8^H\@ 
  File: '
ls -i
5239755888 ???E@X?p@8?@
find . -inum 5239755888 -delete
find: cannot delete './%pre%105E@X2p@8\b@': No such file or directory
105E@X2p@8\b@' Size: 0 Blocks: 3 IO Block: 32768 regular empty file Device: 1ah/26d Inode: 5239755888 Links: 1 Access: (0644/-rw-r--r--) Uid: (231058/mbyx7ag2) Gid: (10027/ zk01) Access: 2014-05-01 15:47:28.638919596 +0100 Modify: 2014-05-01 15:47:28.638919596 +0100 Change: 2014-05-01 15:47:28.638919596 +0100

não funciona.

Alguém conhece algum outro truque que eu possa usar para me livrar desse arquivo?

    
por Theolodus 03.12.2015 / 10:22

7 respostas

3

O que você imprime parece ser o nome correto do arquivo (conforme armazenado no diretório).

  File: '
$ printf '%b' '
rm ^A*
105E@X2p@8\b@' | od -An -tx1 soh p 5 E @ X b p @ 8 bs @ 01 f0 b5 45 40 58 e2 70 40 38 08 40
105E@X2p@8\b@'

Você pode reconstruir o nome (em bytes) com:

rm -rf ./CorrectDirectory        ### Be careful this will erase ANYthing.

Como você pode ver, a string começa com um caractere de controle (soh) ou 0x01 hexadecimal (Octal \ 001). Isso tem dois efeitos ruins (o arquivo é dificil de apagar) e bons efeitos (é muito improvável que um arquivo com o mesmo nome exista no diretório).

Depois de mover todos os arquivos (outros) para fora do diretório (para estar no lado seguro).

Você pode tentar apagar o arquivo digitando rm , depois o primeiro caractere (soh) do arquivo e um asterisco ( * ) (semelhante ao erase a* ). O truque para digitar o 0x01 é digitar Ctrl e v , liberá-los e digitar tanto Ctrl e A (não há necessidade de mudança). Um ^A deve aparecer na posição do cursor. Em seguida, digite um asterisco * . Você deve ver esta linha no seu console:

  File: '
$ printf '%b' '
rm ^A*
105E@X2p@8\b@' | od -An -tx1 soh p 5 E @ X b p @ 8 bs @ 01 f0 b5 45 40 58 e2 70 40 38 08 40
105E@X2p@8\b@'

Em seguida, pressione enter e, se funcionar, o arquivo deverá desaparecer.

Se isso não funcionar (tente algumas vezes), sempre haverá a solução de nuke. Mova e apague todos os outros arquivos, mude para o diretório pai e faça:

rm -rf ./CorrectDirectory        ### Be careful this will erase ANYthing.

O diretório inteiro (incluindo o arquivo) terá desaparecido.

    
por 03.12.2015 / 22:16
2

Como você sabe os caracteres reais que estão no nome, basta criar a sequência de escape correta para o nome do arquivo, conforme explicado em link

  1. Criação

    $ echo test > $'
    $ rm -i $'
    $ echo test > $'
    $ rm -i $'%pre%105E@X2p@8\b@'
    rm : supprimer fichier ''$'%pre%105''E@X'$'2''p@8'$'\b''@' ? y
    $
    
    105E@X2p@8\b@' $ stat $'%pre%105E@X2p@8\b@' Fichier : ''$'%pre%105''E@X'$'2''p@8'$'\b''@' Taille : 5 Blocs : 8 Blocs d'E/S : 4096 fichier Périphérique : 10302h/66306d Inœud : 6948089 Liens : 1 Accès : (0640/-rw-r-----) UID : ( 1001/username) GID : ( 1003/jrousseau) Accès : 2018-06-20 11:40:44.333208199 +0200 Modif. : 2018-06-20 11:40:47.589113454 +0200 Changt : 2018-06-20 11:40:47.589113454 +0200 Créé : -
    105E@X2p@8\b@' rm : supprimer fichier ''$'%pre%105''E@X'$'2''p@8'$'\b''@' ? y $
    105E@X2p@8\b@' $ stat $'%pre%105E@X2p@8\b@' Fichier : ''$'%pre%105''E@X'$'2''p@8'$'\b''@' Taille : 5 Blocs : 8 Blocs d'E/S : 4096 fichier Périphérique : 10302h/66306d Inœud : 6948089 Liens : 1 Accès : (0640/-rw-r-----) UID : ( 1001/username) GID : ( 1003/jrousseau) Accès : 2018-06-20 11:40:44.333208199 +0200 Modif. : 2018-06-20 11:40:47.589113454 +0200 Changt : 2018-06-20 11:40:47.589113454 +0200 Créé : -
  2. Exclusão

    %pre%
por 20.06.2018 / 11:51
0

Uma maneira fácil é usar um gerenciador de arquivos como mc . Desta forma você pode apenas apontar o arquivo e pedir para deletá-lo sem ter que pensar em escapar de seus personagens.

No seu caso stat é capaz de ver seu arquivo, mas rm não é. Isso é estranho. Isso pode realmente ser um problema com o seu sistema de arquivos. (tente fsck .)

Para mais depuração, você também pode tentar usar strace para verificar por que o único comando é capaz de ver o arquivo, enquanto o outro não é.

Outra ideia seria usar rm -r para excluir o diretório inteiro. (Possivelmente depois de fazer o backup de todos os arquivos importantes).

    
por 03.12.2015 / 10:33
0

Eu tive um problema semelhante com o arquivo chamado '?'

-rw-rw-r-- 1 user user     0 Jun  2 14:41 ?

A estatística mostra:

  File: '
rm: cannot remove '?': No such file or directory
1' Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: fd00h/64768d Inode: 3538984 Links: 1 Access: (0664/-rw-rw-r--) Uid: ( 502/ user) Gid: ( 100/ user) Access: 2016-06-02 14:41:38.997378769 +0200 Modify: 2016-06-02 14:41:38.997378769 +0200 Change: 2016-06-02 14:41:38.997378769 +0200

mas rm '?' ou rm "?" ou rm %code%1 não funcionaram:

user@machine$ rm ./?
rm: remove regular empty file './
-rw-rw-r-- 1 user user     0 Jun  2 14:41 ?
1'? y

No entanto, quando coloco o caminho na frente do nome do arquivo, funcionou:

  File: '
rm: cannot remove '?': No such file or directory
1' Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: fd00h/64768d Inode: 3538984 Links: 1 Access: (0664/-rw-rw-r--) Uid: ( 502/ user) Gid: ( 100/ user) Access: 2016-06-02 14:41:38.997378769 +0200 Modify: 2016-06-02 14:41:38.997378769 +0200 Change: 2016-06-02 14:41:38.997378769 +0200

HTH

    
por 13.07.2016 / 08:43
0
  • liste todos os arquivos no diretório e salve os nomes em file_list
  • edite file_list removendo todos, exceto os arquivos, para remover
for f in \'cat file_list\' 
do
   /bin/rm  -i  $f   # option i to be extra safe 
done 
    
por 14.03.2017 / 14:55
-1

Eu não sei o que o rebuliço é sobre. Personagens de fuga fazem muito bem para mim. Gostaria apenas de tab fora o nome do arquivo e adiciona caracteres de escape para si mesmo.

rm -f \?\?\?E@X\?p@8\?@

Mais cedo, quando eu tinha um arquivo começando com -, gostaria apenas de adicionar o caminho antes do nome do arquivo e citar o nome do arquivo como abaixo.

rm -f ./'--exlude=ssh'
    
por 14.01.2017 / 15:52
-1

No meu caso, eu tenho nomes de arquivo engraçados como este:

ls -l
-rw-rw-r--  1 user user       0 oct  3 00:13 ''$'5''@'$'005''P'$'705'

Basicamente, é o mesmo "tipo" de nome de arquivo engraçado que o seu. É apenas outra representação.

A adição de um caminho e tabulação leva a:

ls -l ./
�@���P���

Observe que há nove caracteres neste nome de arquivo.

Cada caractere não imprimível começa com '$' e termina com um '. Então, '$' é a sequência de escape, seguida por um ou mais caracteres não imprimíveis e finalizada por '.

O todo em si é delimitado por '.

stat nos diz:

  File: �@���P���
  Size: 0              Blocks: 0          EA Block: 4096   regular empty file
Device: fd01h/64769d     Inode: 13631791    Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1001/user)   Gid: ( 1001/user)
Access: 2018-10-03 00:13:20.799957386 +0200
Modify: 2018-10-03 00:13:20.799957386 +0200
Change: 2018-10-03 00:13:20.799957386 +0200
 Birth: -

Podemos excluir este arquivo com /

rm ./?@*

Para finalmente responder à sua pergunta, você poderá remover o arquivo usando, por exemplo:

rm ./???E@*

felicidades

    
por 03.10.2018 / 00:44

Tags