Umbenennen einer Reihe von Dateien, aber nur eines Teils des Titels

Umbenennen einer Reihe von Dateien, aber nur eines Teils des Titels

Ich muss eine Reihe von Dateien (ca. 167 KB) umbenennen, und zwar nur einen Teil des Titels in jeder Datei. Von: Aaaa.bb - 2 tag tag_tag 9tag Aaaa.bb - 125 tag_tag 9tag Aaaa.bb - 3567 tag 9tag An: Aaaa.bb - 000002 tag tag_tag 9tag Aaaa.bb - 000125 tag_tag 9tag Aaaa.bb - 003567 tag 9tag Alles ist auf einer externen Festplatte. Gibt es ein Tool oder Skript, das mir in dieser Situation helfen kann? Ich habe auch vergessen zu erwähnen, dass ich noch neu in Ubuntu und all dem kniffligen Zeug bin, also werde ich darum bitten, die Antworten zu vereinfachen

Antwort1

Hier ist mein Versuch mit bash, awk, und mv.

Wenn wir den Dateinamen aus der Sicht von awk betrachten, ist der Dateiname nur eine Zeichenfolge mit durch Leerzeichen getrennten Feldern, und von besonderem Interesse ist das Feld $3, das mit Nullen aufgefüllt werden muss. Das folgende Skript macht genau das. Stellen Sie sicher, dass Sie das Skript im selben Verzeichnis wie die Dateien platzieren und ausführen, die Sie umbenennen möchten. Stellen Sie außerdem sicher, dass es mitchmod 755 renamerScript.sh

Demo

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*

Skript

#!/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 

Antwort2

Ich würde Python und die Verwendung von regulären Ausdrücken empfehlen. Hier ist ein Beispiel für ein Skript, das ich erstellt habe und das alle Dateien in einem Ordner und Unterordnern ändern kann.

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)

Wie Sie sehen, wird das Verzeichnis als Argument verwendet und ein Symbol in ein anderes Symbol geändert. Ich bin sicher, dass Sie den Ersetzungsteil ändern können.

Antwort3

Sie können den perl-basierten renameBefehl verwenden, um die Ziffernfolge nach Leerzeichen-Bindestrich-Leerzeichen im gewünschten Format und mit der gewünschten Feldbreite erneut auszudrucken, z. B.

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

(Das Flag -n bedeutet „keine Operation“, d. h. es wird nur ein Probelauf zum Testen des Ausdrucks durchgeführt: Entfernen Sie es, wenn Sie sicher sind, dass es richtig funktioniert.)

Antwort4

VersuchenpyRenamerder Massendatei-Umbenennungsprogramm, das Dateien anhand von Mustern und Ersetzungen umbenennt, Text einfügt oder löscht oder Dateien sogar manuell umbenennt.

Es verfügt über ein GUI-Fenster mit diesen Funktionen:

  • Muster zum Umbenennen von Dateien. Suchen und Ersetzen zum Umbenennen von Dateien. Einfügen und Löschen von Zeichen an beliebiger Stelle im Dateinamen. Großschreibung (Dateinamen in Großbuchstaben erstellen). Gängige Ersetzungen. Manuelles Umbenennen ausgewählter Dateien. Umbenennen von Bildern anhand ihrer Metadaten. Umbenennen von Musik anhand ihrer Metadaten.Quelle

Installieren:sudo apt-get install pyrenamer

verwandte Informationen