sintaxis multiple files directories linux bash shell file rename

multiple - Renombrando un conjunto de archivos a 001, 002,… en Linux



sintaxis rename linux (6)

Originalmente tenía un conjunto de imágenes de la forma image_001.jpg, image_002.jpg, ...

Fui a través de ellos y saque varios. Ahora me gustaría cambiar el nombre de los archivos restantes a image_001.jpg, image_002.jpg, ...

¿Hay un comando de Linux que haga esto de manera ordenada? Estoy familiarizado con renombrar pero no puedo ver nada para ordenar nombres de archivos como este. Estoy pensando que ya que ls *.jpg enumera los archivos en orden (con espacios), la solución sería pasar la salida de eso a un bucle de bash o algo así.


Algunas buenas respuestas aquí ya; pero algunos confían en ocultar errores, lo que no es una buena idea (eso supone que mv solo se producirá un error debido a una condición que se espera - ¿qué pasa con todos los otros motivos que podría haber error?).

Además, se puede hacer un poco más corto y debería ser mejor citado:

for file in *; do printf -vsequenceImage ''image_%03d.jpg'' "$((++i))" [[ -e $sequenceImage ]] || / mv "$file" "$sequenceImage" done

También tenga en cuenta que no debe capitalizar sus variables en los scripts de bash.


Esto hace lo contrario de lo que está preguntando (tomar archivos del formulario * .jpg.001 y convertirlos a * .001.jpg), pero puede modificarse fácilmente para su propósito:

for file in * do if [[ "$file" =~ "(.*)/.([[:alpha:]]+)/.([[:digit:]]{3,})$" ]] then mv "${BASH_REMATCH[0]}" "${BASH_REMATCH[1]}.${BASH_REMATCH[3]}.${BASH_REMATCH[2]}" fi done


Iba a sugerir algo como lo anterior usando un bucle for, un iterador, corte -f1 -d "_", luego mv i i.iterator. Aunque parece que ya está cubierto de otras maneras.


Pruebe el siguiente script:

numerate.sh

Este código cortado debería hacer el trabajo:

./numerate.sh -d <your image folder> -b <start number> -L 3 -p image_ -s .jpg -o numerically -r


Si entiendo bien, tienes, por ejemplo, image_001.jpg, image_003.jpg, image_005.jpg, y quieres cambiar el nombre a image_001.jpg, image_002.jpg, image_003.jpg.

EDITAR: Esto se modifica para poner el archivo temporal en el directorio actual. Como señaló Stephan202, esto puede hacer una diferencia significativa si la temperatura está en un sistema de archivos diferente. Para evitar golpear el archivo temporal en el bucle, ahora pasa por la imagen *

i=1; temp=$(mktemp -p .); for file in image* do mv "$file" $temp; mv $temp $(printf "image_%0.3d.jpg" $i) i=$((i + 1)) done


Un bucle simple (prueba con echo , ejecutar con mv ):

I=1 for F in *; do echo "$F" `printf image_%03d.jpg $I` #mv "$F" `printf image_%03d.jpg $I` 2>/dev/null || true I=$((I + 1)) done

(Agregué 2>/dev/null || true para suprimir las advertencias sobre archivos de origen y destino idénticos. Si esto no es de su agrado, vaya con la answer ).