¿Cómo cambiar el nombre de un archivo dentro de una carpeta usando un comando de shell?

8

Tengo un archivo en some/long/path/to/file/myfiel.txt.

Quiero cambiarle el nombre some/long/path/to/file/myfile.txt.

Actualmente lo hago mv some/long/path/to/file/myfiel.txt some/long/path/to/file/myfile.txt, pero escribir la ruta dos veces no es terriblemente efectivo (incluso con la finalización de la pestaña).

¿Cómo puedo hacer esto más rápido? (Creo que puedo escribir una función para cambiar solo el segmento de nombre de archivo, pero ese es el plan B).

Leonid Shevtsov
fuente

Respuestas:

11

Para hacer esto en un solo comando, simplemente puede hacer esto:

mv some/long/path/to/file/{myfiel.txt,myfile.txt}

El cual es un ejemplo para el nombre completo del archivo, dado que es un error tipográfico, puede hacer algo como:

mv some/long/path/to/file/myfi{el,le}.txt

Ambos se expandirán al comando completo, estos se llaman expansiones de llaves . Son compatibles con zsh .

Tamara Wijsman
fuente
Oh mi, esto abre muchas posibilidades. ¡Gracias!
Leonid Shevtsov
5

Aquí hay varias opciones:

Cambiar al directorio:

cd /home/long/path
mv file1 file2
cd -

Cambiar directorios usando la pila de directorios:

pushd /some/long/path
mv file1 file2
popd

Cambie al directorio usando una subshell:

( 
  cd /some/long/path
  mv file1 file2
)   # no need to change back

Usar expansión de llaves:

mv /some/long/path/{file1,file2}

Usa una variable:

D=/some/long/path
mv "$D/file1" "$D/file2"
tylerl
fuente
Tenga en cuenta que el último enfoque se rompe cuando el camino tiene un espacio, mejor cítelo.
slhck
@slhck TODOS los enfoques se rompen si tienes espacios.
tylerl
1
No, si los escribe correctamente, no lo harán. Solo la variable cuando se expande se verá como múltiples argumentos para mv
slhck
@slhck ahí tienes.
tylerl
3

Cambie al directorio, mueva el archivo y vuelva al directorio anterior; al igual que:

cd some/long/path/to/file
mv myfiel.txt myfile.txt
cd -
Yedric
fuente
1

Cuando uso el método subshell, tendería a hacerlo en una línea así

(cd /some/long/path ; mv myfiel myfile )
Keith Wolters
fuente