Se o nome do arquivo for exatamente \;:$"\'
, você poderá removê-lo com:
rm \\;\:\$\"\\'
Apenas ecape todos os caracteres com um único \
.
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!
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
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 \\;\:\$\"\\'
.
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.)
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.
Tente isso,
$ rm \\;\:\$\"\\'
"\" é usado como uma seqüência de escape no script bash que tem um significado literal.
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.
Outra boa solução é instalar oh-my-zsh ,
digite rm e a guia no arquivo que você deseja excluir. ;)