Remove o arquivo linux nomeado com o conjunto de caracteres responsivos do shell

7

Eu criei um arquivo chamado \;:$"\' para testar um software meu. Acabei com um erro, porque não consigo excluir a propriedade do arquivo. Estou tentando encontrar uma combinação precisa de caracteres para removê-lo via rm , mas não consigo encontrar um caminho.

rm \;:$\"\\'
rm: cannot remove '\': No such file or directory

rm "\"\;:$\"\\'
rm: cannot remove '\;:$"\\'': No such file or directory

rm '\;:$"\'''
rm: cannot remove '\;:$"\': No such file or directory

(esta última tentativa me matou)

E muitas outras tentativas. Ajuda necessária!

    
por Alex 24.03.2015 / 13:37

8 respostas

12

Se o nome do arquivo for exatamente \;:$"\' , você poderá removê-lo com:

rm \\;\:\$\"\\'

Apenas ecape todos os caracteres com um único \ .

    
por 24.03.2015 / 14:10
5

Você pode tentar ls -li no diretório que contém o arquivo e excluir o arquivo com o inode retornado emitindo find . -inum <inode-number> -exec rm -i {} \;

Eu adicionei o -i ao comando find para avisar antes da exclusão, caso outro arquivo seja encontrado pelo comando find do que você espera.

Além do comentário, tentei criar e remover o arquivo sozinho:

ls -l
total 0
-rw-r--r-- 1 test test 0 mrt 24 14:11 \;:$"\'

[test@testhost +1] /tmp/ff$ rm \\;\:\$\"\\' 

[test@testhost +1] /tmp/ff$ ls -l
total 0
    
por 24.03.2015 / 13:41
2

Você pode usar aspas simples e só precisa se preocupar em citar a citação única em si.

rm '\;:$"\'\'

No uso interativo, você pode simplesmente usar a conclusão de tabulação, começando com '\ ou \ . A conclusão da tabulação de '\ yields '\;:$"\'\''' , já que o bash simplesmente substitui cada cotação única incorporada por '\'' . Conclusão de tabulação de nada ou de \ yields \\;\:\$\"\\' .

    
por 24.03.2015 / 18:28
2

No bash e em shells similares

read -r; rm "$REPLY"

depois basta digitar o nome do arquivo literalmente, \;:$"\' e pressionar Enter. O comando read lê uma linha da entrada padrão e a salva na variável REPLY . O -r sinalizador diz para ler a linha literalmente e não interpretar as barras invertidas como seqüências de escape. A citação de $REPLY garante que o conteúdo de REPLY seja passado para rm como um único argumento, portanto, isso também funcionará mesmo que o nome do arquivo contenha espaços ou tabulações.

(Nota: Se o nome do arquivo contiver caracteres de nova linha, aparentemente você pode usar a opção -d para read para alterar o caractere de terminação da string que deseja inserir.)

    
por 24.03.2015 / 23:50
1

Se você não estiver limitado a usar bash ou outro ambiente de script de shell, uma maneira fácil de remover esse arquivo provavelmente seria escrever um programa curto que simplesmente chama unlink() em seu idioma favorito ou usar um gerenciador de arquivos como o Gnome Commander ou o Midnight Commander para excluir o arquivo manualmente. A última opção permitiria selecionar o arquivo em questão e excluí-lo sem precisar inserir o nome do arquivo em lugar algum, o que eliminaria a possibilidade de metacaracteres terem qualquer significado especial.

    
por 24.03.2015 / 14:15
0

Tente isso,

$ rm \\;\:\$\"\\'

"\" é usado como uma seqüência de escape no script bash que tem um significado literal.

    
por 24.03.2015 / 14:12
0

Eu acho mais fácil nesses casos digitar / escapar no máximo alguns caracteres e então deixar o bash completar o comando com <TAB> : bash então certifique-se de citar o material adequado para seus próprios propósitos.

Nesse caso, se eu fizer

touch '\;:$"\'\'
rm \ <TAB>

a conclusão para <TAB> repetido vai para

rm \
rm \\
rm \\\\
rm \\;\:\$\"\\' 

Agora, estou realmente um pouco perdido, explicando os estágios intermediários, mas a proposta final é sensata.

Como regra geral, quando não estou usando a conclusão, costumo citar tudo, incluindo-o em '...' marks. Obviamente, você precisa escrever ' como '\'' , ou seja, terminar as aspas, escrever \; para produzir um único ' e reinserir outra string entre aspas. Essa é a receita que usei para o comando touch, exceto pela omissão do '' final resultante, já que ele não adiciona nada.

    
por 24.03.2015 / 15:22
0

Outra boa solução é instalar oh-my-zsh ,
digite rm e a guia no arquivo que você deseja excluir. ;)

    
por 22.05.2015 / 02:59