A menudo trabajo desde la raíz de un directorio Rails donde me encuentro navegando por la misma ruta dos veces cada vez que quiero mover un archivo:
mv app/views/layouts/application.html.erb app/views/layouts/application.html.haml
haml es solo uno de muchos ejemplos en los que necesito cambiar el nombre del archivo sin modificar el directorio en el que se encuentra actualmente y sin cambiar el directorio. ¿Hay una manera de lograr esto?
Respuesta1
Usarexpansión de corsé:
mv very/long/path/to/filename.{old,new}
se expandiría a
mv very/long/path/to/filename.old very/long/path/to/filename.new
Respuesta2
Si va a trabajar en un directorio, puede cambiar a él temporalmente.
pushd app/views/layouts
mv application.html.erb application.html.haml
popd
En Linux, puede utilizar elrename
utilidad (llamada rename.ul
en Debian, Ubuntu y derivados) para cambiar una parte del nombre del archivo (que puede estar en la parte del directorio). rename foo bar path/to/file
cambia la primera aparición de foo
in path/to/file
a bar
. Si el nombre de un archivo no contiene la primera cadena, el archivo se deja en su 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
Cuando tienes varias palabras consecutivas en una línea de comando que comparten una raíz común, puedes usar la expansión de llaves:
mv app/views/layouts/application.html.{erb,haml}
Respuesta3
Podrías cd
en el directorio en un sub-shell:
(cd app/views/layouts && mv application.html.erb application.html.haml)
Aquí, los paréntesis ejecutan los comandos en un nuevo bash
proceso de shell.
Respuesta4
Puedes definir la función:
mv-rename () {
mv -- "${1}" "$(dirname -- "${1}")/${2}"
}
Uso:
mv-rename app/views/layouts/application.html.erb application.html.haml