Use expansão de chaves :
mv very/long/path/to/filename.{old,new}
se expande para
mv very/long/path/to/filename.old very/long/path/to/filename.new
Freqüentemente, eu trabalho fora da raiz de um diretório rails, onde eu me vejo navegando pelo mesmo caminho duas vezes toda vez que eu gostaria de mover um arquivo:
mv app/views/layouts/application.html.erb app/views/layouts/application.html.haml
O haml é apenas um dos exemplos em que preciso alterar o nome do arquivo sem modificar o diretório em que ele está atualmente e sem alterar o diretório. Existe uma maneira de conseguir isso?
Use expansão de chaves :
mv very/long/path/to/filename.{old,new}
se expande para
mv very/long/path/to/filename.old very/long/path/to/filename.new
Se você for trabalhar em um diretório, poderá alternar temporariamente para ele.
pushd app/views/layouts
mv application.html.erb application.html.haml
popd
No Linux, você pode usar o utilitário rename
(chamado rename.ul
no Debian, Ubuntu e derivados) para alterar uma parte do nome do arquivo (que pode estar na parte do diretório). rename foo bar path/to/file
altera a primeira ocorrência de foo
em path/to/file
para bar
. Se um nome de arquivo não contiver a primeira string, o arquivo permanecerá no lugar.
rename .erb .haml app/views/layouts/application.html.erb
rename .erb .haml app/views/layouts/*.html.erb # do several in one go
rename .erb .haml app/views/layouts/application.* # never mind if application.js and application.html.gz also exist
Quando você tem várias palavras consecutivas em uma linha comum que compartilha um radical comum, é possível usar a expansão de chaves:
mv app/views/layouts/application.html.{erb,haml}
Você poderia cd
no diretório em um sub-shell:
(cd app/views/layouts && mv application.html.erb application.html.haml)
Aqui, os parênteses executam os comandos em um novo processo bash
shell.
Você pode definir a função:
mv-rename () {
mv -- "${1}" "$(dirname -- "${1}")/${2}"
}
Uso:
mv-rename app/views/layouts/application.html.erb application.html.haml