Arquivo de movimentação de linha de comando com caminho de diretório longo sem repetir o caminho do diretório

13

Existe alguma maneira de executar um comando mv sem digitar o caminho completo no segundo argumento?

Exemplo:

mv my/file/that/has/a/really/long/path/foo.bar some_magic_operator_that_means_the_same_directory/foo.baz

    
por Finbarr 27.03.2012 / 20:11

5 respostas

28

Você pode usar a expansão de chaves do bash. Isso:

mv my/file/that/has/a/really/long/path/foo.{bar,baz}

expandirá para:

mv my/file/that/has/a/really/long/path/foo.bar my/file/that/has/a/really/long/path/foo.baz

e, em seguida, mv é executado com esses dois argumentos. Veja link para mais informações sobre a expansão de chaves.

    
por geirha 27.03.2012 / 20:58
4

Como uma alternativa para a expansão de chaves, você pode usar os recursos expansão do histórico do shell bash:

  • ! introduz uma expansão de histórico
  • # event designator denotando o comando atual
  • $ designador de palavras referindo-se ao último argumento

Você pode realizar substituições na expansão usando uma sintaxe% sed-like s/pattern/replacement , por exemplo.

somecommand path/to/foo.bar !#$:s/.bar/.baz

Ex.

$ mv -v somepath/Original/Dir3/SubDir1/foo.bar !#$:s/.bar/.baz
mv -v somepath/Original/Dir3/SubDir1/foo.bar somepath/Original/Dir3/SubDir1/foo.baz
'somepath/Original/Dir3/SubDir1/foo.bar' -> 'somepath/Original/Dir3/SubDir1/foo.baz'

Se você quer o caminho especificamente (por exemplo, para mv um arquivo para um nome completamente diferente que não é facilmente obtido por substituição), você pode usar o modificador h :

$ mv -v somepath/Original/Dir3/SubDir1/foo.baz !#$:h/baz.foo
mv -v somepath/Original/Dir3/SubDir1/foo.baz somepath/Original/Dir3/SubDir1/baz.foo
'somepath/Original/Dir3/SubDir1/foo.baz' -> 'somepath/Original/Dir3/SubDir1/baz.foo'

Para outras opções, incluindo readline combinações de teclas para extrair o último argumento, consulte Como repetir o parâmetro digitado atualmente no console do bash?

    
por steeldriver 06.10.2017 / 14:23
2

Você pode tentar:

pushd .
cd /really/long/directory/name/
mv whatever.1 whatever.2
popd
    
por zpletan 27.03.2012 / 20:43
2

Com uma variável

  1. Salve o diretório em uma variável: 'DIR=./really/long/path/
  2. use move: mv "$DIR"foo.bar "$DIR"foo.bz

Em uma linha: DIR=./really/long/path/; mv "$DIR"foo.bar "$DIR"foo.bz

Alterando o diretório

  1. Você também pode cd para o diretório em que deseja trabalhar: cd ./really/long/path
  2. altere o nome do arquivo: mv foo.bar foo.bz

Em uma linha: cd ./really/long/path && mv foo.bar foo.bz

    
por danjjl 27.03.2012 / 20:33
-3

Você pode usar o comando alias para abreviar o nome do diretório:

alias src='/directory/name/of/source'
alias dst='/directory/name/of/destination'
mv src dst
    
por shantanu 27.03.2012 / 20:39