Bash cambia el nombre de 360 ​​000 archivos usando find -exec

Bash cambia el nombre de 360 ​​000 archivos usando find -exec

Tengo alrededor de 360 ​​000 archivos como:

./001/1/1.jpg
./001/1/2.jpg
./001/2/1.jpg
./002/1/1.jpg
./003/1/1.jpg
...
pattern: [60 dirs]/[1000 subdirs]/[4-10 files].jpg

Quiero cambiar el nombre de los archivos usando, renamepor ejemplo, de *.jpg a *.jpeg. No puedo hacerlo con single renameporque la lista de argumentos de error es demasiado larga.

Buscando una solución, descubrí esto, pero no cambia el nombre de nada:

find -maxdepth 2 -mindepth 2 -type d -exec rename -n 's/jpg/jpeg/' {}/* \;

Cuando compruebo si {}está expandido reemplazando cambiar nombre con eco:

find -maxdepth 2 -mindepth 2 -type d -exec echo "rename -n 's/jpg/jpeg/' {}/*" \;

Obtengo el resultado esperado:

rename -n 's/jpg/jpeg/' ./061/61430/*
rename -n 's/jpg/jpeg/' ./061/61431/*
...

Si ejecuto cualquiera de estos comandos para cambiar el nombre, cambio el nombre de las obras. Entonces debería haber un problema con {}.

¡Gracias por ayudar!

Respuesta1

En primera instancia, *el shell lo expande antes de llegar a rename(si se expande, dudo que algo coincida ) {}/*, y si no se expande, el comando que se ejecuta es renamecon los tres argumentos -ny . Ese último argumento no es el nombre de un archivo existente, por lo que no hace nada.s/jpg/jpeg/some/path/*rename

Sin shell global, la ruta es inútil para rename.

Entonces, en su lugar, haz:

find -maxdepth 3 -mindepth 3 -type f -iname '*.jpg' -exec rename -n 's/jpg$/jpeg/i' {} +

Utilice findla capacidad de crear líneas de comando tan largas como sea posible con +en lugar de ;.

Respuesta2

find  | prename 's/\.jpg$/.jpeg/'

o si tiene otros archivos en el directorio actual

find 0[0-9][0-9] | prename 's/\.jpg$/.jpeg/'

Respuesta3

No debe especificar type da menos que desee cambiar el nombre sólo de los directorios. Para cambiar extensiones .jpgpara .jpegprobar

find . -maxdepth 2 -mindepth 2 -name '*.jpg' -exec sh -c 'echo mv -- "$0" "${0%%.jpg}.jpeg"' {} \;

Elimina echosi te gusta lo que ves en la pantalla.

Respuesta4

Usando cygwin, mi versión de rename no tiene el reemplazo de expresiones regulares, ni su rename [options] expression replacement file...sintaxis parece funcionar. Además, las sugerencias de bash fallan con

... -c: line 0: unexpected EOF while looking for matching `"'
... -c: line 1: syntax error: unexpected end of file

Por desgracia... siempre existe Perl:

perl -MFile::Find -e 'find(sub{return unless /^(.*)\.jpg$/;`mv $_ $1.jpeg`}, ".")'

información relacionada