Cambiar el nombre de un montón de archivos, pero solo parte del título

Cambiar el nombre de un montón de archivos, pero solo parte del título

Necesito cambiar el nombre de un montón de archivos (alrededor de 167k) y solo una parte del título de cada archivo. De: Aaaa.bb - 2 tag tag_tag 9tag Aaaa.bb - 125 tag_tag 9tag Aaaa.bb - 3567 tag 9tag A: Aaaa.bb - 000002 tag tag_tag 9tag Aaaa.bb - 000125 tag_tag 9tag Aaaa.bb - 003567 tag 9tag Todo está en un disco duro externo ¿Existe alguna herramienta o script que pueda ayudarme en esta situación? También olvidé mencionar que todavía soy nuevo en Ubuntu y todas esas cosas complicadas, así que pediré que simplifiquen las respuestas.

Respuesta1

Esta es mi opinión, usando bash, awky mv.

Si miramos el nombre del archivo desde el punto de vista de awk, el nombre del archivo es solo una cadena con campos separados por espacios, y de particular interés es el campo $3 que debe completarse con ceros. El siguiente guión hace exactamente eso. Asegúrese de colocar el script y ejecutarlo en el mismo directorio que los archivos cuyo nombre desea cambiar. Además, asegúrese de que sea ejecutable conchmod 755 renamerScript.sh

Manifestación

testdir:$ ls
Aaaa.bb - 125 tag tag_tag 9tag  Aaaa.bb - 2 tag tag_tag 9tag  Aaaa.bb - 4207 tag tag_tag 9tag  BACKUP/  renamerScript.sh*

testdir:$ ./renamerScript.sh                                                                                                                          
mkdir: cannot create directory ‘BACKUP’: File exists
cp: omitting directory ‘BACKUP’
renaming Aaaa.bb - 125 tag tag_tag 9tag to Aaaa.bb - 000125 tag tag_tag 9tag 
renaming Aaaa.bb - 2 tag tag_tag 9tag to Aaaa.bb - 000002 tag tag_tag 9tag 
renaming Aaaa.bb - 4207 tag tag_tag 9tag to Aaaa.bb - 004207 tag tag_tag 9tag 

testdir:$ ls
Aaaa.bb - 000002 tag tag_tag 9tag  Aaaa.bb - 000125 tag tag_tag 9tag  Aaaa.bb - 004207 tag tag_tag 9tag  BACKUP/  renamerScript.sh*

Guion

#!/bin/bash
# renamerScript.sh
# Author: Serg Kolo
# Date: Oct 17, 2015
# Purpose : renaming specific files
# Written for: http://askubuntu.com/q/686794/295286

# Make sure you have backup of the files !!!
# comment/uncomment if you do want to do a backup

mkdir BACKUP
cp -t BACKUP *

# This is where the magic happens:
# If we look at filenames from the awk point of view
# "Aaaa.bb - 2 tag tag_tag 9tag" are all really 
# space-separated fields. Field #3 is the one we need to edit.
# What we can do is pad it with zeros and then chop off 6 
# characters from the end, and store that as new filename
# The rest is just doing mv command from old filename to new
# And also making sure we're operating on files , not directories
# and not renaming the script file,too

for FILENAME in * ; 
do  
 if [ -f "$FILENAME" -a "$FILENAME" != "renamerScript.sh" ]; then

   OLDFILENAME="$FILENAME"
   NEWFILENAME=$(echo "$FILENAME" | awk '{$3="00000"$3; len=(length($3)-5); $3=(substr($3,len)); print  }')
   printf "renaming $OLDFILENAME to $NEWFILENAME \n"
   mv "$OLDFILENAME" "$NEWFILENAME"
 fi
done 

Respuesta2

Recomendaría Python y usar expresiones regulares. Aquí hay un ejemplo de un script que hice que puede agrupar todos los archivos en una carpeta y subcarpetas.

directoryChosen = (sys.argv[1])

print directoryChosen + "   thi is inside dollartohash"
if os.path.isdir(directoryChosen):
    for n in os.listdir(directoryChosen):
        if not n.startswith('.'):

            newname =  n.replace('$', '#')
            print newname
            if newname != n:
                path = os.path.join(directoryChosen, n)
                print path + "    this is path"
                target = os.path.join(directoryChosen, newname)
                print target + "   this is target"
                os.rename(path, target)

    newdir = directoryChosen.replace('$', '#')
    print newdir
    if directoryChosen != newdir :
         os.rename(directoryChosen, newdir)

Como puede ver, toma el directorio como argumento y cambia un símbolo por otro símbolo. Estoy seguro de que puedes modificar la pieza de repuesto.

Respuesta3

Puede utilizar el renamecomando basado en Perl para volver a imprimir la secuencia de dígitos que siguen a espacio-guión-espacio en el formato y ancho de campo deseados, por ejemplo

rename -vn -- 's/ - (\d+)/sprintf " - %06d", $1/e' *

(el indicador -n significa 'no op', es decir, simplemente hará un ensayo para probar la expresión: elimínelo si/cuando esté seguro de que está funcionando correctamente).

Respuesta4

IntentarpyRenamerel renombrador de archivos masivo que cambia el nombre de los archivos usando patrones, sustituciones, inserta o elimina texto, o incluso cambia el nombre de los archivos manualmente.

Tiene una ventana GUI con estas características:

  • Patrones para cambiar el nombre de archivos. Buscar y reemplazar para cambiar el nombre de los archivos. Inserte y elimine caracteres en cualquier lugar del nombre del archivo. Capitalización (ponga el nombre del archivo en mayúsculas). Sustituciones comunes. Cambie manualmente el nombre de los archivos seleccionados. Cambie el nombre de las imágenes utilizando sus metadatos. Cambie el nombre de la música usando sus metadatos.Fuente

Instalar:sudo apt-get install pyrenamer

información relacionada