Usando Terminal para truncar nombres de archivos en el directorio

3

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

1300-Kazoo-Pkg.jpg
1314-Learn-to-Play-Piano-withKid.jpg
1314-Learn-to-Play-Piano.jpg

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

He intentado usar for f in *.jpg; do mv "$f" "${f/-*.}"; done pero no puedo averiguar qué agregar para hacer lo que quiero que se haga.

¿Alguna sugerencia?

    
pregunta enano2054 26.09.2015 - 03:46

1 respuesta

4

Para conservar la extensión del nombre de archivo de la forma esperada, debes hacer esto:

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

Es decir, usa ${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 como esto: [ Nota: Para obtener una versión mejor, consulte Actualizar desde entonces he agregado.

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 te dará una salida como esta:

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

Es decir, se agregará un sufijo -N , aunque con la limitación de que este ejemplo simple continúa incrementando el valor de N en todo el conjunto de archivos en lugar de por prefijo.

También tenga en cuenta que puede volver a ejecutar esta secuencia de comandos varias veces en el mismo directorio y terminará con los mismos nombres de archivo esperados al final (que creo que es lo que usted desearía, en lugar de hacerlo de forma monótona) además con cualquier nombre de archivo que ya esté en la forma que desea).

Actualizar

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

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
    
respondido por el sideshowbarker 26.09.2015 - 04:35

Lea otras preguntas en las etiquetas