Posso tornar o `rm` interativo apenas quando uso globbing? (no bash ou no zsh ou em ambos)

15

Sempre que eu rmmultiplico 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 -fo tempo todo, o que obviamente derrotará todo o propósito.

O que eu gostaria de fazer é rmusar somente -iquando uso globbing e, é -fclaro -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 blahfuncionaria 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.

iconoclasta
fonte
7
Algumas sugestões: com os utilitários GNU, rm -Ié assim -ique só é acionado quando mais de três arquivos ou -rsão passados. Em bash, use o Ctrl-x *atalho de teclado para expandir a glob e inspecionar você mesmo.
Jw013
2
Com o bash, acredito que a resposta é "não". Com o zsh, você pode aproveitar, noglobpor exemplo, aliasing rm to noglob my-rme, 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.
derobert
@derobert: você certamente parece que conhece o zsh muito bem.
Iconoclast
@iconoclast Não, não o zsh, apenas o Google. Estranhamente, descobri isso ao tentar descobrir como fazê-lo no bash. :-P
derobert 28/08
Se você quiser algo que se pareça com rm, mas realmente funcione diferente, eu deveria escrever um script (ou alias / function / function key) chamado myrme deixar esse script fazer as coisas maravilhosas que você gosta.
Walter A

Respostas:

9

Não é fácil. O problema é que quando você faz:

rm -- *.txt

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

alias rm='noglob rm'

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:

'rm'() {
  [[ "$*" = *[*[?]* ]] && set -- -i "$@"
  command rm $~@
}

O problema dessa abordagem, porém, é que esse novo "rm" não vê a diferença entre

rm *

e

rm '*'

Para remover o arquivo chamado *, você precisa escrevê-lo:

rm [*]
Stéphane Chazelas
fonte
-1

Funciona no bash, provavelmente em outras conchas. Coloque no seu.bashrc

function rm() { 
  while test "${1:0:1}" = "-"; do 
    shift
  done
  if test $# -eq 1; then 
    command rm "$1"
  else 
    command rm -i "$@"
  fi
}
doneal24
fonte
3
Você pode usar command rmpara evitar a codificação PATH. Além disso, a abordagem de verificação da contagem de argumentos não é confiável, pois rmpode haver opções.
Jw013
1
O "$ 1" deve ser citado ou isso falhará se o único arquivo passado contiver um espaço. @ jw013 - Você também pode escapar do comando, por exemplo\rm
jordanm 28/08/2012
@jordanm Você está certo sobre a necessidade de citar $1aspas 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.
Jw013 28/08
1
Pelo menos a edição antiga estava funcional - a nova edição descarta as opções de linha de comando do usuário, o que provavelmente não é a coisa correta a se fazer.
Jw013 28/08
@ jw013 - Eu não sabia que funcionava apenas para pesquisas de alias, não para funções. Obrigado pela informação.
Jordanm 28/08