Linha de comando mover arquivo com caminho de diretório longo sem repetir o caminho de diretório

16

Existe alguma maneira de executar um mvcomando 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

Finbarr
fonte
11
Qualquer motivo que você não pode apenas cdpara o diretório e mvde lá?
27412 zpletan
Frequentemente, eu me pego executando esses tipos de comandos em vários diretórios no meu dia-a-dia. Geralmente, preciso executar vários comandos de um determinado diretório pai.
Finbarr 27/03
De alguma forma eu achei que usando !! (sinais de exclamação dupla) em um terminal usa para executar o último comando executado. Você também pode adicionar parâmetros / texto ao último comando, mas nunca tentou alterar / remover texto do último comando. Experimente e se você conseguir, deixarei isso como uma resposta. Boa sorte!
Geppettvs D'Constanzo 27/03

Respostas:

32

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

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 depois mvé executado com esses dois argumentos. Consulte http://wiki.bash-hackers.org/syntax/expansion/brace para obter mais informações sobre expansão de chaves.

Geirha
fonte
3
Isso é glorioso. Eu não sabia que você poderia fazer isso.
Finbarr 27/03
5

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

  • ! introduz uma expansão da história
  • # designador de evento que denota o comando atual
  • $ designador de palavras referente ao último argumento

Você pode executar substituições na expansão usando uma s/pattern/replacementsintaxe semelhante a sed, 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ê desejar o caminho especificamente (por exemplo, para mvum arquivo com um nome completamente diferente que não seja facilmente obtido por substituição), poderá usar oh modificador:

$ 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 readlinecombinações de teclas para puxar o último argumento, consulte Como repetir o parâmetro digitado no momento no console bash?

chave de aço
fonte
2

Você pode tentar:

pushd .
cd /really/long/directory/name/
mv whatever.1 whatever.2
popd
zpletan
fonte
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 diretório

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

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

danjjl
fonte
11
que segundo parece familiar ;-)
zpletan
2
Melhor uso &&nessa última linha. Caso contrário, se cdfalhar, o mvarquivo será executado no diretório errado, potencialmente substituindo um arquivo. Com cd ./really/long/path && mv foo.bar foo.baz, mvsó será executado se cdconseguir alterar o diretório.
Geirha # 27/12
-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
shantanu
fonte
11
-1 alias test='/var/log' ; cd test-bash: cd: test: No such file or directory.
zpletan