2016-04-25 7 views
-1

Ich habe einen Ordner wo es Bücher gibt und ich habe eine Datei mit dem richtigen Namen jeder Datei. Ich habe sie auf eine Weise umbenannt, die ich leicht sehen kann, wenn sie bestellt werden, sagen "00.pdf", "01.pdf" und so weiter.Benennt nummerierte Dateien mit Namen aus der Liste in andere Datei

Ich möchte wissen, ob es einen Weg gibt, mit der Shell jede der Zeilen der Datei, sagen wir "Namen", mit jeder Datei übereinstimmen. Tatsächlich passen Sie die Zeile i der Datei mit dem Buch in der Position i in der Sortierreihenfolge an.

<name-of-the-book-in-the-1-line> -> <book-in-the-1-position> 
<name-of-the-book-in-the-2-line> -> <book-in-the-2-position> 
. 
. 
. 
<name-of-the-book-in-the-i-line> -> <book-in-the-i-position> 
. 
. 
. 

Ich tue dies in Windows, Total Commander, aber ich möchte es in Ubuntu tun, so dass ich nicht neu starten müssen.

weiß ich über mv und rename, aber ich bin nicht so gut, wie ich mit regulären Ausdrücken wollen ...

+1

Woher wissen Sie, welche Datei mit welchem ​​vollen Namen übereinstimmt? Ist diese Nummer einzigartig? –

+0

Ich habe die Dateien in aufsteigender Reihenfolge (00, 01, ..., N) geöffnet, dachte einen Namen, und schrieb es in der Datei "Namen" – nikolat328

+0

Wie wird * name-book-01.pdf * * 01 .pdf *, während * name-book-99.pdf * zu * 00.pdf * wird? Was passiert mit * name-book-100.pdf *? –

Antwort

1

renamer.sh:

#!/bin/bash 
for i in `ls -v |grep -Ev '(renamer.sh|names.txt)'`; do 
    read name 
    mv "$i" "$name.pdf" 
    echo "$i" renamed to "$name.pdf" 
done < names.txt 

names.txt: (Zeilenzahl Muss sein die genaue gleich nummerierte Dateien zählen)

name of first book 
second-great-book 
... 

Erklärung:

  • ls -v kehrt natürlich Dateiliste sortiert
  • grep dieses Skript Namen und Eingabedatei schließt nicht
  • wir durchlaufen gefunden Dateinamen lesen Wert aus der Datei und benennen Sie die Zieldateien durch diesen Wert
  • umbenannt werden

Zu Testzwecken Sie den Befehl mv kommentieren Sie können:

#mv "$i" "$name" 

Und nun einfach das Skript ausführen:

bash renamer.sh 
+0

eine gute Debugging/Sicherheitstechnik ist die Verwendung von 'echo "$ i" "$ name.pdf" 'im Skript. Sehen Sie sich diese Ausgabe an und bestätigen Sie, dass das Skript nach Bedarf funktioniert.Entfernen Sie dann das "Echo" und alle Dateien werden umbenannt, wenn O.P. erneut ausgeführt wird. Viel Glück für jeden. – shellter

+0

Das ist genau das Programm, das ich brauchte. Vielen Dank! – nikolat328

+0

In der Datei habe ich die Namen mit der Extension geschrieben, das klappt also. Aber es ist ein guter Punkt – nikolat328

1

Diese Schleifen durch names.txt, erzeugt einen Dateinamen basierend auf einem Zähler (padding auf zwei Stellen mit printf, auf Variable unter Verwendung -v Zuweisung), dann unter Verwendung von mv benennt. ((++i)) erhöht den Zähler für den nächsten Dateinamen.

#!/bin/bash 

i=0 
while IFS= read -r line; do 
    printf -v fname "%02d.pdf" "$i" 
    mv "$fname" "$line" 
    ((++i)) 
done < names.txt