Me gustaría acortar todos los nombres de archivo en una ubicación determinada, y donde el truncamiento produce duplicados, incluir un número creciente en el nombre de archivo. Estoy casi todo el camino allí, gracias a esta solución: bash: Truncate Filenames, manteniéndolos únicos
Hice una pequeña modificación que le permite cubrir múltiples extensiones de archivo (ya que el original solo se escribió para jpegs). Mi guion:
num=1 length=8 for file in * do newname=$file extension=${file: -4} until [[ ! -f $newname ]] do (( sublen = length - ${#num} )) printf -v newname '%.*s%d' "$sublen" "$file" "$num" (( num++ )) done mv "$file" "$newname""$extension" doneLista de archivos originales:
DumbFilename.txt DumbFilename2.txt DumbFilename3.txt GrossFilename.txt GrossFilename2.txt GrossFilename3.txt LongFilename.doc LongFilename2.doc LongFilename3.doc UglyFilename.doc UglyFilename2.doc UglyFilename3.docSalida del código anterior:
DumbFil1.txt DumbFil2.txt DumbFil3.txt GrossFi4.txt GrossFi5.txt GrossFi6.txt LongFil7.doc LongFil8.doc LongFil9.doc UglyFi10.doc UglyFi11.doc UglyFi12.docMi único problema es que los números se incrementan en una secuencia larga. Solo quiero que aumente para cada instancia de un duplicado, así:
DumbFil1.txt DumbFil2.txt DumbFil3.txt GrossFi1.txt GrossFi2.txt GrossFi3.txt LongFil1.doc LongFil2.doc LongFil3.doc UglyFil1.doc UglyFil2.doc UglyFil3.doc¿Cómo hago esto?
¿Podría intentar lo siguiente?
length=8 for file in *; do newname=$file extension=${file: -4} for (( num=1; ; num++ )); do (( sublen = length - ${#num} )) printf -v newname '%.*s%d%s' "$sublen" "$file" "$num" "$extension" [[ ! -f $newname ]] && break done mv -- "$file" "$newname" done Por cierto, su secuencia de comandos original verifica la existencia de $newname sin agregar la extensión, que se romperá en algunas condiciones.
Ponga el nombre de archivo truncado en una variable. En la próxima iteración, verifique si el nombre de archivo truncado actual es el mismo que el anterior. Si es diferente, reinicie num a 1 para comenzar la secuencia nuevamente.
length=8 num=1 last_truncated= for file in * do newname=$file extension=${file: -4} until [[ ! -f $newname ]] do (( sublen = length - ${#num} )) truncated=${newname:0:$sublen} # reset $num with new prefix if [[ $truncated != $last_truncated ]] then num=1 fi newname=$truncated$num (( num++ )) done last_truncated=truncated mv "$file" "$newname""$extension" done