Não é possível excluir um arquivo com um '?' no nome do arquivo

1

Não é possível excluir um arquivo com um '?' no nome do arquivo, ele não consegue excluir com a mensagem "o arquivo não existe".

Eu experimentei o terminal usando

rm -f ./pathtofile\?.mkv

Mas, apesar de nenhuma mensagem de falha, o arquivo ainda existe. Alguma sugestão?

    
por Noki 15.03.2016 / 00:27

3 respostas

1

O ? é provavelmente outro símbolo não-ASCII que o programa do terminal não consegue exibir, portanto exibe ? . Isso é facilmente comprovado - você pode executar touch ?.mkv e rm ?.mkv - ambos os comandos são executados bem.

Arquivos como esse são facilmente excluídos usando um gerenciador de arquivos GUI.

Como alternativa, você pode tentar usar curingas. Se o comando:

ls pathtofile\FewLetters*.mkv

lista um único arquivo que você pode executar com segurança:

rm pathtofile\FewLetters*.mkv'.

Finalmente, você pode tentar a maneira mais difícil, mas mais segura, conforme descrito em Não é possível excluir arquivos contendo caracteres especiais no nome do arquivo , conforme indicado pelo Android Dev acima.

    
por sмurf 15.03.2016 / 01:23
3

O arquivo realmente tem um ? no nome do arquivo, ou é um caractere não imprimível que ls mostra como ? ?

$ touch $'a\ab' 'a?b'
$ ls
a?b  a?b

Um arquivo tem um caractere ASCII BELL no nome e o outro tem um ponto de interrogação antigo.

As versões mais recentes de ls podem mostrar caracteres especiais em um formato mais claro por padrão:

$ touch $'b\aa'
$ ls
'b'$'\a''a'

ls -q é como versões antigas de ls exibem caracteres não imprimíveis por padrão. Então, se você acabou de fazer ls em qualquer versão atual do Ubuntu, é provável que você veja apenas pontos de interrogação.

Tente, em vez disso, um dos seguintes:

$ ls -b
a?b  a\ab
$ printf "%q\n" *
a\?b
$'a\ab'

Se a saída de um desses itens não tiver pontos de interrogação, o nome do arquivo não terá pontos de interrogação.

Você pode usar a saída de printf para excluir:

rm a\?b
rm $'a\ab'

Ou confie na conclusão da tabulação:

$ rm a<tab>
a?b   a^Gb 

Se ele mostrar ^G , então pressione Ctrl V e então Ctrl G para inseri-lo. Ou diga bash para percorrer as conclusões das guias :

$ bind tab:menu-complete
$ rm a<tab>
$ rm a\?b<tab>
$ rm a^Gb

Em ambos os casos, usar rm a?b poderia funcionar, mas é perigoso. Ele corresponderia a todos os nomes de arquivos começando com a , terminando em b e tendo um caractere entre eles:

$ touch acb; printf "%q\n" a?b
a\?b
$'a\ab'
acb

Portanto, se você usar rm a?b (ou pior, rm a*b ), poderá excluir os arquivos que não pretendia.

    
por muru 15.03.2016 / 01:58
2

rm -f 'path?.mkv' funciona para mim. Corrija-me se estiver errado, mas o ' ' desativa a funcionalidade de alguns caracteres especiais, como ? . Desculpem a má formatação, o aumento na velocidade tem que ser rápido.
Espero que ajude, tenha um bom dia =)

    
por IcyIcyIce 15.03.2016 / 01:34