3 votos

Uso de Terminal para truncar los nombres de los archivos en el directorio

Tengo unos mil jpegs en un directorio que tienen nombres de archivo como

1300-Kazoo-Pkg.jpg
1314-Aprender a tocar el piano con el niño.jpg
1314-Aprender a tocar el piano.jpg

Quiero acortarlos a los números antes del primer guión.

He intentado utilizar for f in *.jpg; do mv "$f" "${f/-*.}"; done pero no sé qué añadir para hacer lo que quiero.

¿Alguna sugerencia?

4voto

sideshowbarker Puntos 156

Para preservar la extensión del nombre del archivo de la manera esperada, debe hacer lo siguiente:

for f in *.jpg; do mv "$f" "${f/-*}.jpg"; done

Es decir, utilizar ${f/-*}.jpg en lugar de ${f/-*.} .

Para tratar el caso de varios archivos que tienen el mismo prefijo antes del guión, puede hacer algo así: [ Nota: Para una mejor versión, consulte el Actualización He añadido después de esto].

i=0
for f in *.jpg; do
  if [ "$(ls -l ${f/-*}* | wc -l | xargs)" -gt 1 ]; then
    for g in "${f/-*}"; do
      mv "$f" "$g-$((i++)).jpg"
    done
  else
    if [[ $f == *"-"* ]]; then
      mv "$f" "${f/-*}.jpg"
    fi
  fi
done

Eso le dará una salida como esta:

1300.jpg
1314-0.jpg
1314-1.jpg
1315-2.jpg
1315-3.jpg

Es decir, un -N se añadirá, aunque con la limitación de que este sencillo ejemplo sólo incrementa el N en todo el conjunto de archivos en lugar de por prefijo.

También tenga en cuenta que puede volver a ejecutar con seguridad este script varias veces en el mismo directorio y terminará con los mismos nombres de archivo esperados al final (que creo que es lo que querría, en lugar de que siga jugando con los nombres de archivo que ya están en la forma que desea).


Actualización

Aquí hay una versión mejor que sólo agrega 1- N a los archivos renombrados si encuentra un archivo existente con el mismo nombre base o con el mismo nombre base+. N (en cuyo caso se incrementa en N +1 y reintentos).

for f in *.jpg; do
  base=${f/-*}
  if [[ -e "${base}.jpg" ]] ; then
    i=1
    while [[ -e "${base}-${i}.jpg" ]]; do
      let i++
    done
    base=$base-$i
  fi
  mv "$f" "${base}.jpg"
done

Eso da una salida como esta:

1300.jpg
1314-1.jpg
1314.jpg
1315-1.jpg
1315-2.jpg
1315.jpg

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X