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
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
Respostas:
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.
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?
`DIR=./really/long/path/mv "$DIR"foo.bar "$DIR"foo.bzEm uma linha: DIR=./really/long/path/; mv "$DIR"foo.bar "$DIR"foo.bz
cdo diretório em que deseja trabalhar:cd ./really/long/pathmv foo.bar foo.bzEm uma linha: cd ./really/long/path && mv foo.bar foo.bz
&&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.
cdpara o diretório emvde lá?