É possível nomear uma parte de um comando para reutilizá-lo no mesmo comando mais tarde?

7

Se eu quiser mover um arquivo chamado longfile de /longpath/ para /longpath/morepath/ , posso fazer algo como

mv (/longpath)/(longfile) $1/morepath/$2

i.e. posso deixar o bash saber que ele deve se lembrar de uma parte específica da entrada para que eu possa reutilizá-lo mais tarde na mesma entrada? (No exemplo acima eu uso um comando imaginário de recordação que funciona colocando entre parênteses e um comando imaginário de reutilização $ que insere o conteúdo dos grupos)

    
por Bananach 29.03.2016 / 15:25

4 respostas

22

Você poderia fazer isso:

mv /longpath/longfile !#:1:h/morepath/

Consulte o link

  • !# é o comando atual
  • :1 é o primeiro argumento neste comando
  • :h é a "cabeça" - pense em dirname
  • /morepath/ acrescenta isso à cabeça
  • e você está movendo um arquivo para um diretório, mantendo o mesmo nome de código.

Se você quiser alterar o nome "longfile", diga adicionar uma extensão ".txt", você pode

mv /longpath/longfile !#:1:h/morepath/!#:1:t.txt

Pessoalmente, eu cortaria e colaria com meu mouse. Na prática, nunca fico muito mais complicado do que !! ou !$ ou !!:gs/foo/bar/

    
por 29.03.2016 / 15:50
14

Você também pode fazer isso com a expansão de chaves:

mv /longpath/{,morepath/}longfile

O shell expande isso para que o comando mv o veja como:

mv /longpath/longfile /longpath/morepath/longfile
    
por 29.03.2016 / 23:22
9

Se você deseja uma digitação mais eficiente na linha de comando, talvez encontre vários atalho readline útil. Readline já está embutido no seu shell. Para o seu caso particular, você poderia arrancar / deletar partes da sua linha e, em seguida, recuperá-las da killline readline.

Além disso, se você tiver a variável de ambiente EDITOR definida para seu editor favorito, Ctrl-X, Ctrl-E copiará sua linha de comando atual para a janela do editor, onde poderá ter todo o poder do editor para modificar sua linha. Depois de concluído, você salva / sai do editor e a linha é executada no seu shell.

    
por 29.03.2016 / 16:24
4

Para algo como o caso específico sobre o qual você está perguntando, você também pode usar um subshell.

mv (/longpath)/(longfile) $1/morepath/$2

torna-se

( cd /longpath; mv longfile morepath/ )

enquanto mantém seu diretório de trabalho atual no shell em que você está trabalhando.

Isso não é totalmente diferente da sugestão do Wildcard de usar a expansão do shell , mas pode ser feito para situações mais complexas do que um simples algo-aqui-em-um-argumento-só pode prontamente apoiar.

    
por 30.03.2016 / 14:35