Expande as cartas curinga no comando antes de executá-lo

5

Suponha que eu queira digitar algo assim:

rm build/* tmp/*

Estou prestes a executá-lo, mas quero expandir os curingas antes de executá-los para poder verificar o que está prestes a acontecer. Como posso fazer isso?

Este é o fluxo de trabalho que estou procurando:

$ rm build/* tmp/* <press some magic key>
$ rm build/foo build/bar tmp/wiz tmp/buzz

(Editar) Outro exemplo de fluxo de trabalho:

$ # Check what is in directory: 
$ ls -0
foo1
foo2
bar
$ # I want to delete foo1 and foo2, but want to do so carefully: 
$ rm f*o <press some magic key>
$ rm foo1 foo2

Eu posso expandir outras coisas assim:

cd 'hg root' <Ctrl-x>
cd /users/bob/myMercurialRepository

(porque eu tenho Control-x shell-expand-line no meu ~/.inputrc ).

Eu cavei o man bash olhando as descrições de globbing, mas não consegui encontrar nada interessante.

    
por sixtyfootersdude 10.04.2015 / 23:12

3 respostas

3

Depende do modo de edição do seu shell. Por exemplo, estou usando o modo vi e digite Esc e * e os curingas serão expandidos.

    
por 13.04.2015 / 19:08
6

Que tal

echo rm build/* tmp/*

Ou, na minha versão do bash , clicando na aba guia imediatamente após o caractere curinga me fornecer uma lista de arquivos correspondentes.

Para "excluir arquivos com cuidado", recomendo usar o sinalizador de interação para rm ou novamente prefixar com echo

echo rm -i f*o
rm -i f*o

Evidentemente, nenhum dos dois dará a você a lista preferida.

    
por 10.04.2015 / 23:14
0

Na verdade, o comportamento é o seguinte (a partir de "Learning the bash Shell", de O'Reilly).

  1. Esc \ completará o prefixo comum mais longo se houver mais de uma correspondência, ou completará o nome do arquivo / diretório / ... se houver apenas uma correspondência (adicionando um / se for um diretório).
  2. Esc * comporta-se de forma semelhante, exceto pelo fato de listar todas as conclusões, se houver mais de uma.
  3. Esc = ecoa o que você obteria com Esc * e retorna o que você digitou, sem alterações.

Como exemplo (eu mesmo tentei), dado um diretório contendo os arquivos

aaabbb  aaaccc  aaaddd
  1. ...$ vi a Esc \ produziria ...$ vi aaa• e deixaria você no modo de inserção no .
  2. ...$ vi a Esc * produziria ...$ vi aaabbb aaaccc aaaddd • e deixaria você no modo de inserção no (até onde eu tentei, ele não adiciona / se for um diretório).
  3. ...$ vi a Esc = echo aaabbb aaaccc aaaddd e retorna ...$ vi a , deixando você no modo de comando.

É claro que o * na regex que você usou está implícito ; você poderia ter escrito

rm build/ tmp/

e depois pressionado Esc * em ambos (sim, até onde eu posso dizer e tente, Esc * expande todos os curingas somente na palavra delimitada por espaço em que o cursor está ).

Mas se você colocar um caractere curinga, o último não será mais implícito e você terá que fornecê-lo explicitamente. De fato, se houver um arquivo chamado aaazzzwww , então, escrevendo a*w , aaazzzw , a*z* , ou a*w* e pressionando Esc \ para aaazzzwww , mas a*z não faria isso!

    
por 19.02.2018 / 19:58