Como você remove um arquivo cujo nome de arquivo começa com um hífen (hífen ou menos) -
? Estou ssh'd em um servidor OSX remoto e tenho este arquivo no meu diretório:
tohru:~ $ ls -l
total 8
-rw-r--r-- 1 me staff 1352 Aug 18 14:33 --help
...
Como no mundo eu posso excluir --help
de uma CLI? Esse problema é algo que, de vez em quando, me deparei com diferentes formas; esses arquivos são fáceis de criar, mas difíceis de se livrar.
Eu tentei usar barra invertida
rm \-\-help
Eu tentei aspas
rm "--help"
Como evito que o caractere de menos (traço ou hífen) seja interpretado como uma opção?
Use "-" para fazer com que o rm pare de analisar as opções da linha de comando, assim:
rm -- --help
Ou você pode fazer
rm ./--help
Use find
para fazer isso:
find . -name '--help' -delete
E este é um bom método, porque se você tiver mais do que alguns arquivos como esse, poderá excluir uma lista de visualização dos arquivos, executando simplesmente find sem o -delete
opção primeiro e, em seguida, se a lista de arquivos estiver boa, execute-a novamente com -delete
.
De fato, evitar rm
em favor de find
(especialmente com a visualização prévia) é um bom hábito que o ajudará a evitar erros com rm *
que inevitavelmente o morderá um dia.
Observe, porém, que essa localização será repetida em todos os seus subdiretórios, portanto, você pode executá-lo com uma restrição de profundidade de subdiretório como esta:
find . -maxdepth 1 -name '--help' -delete
que limita a localização ao diretório atual.
As respostas de Vegar Nilsen e edfuh são muito boas e as soluções adequadas para um problema como esse.
Desejo adicionar uma resposta geral a esta pergunta que permita excluir qualquer arquivo com um nome de arquivo difícil. Primeiro, seu número de inode é obtido usando ls -i
ou alguma forma de stat
e, em seguida, o arquivo é removido pesquisando arquivos no diretório atual pelo número do inode e executando o comando rm
no arquivo com um número de inode correspondente
find . -inode <inode> -exec rm {}\;
Como os números de inode são exclusivos em cada sistema de arquivos, você pode remover qualquer arquivo usando isso; unicode ou usando caracteres de escape. É como é muito chato digitar, então eu recomendaria adicionar a linha
TAB: menu-complete # Tab: Cycles through the command
"\e[Z": menu-complete-backward # Shift-Tab: Cycles backwards
dentro de voce .inputrc
se você estiver usando o bash. Isso permite que você percorra a lista de possíveis conclusões ( para obter mais informações ).
Uma solução brutal:
Perl -e "unlink '--help' or die 'Could not unlink.';"
Perl -e "rmdir '-d' or die 'Could not rmdir.';"
Passo a passo do Linux de criação de um arquivo com hífens e espaços e removê-lo.
SEJA CUIDADOSO! Não execute acidentalmente um rm -rf /
ou comando de exclusão em cascata semelhante.
Se o arquivo que você está tentando remover incluir asteriscos ou barras, não bombeie acidentalmente um .
ou /*
ou *
ou algum outro caractere curinga que poderia excluir o sistema operacional em cascata.
Crie um arquivo chamado "--yo yo"
[email protected] ~ $ touch -- "--yo yo"
[email protected] ~ $ ls
bin --yo yo
Primeiro, encontre-o com find:
[email protected] ~ $ find . -name "*--yo yo*"
./--yo yo
Certifique-se de que o comando find encontre SOMENTE o arquivo ONE que você deseja excluir:
Em seguida, passe a opção -delete para encontrar e excluí-los:
[email protected] ~ $ find . -name "*--yo yo*" -delete
[email protected] ~ $ ls
bin
Aaaannd se foi.
Midnight Commander (mc
) é o mais fácil, basta apontar para ele e pressionar F8;)
aqui está uma solução que eu tinha usado antes de encontrar esta discussão.
use vim
para 'editar' o diretório:
vim .
então (no vim) selecione seu arquivo, pressione del e confirme a exclusão.
quando terminar, saia do vim com :q
Você tentou adicionar o nome do diretório como prefixo:
$ rm ./-filename.txt dirname/-filename2.txt
$ mv ./-filename.txt filename.txt
$ cp teste ./-teste
Usar o diretório como prefixo do arquivo em geral ajuda a evitar a interpretação incorreta do caractere "menos" como uma opção de comando pela função de analisador.