Por que o “rm *” não funciona quando há arquivos que começam com um hífen?

5

de: link

[USER@MACHINE ~] mkdir ejha
[USER@MACHINE ~] cd ejha/
[USER@MACHINE ~/ejha] touch ize
[USER@MACHINE ~/ejha] touch -- -f -i
[USER@MACHINE ~/ejha] ls -l
total 0
-rw-rw-r--. 1 USER USER 0 Sep 20 19:44 -f
-rw-rw-r--. 1 USER USER 0 Sep 20 19:44 -i
-rw-rw-r--. 1 USER USER 0 Sep 20 19:44 ize
[USER@MACHINE ~/ejha] rm *
rm: remove regular empty file 'ize'? y
[USER@MACHINE ~/ejha] ls -l
total 0
-rw-rw-r--. 1 USER USER 0 Sep 20 19:44 -f
-rw-rw-r--. 1 USER USER 0 Sep 20 19:44 -i
[USER@MACHINE ~/ejha] 

informações sobre o sistema:

[USER@MACHINE ~/ejha] echo $SHELL
/bin/bash
[USER@MACHINE ~/ejha] lsb_release -a
LSB Version:    :core-4.0-ia32:core-4.0-noarch
Distributor ID: Fedora
Description:    Fedora release 14 (Laughlin)
Release:    14
Codename:   Laughlin
[USER@MACHINE ~/ejha] rpm -qa | fgrep bash
bash-4.1.7-4.fc14.i686
[USER@MACHINE ~/ejha] 

Por quê? Por que não exclui o arquivo "-f" e "-i"?

    
por LanceBaynes 20.09.2011 / 19:52

2 respostas

16

Ele não está sendo excluído porque reconhece os nomes de arquivos como argumentos (sem aspas, nessa situação * expande para -f -i ize ). Para excluir esses arquivos, use rm -- * ou rm ./* . -- significa o fim dos argumentos, ./ usa o link para o diretório atual para contornar a detecção de argumentos do rm .

Geralmente ./* é preferível, pois alguns programas não aceitam -- para parar de verificar argumentos.

Isso não é um bug. Isso é algo que deve ser tratado chamando rm da maneira correta para evitar tais problemas.

    
por 20.09.2011 / 20:04
4

Só para adicionar um pouco de clareza, o "*" está sendo expandido pelo seu shell, não pelo 'rm', então o comando 'rm' apenas obtém a lista de arquivos como argumentos. Portanto, no seu exemplo, 'rm *' é exatamente equivalente a digitar 'rm -f -i ize'.

Em outros sistemas (por exemplo, a linha de comando do Windows / DOS), o "*" é expandido para uma lista de arquivos pelo próprio comando, portanto o comando 'sabe' que todos os arquivos correspondentes são arquivos. A desvantagem dessa abordagem é que cada comando precisa implementar o globbing e reimplementar as regras de configuração e cotação de globbing, etc.

    
por 26.09.2011 / 21:08