Sempre que eu rm
multiplico itens de uma só vez com o shell globbing e há a menor possibilidade de que o padrão se expanda para mais do que eu esperava, sempre tento me lembrar de adicionar -i
, mas (é claro) eu poderia esquecer e acidentalmente afastar algo útil. Algumas pessoas tentam resolver esse problema com um pseudônimo, como, por exemplo, alias rm='rm -i'
mas eu odeio a idéia de tornar a rm sempre interativa, porque, assim, adquirirei o hábito de usar -f
o tempo todo, o que obviamente derrotará todo o propósito.
O que eu gostaria de fazer é rm
usar somente -i
quando uso globbing e, é -f
claro -i
, substituir , para que eu ainda possa explodir diretórios inteiros com o habitual rm -rf junk
.
Portanto, rm *blah*
seria realmente, rm -i *blah*
mas rm blah
funcionaria exatamente como digitado.
Caso haja uma diferença em como isso pode ser feito em diferentes shells, escolherei uma resposta que forneça métodos para o bash e o zsh em vez de respostas que cobrem apenas uma ou outra.
Nota : Na verdade, não estou convencido de que isso seja necessariamente uma boa ideia; Só estou perguntando se é possível. Se você acha que essa é uma idéia estúpida, eu ficaria muito feliz em ouvir o raciocínio por trás da sua opinião, mas não publique esses comentários no campo de resposta . Respostas reais me dizem como fazer isso ou explicam isso / por que não é possível (ou possivelmente oferecem um método alternativo para obter um resultado semelhante). Mas se você quiser me dizer por que isso é idiota, poste como comentário. Vou votar comentários bem fundamentados, mesmo que eu discorde da conclusão.
rm -I
é assim-i
que só é acionado quando mais de três arquivos ou-r
são passados. Embash
, use oCtrl-x *
atalho de teclado para expandir a glob e inspecionar você mesmo.noglob
por exemplo, aliasing rm tonoglob my-rm
e, em seguida, fazer com que my-rm seja um script que verifique se há um glob, o expande e passa -i ou não. Não tenho certeza, não sei zsh.myrm
e deixar esse script fazer as coisas maravilhosas que você gosta.Respostas:
Não é fácil. O problema é que quando você faz:
O rm apenas vê a lista de arquivos, não o padrão de globbing que já foi expandido pelo shell.
O que você pode fazer é (zsh):
Isso diz ao zsh que os padrões não devem ser expandidos ao chamar rm. Em seguida, você pode redefinir rm como uma função que faz a expansão em si e adiciona o "-i", se necessário, algo como:
O problema dessa abordagem, porém, é que esse novo "rm" não vê a diferença entre
e
Para remover o arquivo chamado
*
, você precisa escrevê-lo:fonte
Funciona no bash, provavelmente em outras conchas. Coloque no seu
.bashrc
fonte
command rm
para evitar a codificaçãoPATH
. Além disso, a abordagem de verificação da contagem de argumentos não é confiável, poisrm
pode haver opções.\rm
$1
aspas duplas, mas errado quanto ao comando escapar. A citação apenas suprime aliases, NÃO pesquisa de função. Esta resposta está sugerindo uma função, não um alias.