La forma más rápida de cambiar el nombre de los archivos, sin volver a escribir la ruta del directorio

56

Sé cómo renombrar archivos en Unix:

$ mv ~/folder/subfolder/file.txt ~/folder/subfolder/file.sh

     ^-------this part------^    ^------this part-------^

Se tarda demasiado tiempo en repetir ~/folder/subfolder/filedos veces.

¿Hay una manera más rápida?

Hamed Kamrava
fuente

Respuestas:

104

Si su cáscara apoyó la expansión de llaves (funciona con csh, tcsh, ksh, zsh, bash, mksh, lksh, pdksh, yashcon refuerzo a expandir permitido llamando yash --brace-expando conjunto de concha con interative set -o brace-expand, o fish):

mv ~/folder/subfolder/file.{txt,sh}
Cuonglm
fuente
44
¡simple es lo mejor!
Braiam
2
¡Impresionante uso de expansión en shell brillante!
harish.venkat
3
Que es impresionante, pero realmente críptico. Funciona, pero a primera vista, creo que hace algo diferente: mueve dos archivos a alguna parte. No creo que esta sea una gran idea, especialmente porque hay una solución mucho mejor usando rename.
yo
44
@tohecz: ¿Por qué es críptico? Es una característica de shell y todos pueden saberlo leyendo la página de manual de shell. Y no creo que renamesea ​​una mejor solución porque renamenunca le pido que anule el archivo existente o no.
Cuonglm
1
@Gnouc, eres el hombre.
Principiante
20

También puede usar rename(parte del paquete util-linux).

rename .txt .sh ~/folder/subfolder/file.txt

Consulte la página de manual de cambio de nombre para obtener más detalles.

jofel
fuente
+1 Esta es la manera clara de cómo hacerlo, mucho mejor que confiar en la {a,b}funcionalidad de los shells .
yo
55
En algunas distribuciones de Linux (como Ubuntu), renamees un programa completamente diferente, basado en perl. Ahí lo usarías rename 's/txt$/sh/' ~/folder/subfolder/file.txt.
evilsoup
En Debian (y Ubuntu), también existe mmv.
ctrl-alt-delor
10

Todo lo anterior es bueno. Esto también funcionaría:

( cd ~/folder/subfolder && mv file.txt file.sh )
Bjorn
fuente
No. ¡No funciona para mí!
Hamed Kamrava
Funcionará si quita la sudopieza.
Cthulhu
1
@Cthulhu Sí, tienes razón. ¿Pero por qué no funciona sudo?
Hamed Kamrava
2
@HamedKamrava Probablemente porque con sudoél se interpreta ~como el directorio de inicio de la raíz.
Cthulhu
Puede sudoel mv, pero no cd. Ver por qué es un shell cd incorporado y no se puede. sudoEl(
ctrl-alt-delor
6

No. Debe dar la ruta completa al archivo para cambiarle el nombre. La única alternativa es moverse a la carpeta de destino antes de ejecutar mv:

cd ~/folder/subfolder/
mv file.txt file.sh

Alternativamente, podría escribir una pequeña función que cambie el nombre del archivo en el directorio de destino. Por ejemplo, agregue estas líneas a su archivo de inicialización de shell ( ~/.bashrcsi está usando bash):

lmv(){
    _path=$(dirname -- "$1")
    _target="${_path%/}/$2"
    mv -- "$1" "$_target"
}

Luego, abra una nueva terminal o simplemente ejecute source ~/.bashrcpara volver a leer el archivo de inicio y puede hacer:

lmv ~/folder/subfolder/file.txt file.sh
terdon
fuente
+1 para la lmv()función. No lo sabía :)
Hamed Kamrava
1
@HamedKamrava nadie lo sabía. Lo acabo de escribir, no es nada estándar.
terdon
2
Lo sé. ¡Quiero decir que no sabía que podía escribir mi propia función!
Hamed Kamrava
2

Solo para ampliar la utilidad de la respuesta de cuonglm (NO tomar ningún crédito ya que me encanta su solución) y su respuesta es correcta.

El caso de uso es que a menudo queremos mover un archivo en una ubicación remota (el problema real), por ejemplo /folder/subfolder/configFile.dat TO configFile.dat.orig

Esta forma del comando agrega una extensión de archivo (no reemplaza la extensión original)

mv ~/folder/subfolder/file.txt{,.orig}

Explicado: "{, .orig}" significa reemplazar (nada) al final del nombre del archivo con (algo) ".orig"

O para eliminar una extensión de archivo (invertir el cambio de nombre)

mv ~/folder/subfolder/file.txt{.orig,}

Nota: Todavía en el tema "La forma más rápida de cambiar el nombre de los archivos sin volver a escribir la ruta del directorio"

spikendu
fuente
1

Si. Si lo usas bash, lo haces sudo pushd ~/folder/subfolder/ && sudo mv ./file.txt ./file.sh && popd.

Lo que en realidad es más grande y puede fallar si perdió los permisos de acceso al directorio original cuando lo hizo popd.

41754
fuente
1
¿Cuál es el punto de pushdy popdaquí? ¿Cómo es esto mejor que cd ~/folder/subfolder/ && sudo mv file.txt file.sh?
terdon
1
El punto es que estás detrás del comando en la carpeta que comenzaste, no en ninguna subcarpeta. Una alternativa a pushd popdes usar cdy volver con cd -.
jofel
El interrogador pareció manifestar su intención de no cambiar el directorio de trabajo, y popdes mejor que cd ../../cuando esté disponible.
41754
77
Usar (cd /path/to/there && mv x y)luego (con una subshell)
Stéphane Chazelas
Realmente no deberías poner sudoantes pushd. Entonces el comando completo debería ser pushd ...dir && sudo mv old new && popd. Como alternativa, se podría hacer (cd ...dir; sudo mv old new)porque la ejecución en subshell se encargará de los cambios de directorio automáticamente.
Mikko Rantalainen