Die Manipulation von Dateinamen einer grossen Anzahl von Dateien lässt sich komfortabel mit Bash-Scripten erledigen. Mit Grundkenntnisse in regulären Ausdrücken (RegEx), dem Umgang mit Variablen und der Syntax, die ich hier ausführlich erklären werde, kommt man relativ schnell zum Erfolg. Ich werde in diesem Beitrag wie kürzlich in -> Batch-Konvertierung HTML nach PDF nochmal ein Script genau erklären.
Beispiel: Umbenennen nach Vorgaben in einer CSV-Datei
Das Beispiel macht deutlich, wie man
- mit Pfadangaben umgeht
- eine Datei einliest
- an die einzelnen Werte kommt
- und die Werte und Pfade dann verwendet.
1 #!/bin/bash 2 # Pfad zu den Dateien 3 PF_IN="/media/nas/backup" 4 # Pad zu den umbenannten Dateien 5 PF_OUT="/media/nas/html" 6 # CSV mit den Teilen des Dateinamens, die ersetzt werden sollen 7 FILE="files_to_rename.csv" 8 9 while read LINE; do 10 NAME="$(echo "$LINE" | awk '{print $1}')"; 11 CODE="$(echo "$LINE" | awk '{print $2}')"; 12 INPF=${PF_IN}/backup-${NAME}.html 13 OTPF=${PF_OUT}/renamed-${CODE}.html 14 mv ${INPF} ${OTPF} 15 done < $FILE
- Zeile 1: Der Shebang oder Hash-Bang veranlasst Unix-Systeme, das folgende Programm mit den restlichen zeilen als Parameter auszuführen. Es wird also bash ausgeführt und die Zeilen 2 bis 15 werden danach von diesem Programm abgearbeitet.
- Zeile 3 und 5: In diesen Verzeichnissen liegen die Dateien zum Einlesen (PF_IN) und Schreiben (PF_OUT). Der von Anführungszeichen eingeschlossene Pfad wird als String in den beiden Variablen gespeichert. Variablennamen schreibt man zur besseren Lesbarkeit immer in Grossbuchstaben, damit sie sich deutlich vom anderen Code abheben.
- Zeile 7: In der CSV-Datei steht mit einem Leerzeichen getrennt, was womit ersetzt werden soll (also immer zwei Werte pro Zeile).
- Zeile 9 und 15: Diese Schleife liest aus der Datei $FILE, die in Zeile 7 definiert wurde, jeweils eine Zeile in die Variable LINE ein und stoppt, wenn die letzte Zeile eingelesen und verarbeitet wurde.
- Zeile 10 und 11: Aus einer eingelesenen Zeile wird mit awk der erste String in die Variable NAME und der zweite in die Variable CODE geschrieben. Die Syntax ist dabei anfangs sehr verwirrend, hat aber durchaus Gründe. awk benötigt das echo, um an die Werte zu kommen, die in der Variablen $LINE stehen. print $1 liest aus $LINE dann das erste Wort und übergibt es an NAME bzw.mit print $2 an CODE.
Um an einen Wert zu kommen, der von einem Programm geliefert wird, muss $(irgendeinPrg) und in diesem Fall eben ls verwendet werden. - Zeile 12 und 13 setzt jetzt die Pfade und die alten und neuen Dateinamen zusammen. Nun wird der Inhalt von $PF_IN wie in Zeile 3 definiert durch /backup- erweitert. Der Inhalt aus $NAME und .html werden ebenfalls angehängt und alles zusammen als Pfad/Dateiname in INPF übergeben. Für OTPF funktioniert das genauso.
Diese Operation könnte man auch in die nächste Zeile integrieren und sich so diese beiden Zeilen sparen. - In Zeile 14 wird nun mit mv <Quelle> <Ziel> die Datei verschoben.
Das Script wird man in dieser Form wohl selten benötigen, aber es zeigt eben einige grundlegenden Aktionen beim Umbenennen von mehreren Dateien per Script.
-> Batch-Konvertierung HTML nach PDF
1 Comment