2009-12-25 12 views
32

Duplicar posibles:
rename multiple files at once in unixRenombrar archivos usando una expresión regular con la fiesta de

me gustaría cambiar el nombre de todos los archivos de una carpeta mediante una expresión regular (añadir un nombre al final del nombre) y mover a otra carpeta.

Es mi opinión, se debe buscar la siguiente manera:

mv -v ./images/*.png ./test/*test.png 

pero no funciona.

¿Alguien me puede ofrecer una solución?

+1

En esencia, el mismo que muchas otras preguntas - como SO 1086502 (http://stackoverflow.com/questions/1086502/). Hubo uno preguntado ayer, incluso. –

Respuesta

44

Prueba esto:

for x in *.png;do mv $x test/${x%.png}test.png;done 
+0

esto es lo que devuelve: uso: mv [-f | -i | -n] [-v] target de origen mv [-f | -i | -n] [-v] source ... directorio – mxg

+0

@mxg: lo siento, no le di el comando 100% correcto: primero necesitas 'cd images' y anteponer' test/'con' ..' – catwalk

+3

Debes poner comillas alrededor de los nombres de las variables en caso de que haya espacios en los nombres de los archivos: 'for x in * .png; hacer mv "$ x" "test/$ {x% .png} test.png"; done' –

48

Si usted está en un Linux, compruebe comando especial rename que hacer precisamente eso - renombrar el uso de expresiones regulares.

rename 's/^images\/(.+)/test\/$1.png/s' images/*.png 

De lo contrario, escribir un ciclo de fiesta en los nombres de archivo como catwalk suggested.

+4

Se puede llamar 'prename' en algunos sistemas. –

+7

mucho menos para recordar/escribir, gracias! 'rename 's/_20// g' * .mp4' – ptim

+1

La mejor y más sencilla forma de hacerlo. Aunque la respuesta podría ser editada para dar algunos ejemplos como memeLab did. – Memke

35
$ for old in ./images*.png; do 
    new=$(echo $old | sed -e 's/\.png$/test.png/') 
    mv -v "$old" "$new" 
    done 
+3

Me gusta el uso de sed porque me permite reemplazar esto con lo que quiera. en mi caso, reemplace "% 20" con "". Utilicé la 'g' al final de la expresión regular para permitir que: para anterior en * .pdf; hacer nuevo = $ (echo $ old | sed-e 's/\% 20// g'); mv $ old "$ new"; hecho – Marlon

+1

¡Gracias! Derivé el delineador 'mv file_20name.mp4" $ (echo file_20name.mp4 | sed -e 's/_20// g') "' de este – ptim

+0

hermoso, ya que esto permite la máxima potencia de la sintaxis de regex sed. Gran combinación de comandos y buen prototipo para muchos otros scripts bash. – Paul

5

Sin embargo, otra solución sería una herramienta llamada "MMV": MMV "./images/*.png" "./test/#1test.png"

Cuestiones relacionadas