ti-enxame.com

Como excluo um arquivo cujo nome começa com "-" (hífen a.k.a. traço ou menos)?

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?

377
Bryan Rehbein

Use "-" para fazer com que o rm pare de analisar as opções da linha de comando, assim:

rm -- --help
559
Vegar Nilsen

Ou você pode fazer

rm ./--help
236
edfuh

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.

41
aculich

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 ).

21
Baldur

Uma solução brutal:

Perl -e "unlink '--help' or die 'Could not unlink.';"

Perl -e "rmdir '-d' or die 'Could not rmdir.';"
11
Thomas L Holaday

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.

8
Eric Leschinski

Midnight Commander (mc) é o mais fácil, basta apontar para ele e pressionar F8;)

2
Marcin

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

1
atti

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.

0