Use "-" para fazer com que o rm pare de analisar as opções da linha de comando, assim:
rm -- --help
Como você remove um arquivo cujo nome de arquivo começa com um traço (hífen ou menos) -
? Eu sou ssh'd em um servidor OSX remoto e tenho esse 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 posso excluir --help
de uma CLI? Esse problema é algo que me deparo de diferentes formas de vez em quando, esses arquivos são fáceis de criar, mas difíceis de se livrar.
Eu tentei usar barra invertida
rm \-\-help
Eu tentei citações
rm "--help"
Como evito que o caractere menos (traço ou hífen) seja interpretado como uma opção?
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 este que você pode excluir, você pode obter uma lista de visualização dos arquivos simplesmente executando find sem a opção -delete
primeiro, e então se a lista de arquivos com boa aparência basta executá-lo novamente com -delete
.
Na verdade, você está evitando rm
em favor de find
(especialmente com a prévia em primeiro lugar) é um bom hábito que ajudará a evitar erros com rm *
que inevitavelmente o morderão algum dia.
Note, no entanto, que find irá recorrer através de todos os seus subdiretórios, então você pode querer 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 este.
Eu quero adicionar uma resposta geral a essa pergunta que permite 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 procurando por arquivos no diretório atual pelo número de 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 únicos em cada sistema de arquivos, você pode remover qualquer arquivo usando isto; unicode ou usando caracteres de escape. É como sempre 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
no seu arquivo .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.';"
Linux Passo a passo de criar um arquivo com traços e espaços e, em seguida, removê-lo.
TENHA CUIDADO! Não execute acidentalmente um rm -rf /
ou um comando de exclusão em cascata semelhante.
Se o arquivo que você está tentando remover incluir asteriscos ou barras, não insira acidentalmente um .
ou /*
ou *
ou algum outro caractere curinga que possa excluir o sistema operacional em cascata.
Crie um arquivo chamado "--yo yo"
eric@dev ~ $ touch -- "--yo yo"
eric@dev ~ $ ls
bin --yo yo
Primeiro, encontre-o com o find:
eric@dev ~ $ find . -name "*--yo yo*"
./--yo yo
Certifique-se de que o comando de localização SÓ encontre o arquivo ONE que você deseja excluir:
Em seguida, passe a opção -delete para encontrar, para excluí-los:
eric@dev ~ $ find . -name "*--yo yo*" -delete
eric@dev ~ $ ls
bin
Aaaannd ele se foi.
Midnight Commander ( mc
) é o mais fácil, apenas aponte para ele e aperte F8;)
aqui está uma solução que eu tinha usado antes de encontrar este segmento.
use vim
para o diretório 'edit':
vim .
então (no vim) selecione o seu arquivo, aperte 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 do analisador.
Se você quiser renomear o arquivo, -.bar
, (mv não funcionará), tente isto:
cat >foo.bar <-.bar
antes de usar o comando:
rm -- -.bar
Você deve ser capaz de examinar o conteúdo do arquivo original em foo.bar
Tags command-line rm shell options quoting