Cambiar el nombre de varios directorios en la línea de comando

2

Tengo algunas carpetas llamadas:

Session 1
Session 2
Session 3
Session 4
Session 5
Session 6
Session 7
Session 8

Me gustaría cambiarles el nombre a todos por:

Folder 1
Folder 2
Folder 3
Folder 4
Folder 5
Folder 6
Folder 7
Folder 8

¿Cómo haría para hacer esto en la terminal de la manera más efectiva?

mmv mvy renameno estoy seguro de qué debo usar y cómo hacerlo.

Rtsne42
fuente

Respuestas:

9

prenombre

Forma más sencilla sería utilizar renameo prename, lo que es un script de Perl (si eres un ksho mkshusuario, que Shell ha renameincorporado en la función, que es diferente, lo que en aras de la coherencia, voy a utilizar prenamecuando se hace referencia a que Perl script; alternativamente, podría llamar /usr/bin/rename: ruta completa al ejecutable).

$ ls
Session 1/  Session 2/  Session 3/  Session 4/  Session 5/  Session 6/  Session 7/  Session 8/
$ prename 's/Session/Folder/' Session*/                                                                                  
$ ls
Folder 1/  Folder 2/  Folder 3/  Folder 4/  Folder 5/  Folder 6/  Folder 7/  Folder 8/

Si necesita una búsqueda recursiva o se asegura de encontrar el tipo correcto de elemento (tal vez también tenga archivos con la palabra "Sesión" en el nombre del archivo) puede combinarlo con la findutilidad:

$ ls
Folder 1/  Folder 2/  Folder 3/  Folder 4/  Folder 5/  Folder 6/  Folder 7/  Folder 8/

$ find -maxdepth 1 -type d -name "Session *" -exec prename 's/Session/Folder/' {} \;                                      

$ ls
Folder 1/  Folder 2/  Folder 3/  Folder 4/  Folder 5/  Folder 6/  Folder 7/  Folder 8/

Ligeramente largo, quizás un poco redundante, pero funciona.

mv

El pequeño problema mves que tenemos que alterar el nombre del destino cada vez, por lo que no puede hacer lo que queremos. Para hacer eso, nos gustaría tener que combinarlo con algunas otras herramientas, tales como findo bashherramientas 's.

$ ls
Session 1/  Session 2/  Session 3/  Session 4/  Session 5/  Session 6/  Session 7/  Session 8/


$ for dir in Session*/ ; do mv "${dir}" "Folder ${dir##*\ }" ;done                                                       

$ ls
Folder 1/  Folder 2/  Folder 3/  Folder 4/  Folder 5/  Folder 6/  Folder 7/  Folder 8/

Lo que ves aquí es que estamos recorriendo todos los elementos que contienen la palabra Sessionen ellos y son directorio. Utilizamos la expansión de parámetros `$ {dir ## * \}" para extraer todo después del espacio en el nombre del directorio (que es el número respectivo), y formar una nueva cadena "Carpeta /".

En ambos prenamecomandos y mvestamos usando globbing, lo que significa que estos enfoques cambiarán el nombre de cada directorio que contenga la palabra "Sesión", incluso "Sesión bla". No es ideal, por supuesto, pero para el caso específico en el que sabe que el nombre de su carpeta es consistente, eso funcionará. Alternativamente, podríamos aumentar el comando con for dir in Session\ [1-9] ; do . . .done.

En otras palabras, este enfoque puede funcionar, pero es muy simplista y no es el mejor.

Pitón

Por supuesto, también se pueden usar otras herramientas. Por ejemplo, Python:

$ ls
Session 1/  Session 3/  Session 5/  Session 7/
Session 2/  Session 4/  Session 6/  Session 8/

$ python -c 'import os,shutil;map(lambda x:shutil.move(x,x.replace("Session","Folder")),os.listdir("."))'                

$ ls
Folder 1/  Folder 2/  Folder 3/  Folder 4/  Folder 5/  Folder 6/  Folder 7/  Folder 8/
Sergiy Kolodyazhnyy
fuente
Genial, utilicé la primera solución y hace exactamente lo que quería. ¿Hay alguna diferencia entre usar prenamey rename?
Rtsne42
No importa, veo la actualización.
Rtsne42
@ Danchm01 Estaba en el proceso de editar mi respuesta, cuando publicaste el comentario, y las direcciones de edición exactamente eso. Básicamente, preferiría prename porque si está utilizando Korn shell o su derivado en lugar de bash, hay un shell incorporado en el comando llamado rename, por lo que la sintaxis para prenameno funcionará allí y tendrá que llamar explícitamente /usr/bin/renamepara que funcione.
Sergiy Kolodyazhnyy
Si no puede usar python2, entonces esto funcionapython3 -c 'import os,shutil;list(map(lambda x:shutil.move(x,x.replace("Session","Folder")),os.listdir(".")))'
Manuel Ferreria
-1

Vaya a la carpeta que contiene toda la carpeta que desea renombrar y hacer:

find . * | rename 's\Session\Folder\'
Emilio Galarraga
fuente
La sintaxis de rename es con barra diagonal, no con barra diagonal inversa. Esta tubería no funcionará. Uno necesita encontrar. * -exec renombrar 's / Session / Folder /' {} \;
rafaelvalle