ubuntuusers.de

Dateien nach Textdateivorlage umbenennen

Status: Gelöst | Ubuntu-Version: Ubuntu 11.10 (Oneiric Ocelot)
Antworten |

schuhem

Avatar von schuhem

Anmeldungsdatum:
7. April 2012

Beiträge: Zähle...

Hallo liebe Ubuntuuser,

Ich möchte eine große Anzahl an Dateien (vorwiegend Video & Musikdateien) anhand einer, von mir vorher geschriebenen Vorlage umbenennen lassen. Die gängigen Umbenenner (pyRenamer, Metamorphose, etc.) unter Ubuntu habe ich schon ausprobiert und keine der im Wiki oder im Web gefundenen Programme entspricht meinen Erwartungen. Oder liegt es vielleicht daran, dass ich sie nicht richtig anwenden kann?

Ich würde mich auf eine Antwort freuen!

Moderiert von Antiqua:

Nach "Shell und Programieren" verschoben.

Antiqua Team-Icon

Avatar von Antiqua

Anmeldungsdatum:
30. Dezember 2008

Beiträge: 4534

Hi und Willkommen,

schuhem schrieb:

Die gängigen Umbenenner (pyRenamer, Metamorphose, etc.) unter Ubuntu habe ich schon ausprobiert und keine der im Wiki oder im Web gefundenen Programme entspricht meinen Erwartungen. Oder liegt es vielleicht daran, dass ich sie nicht richtig anwenden kann?

Nun, da du ja nichts zu deinen Erwartungen schreibst, wirds schwer, da was genaues zu sagen ☺

Beschreib doch mal was du wie umbenennen willst. Am besten mit Beispielen, wo welche Dateien wie umbenannt werden sollen (also auch was wie in deiner Textdatei steht). Vermutlich ist das mit einem kleinen Bash-Script zu lösen.

schuhem

(Themenstarter)
Avatar von schuhem

Anmeldungsdatum:
7. April 2012

Beiträge: 5

Vielen Dank für die schnelle Antwort! Ich habe keine Ahnung von Programmierung! Bin froh, dass ich den Computer einigermaßen bedienen kann. Ich erkläre meine Erwartungen anhand eines Beispiels:

Ich habe in einer Text-Datei die Kapitel zu verschiedenen Videodrehstandorten aufgeschrieben

Aufnahme Stadthalle Ostseite
Aufnahme Stadthalle Westseite
Aufnahme Stadthalle Nordseite
Stadthalle Saal 1
Stadthalle Saal 2
Empfangsbereich

und möchte meine dazu gedrehten Videos "Video 1-6" automatisiert aus dieser Textdatei benennen lassen. So dass er beispielsweise die 1. Videodatei im Ordner wie die erste Zeile benennt.

Wäre das möglich?

/edit: Wo das ganze passieren soll? Örtlich flexibel müsste es sein, oder zumindest so, dass ich ganz einfach später im Code den Ort ändern kann, indem ich den Pfad hineinkopiere. Ich bin für jede Hilfe dankbar!

Antiqua Team-Icon

Avatar von Antiqua

Anmeldungsdatum:
30. Dezember 2008

Beiträge: 4534

Im Terminal würde es z.B. so funktionieren, also quick und dirty. Am besten erstmal nicht mit den Originaldateien ausprobieren, sondern mit Kopien:

  • In einem Ordner gibt es die Datei text-datei und den Ordner videos

    antiqua@begyptine:~/ubuntu/schuhem$ tree
    .
    ├── text-datei
    └── videos
        ├── Video 1
        ├── Video 2
        ├── Video 3
        ├── Video 4
        ├── Video 5
        └── Video 6
    
    1 directory, 7 files
  • in der text-datei steht folgender Inhalt:

    Aufnahme Stadthalle Ostseite
    Aufnahme Stadthalle Westseite
    Aufnahme Stadthalle Nordseite
    Stadthalle Saal 1
    Stadthalle Saal 2
    Empfangsbereich
  • dann macht der Befehl

    i=1; for file in videos/* ; do echo "$file" wird zu  "videos/$(sed -n $(echo $i)p text-datei)"; mv "$file" "videos/$(sed -n $(echo $i)p text-datei)"; i=$((i+1)); done

    folgendes:

    antiqua@begyptine:~/ubuntu/schuhem$ i=1; for file in videos/* ; do echo "$file" wird zu  "videos/$(sed -n $(echo $i)p text-datei)"; mv "$file" "videos/$(sed -n $(echo $i)p text-datei)"; i=$((i+1)); done 
    videos/Video 1 wird zu videos/Aufnahme Stadthalle Ostseite
    videos/Video 2 wird zu videos/Aufnahme Stadthalle Westseite
    videos/Video 3 wird zu videos/Aufnahme Stadthalle Nordseite
    videos/Video 4 wird zu videos/Stadthalle Saal 1
    videos/Video 5 wird zu videos/Stadthalle Saal 2
    videos/Video 6 wird zu videos/Empfangsbereich
  • daraus folgt:

    antiqua@begyptine:~/ubuntu/schuhem$ tree
    .
    ├── text-datei
    └── videos
        ├── Aufnahme Stadthalle Nordseite
        ├── Aufnahme Stadthalle Ostseite
        ├── Aufnahme Stadthalle Westseite
        ├── Empfangsbereich
        ├── Stadthalle Saal 1
        └── Stadthalle Saal 2
    
    1 directory, 7 files

Nicht wundern, der Befehl tree listet alphabetisch auf. Die Dateien wurden schon richtig umbenannt. Sollten die Dateien voher eine Endung gehabt haben (z.B. *.avi) und in text-datei stehen keine Endungen, haben die umbenannten Dateien auch keine Endung mehr.

Ich veschieb das ganze auch mal nach "Shell und Programieren", damit die Kracks da mal was dazu sagen. Vor allem dürfte mein Befehl noch durchaus Verbesserungspotential haben.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Ja, das ist doch nicht schlecht ?!

Vielleicht könnte man den sed-Zauber noch durch ein zeilenweises Einlesen der Text-Datei ersetzen, aber sonst würde ich das auch nicht viel anders machen:

1
2
3
4
5
for datei in ./videos/* ; do 
        read zeile
        neuedatei="${datei%/*}/$zeile"
        echo "umbenennen von $datei in $neuedatei"
done  <  drehorte.txt
  1. Zeile 1 ist die selbe Schleife wie bei Antiqua: die klappert die Dateien im Verzeichnis einfach der Reihe nach (alphabetisch !) ab,

  2. Zeile 2 liest jeweils eine Zeile dazu ein (aus der Text-Datei, siehe Zeile 5),

  3. Zeile 3 bildet den neuen Dateinamen, indem mit einer Parameter Expansion der Dateiname abgetrennt und dann die $zeile anhängt wird,

  4. Zeile 4 ist nur eine symbolische Ausgabe. Da musst Du natürlich dann einen rename oder mv - Befehl einsetzen,

  5. und Zeile 5 ist der Schluss der Schleife. Wichtig ist, dass die Dateiumleitung nicht direkt in den Read-Befehl erfolgt,
    sondern in die komplette Schleife, denn sonst werden die Zeilen nicht der Reihe nach gelesen.

LG,

track

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13208

Hier mal ein bisschen Spielerei mit paste, die aber nur funktioniert, wenn in den Dateinamen keine Zeilenumbrüche sind:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# Was haben wir?
$ ls -lt *.mpg
-rw-r--r-- 1 Robert None 0  9. Apr 12:30 video-6.mpg
-rw-r--r-- 1 Robert None 0  9. Apr 12:30 video-5.mpg
-rw-r--r-- 1 Robert None 0  9. Apr 12:30 video-4.mpg
-rw-r--r-- 1 Robert None 0  9. Apr 12:30 video-3.mpg
-rw-r--r-- 1 Robert None 0  9. Apr 12:30 video-2.mpg
-rw-r--r-- 1 Robert None 0  9. Apr 12:30 video-1.mpg
# Liste der Namen
$ cat t
Aufnahme Stadthalle Ostseite
Aufnahme Stadthalle Westseite
Aufnahme Stadthalle Nordseite
Stadthalle Saal 1
Stadthalle Saal 2
Empfangsbereich
# Trockenlauf, wir sortieren übrigens nach dem Modifikationsdatum
$ ls -1tr *.mpg | sed 's#^.*$#mv -v "&"#' | paste -d ' ' - <(sed 's#^.*$#"&.mpg"#' t)
mv -v "video-1.mpg" "Aufnahme Stadthalle Ostseite.mpg"
mv -v "video-2.mpg" "Aufnahme Stadthalle Westseite.mpg"
mv -v "video-3.mpg" "Aufnahme Stadthalle Nordseite.mpg"
mv -v "video-4.mpg" "Stadthalle Saal 1.mpg"
mv -v "video-5.mpg" "Stadthalle Saal 2.mpg"
mv -v "video-6.mpg" "Empfangsbereich.mpg"
# Jetzt benennen wir um
$ ls -1tr *.mpg | sed 's#^.*$#mv -v "&"#' | paste -d ' ' - <(sed 's#^.*$#"&.mpg"#' t) | dash
„video-1.mpg“ -> „Aufnahme Stadthalle Ostseite.mpg“
„video-2.mpg“ -> „Aufnahme Stadthalle Westseite.mpg“
„video-3.mpg“ -> „Aufnahme Stadthalle Nordseite.mpg“
„video-4.mpg“ -> „Stadthalle Saal 1.mpg“
„video-5.mpg“ -> „Stadthalle Saal 2.mpg“
„video-6.mpg“ -> „Empfangsbereich.mpg“
# Ergebnis
$ ls -l *.mpg
-rw-r--r-- 1 Robert None 0  9. Apr 12:30 Aufnahme Stadthalle Nordseite.mpg
-rw-r--r-- 1 Robert None 0  9. Apr 12:30 Aufnahme Stadthalle Ostseite.mpg
-rw-r--r-- 1 Robert None 0  9. Apr 12:30 Aufnahme Stadthalle Westseite.mpg
-rw-r--r-- 1 Robert None 0  9. Apr 12:30 Empfangsbereich.mpg
-rw-r--r-- 1 Robert None 0  9. Apr 12:30 Stadthalle Saal 1.mpg
-rw-r--r-- 1 Robert None 0  9. Apr 12:30 Stadthalle Saal 2.mpg

Da ist natürlich keine Fehlerbehandlung enthalten, insbesondere falls die Liste der Namen kürzer ist als die Liste der Dateien.

Ich würde vermutlich eher was in Ruby kochen - die Pathname-Library ist da sehr nützlich - man bekommt es sogar als Einzeiler hin. Als Ruby-Skript würde man das z.B. so machen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/ruby1.9.1

# Rename Video files
# Arg 1: directory of video files
# Arg 2: file name with list of names

require 'pathname'

dir, names = ARGV.slice! 0, 2
dir = Pathname.new dir

abort "ERROR: not a directory: #{dir}" unless dir.directory?
names = File.readlines(names)

Pathname.glob(dir + '*.mpg').sort_by(&:mtime).zip(names) do |f, t|
  abort("too few names at #{f}") unless t

  t.strip! # remove trailing newline and whitespace at beginning and end
  t.tr! '/\\', '_' # get rid of dangerous chars in names

  f.rename(f.dirname + (t + f.extname))
end

Ciao

robert

schuhem

(Themenstarter)
Avatar von schuhem

Anmeldungsdatum:
7. April 2012

Beiträge: 5

Danke für die Antworten! Die Antwort von Antiqua habe ich grad noch so verstanden und habe den Befehl so im Terminal eingefügt. Herausgekommen ist das hier:

dude@computername:~$ i=1; for file in videos/* ; do echo "$file" wird zu  "videos/$(sed -n $(echo $i)p text-datei)"; mv "$file" "videos/$(sed -n $(echo $i)p text-datei)"; i=$((i+1)); done
sed: kann text-datei nicht lesen: Datei oder Verzeichnis nicht gefunden
videos/* wird zu videos/
sed: kann text-datei nicht lesen: Datei oder Verzeichnis nicht gefunden
mv: Aufruf von stat für „videos/*“ nicht möglich: Datei oder Verzeichnis nicht gefunden

Entschuldigung, bei den anderen Antworten habe ich leider nicht gewusst, was ich machen soll. ☹ Könnte das jemand für "einen Null-Ahnung-von-Programmierung-Besitzer" (mich) bitte umformulieren?

Antiqua Team-Icon

Avatar von Antiqua

Anmeldungsdatum:
30. Dezember 2008

Beiträge: 4534

Hi,

die Fehlermeldung sagt schlicht, daß du in dem Verzeichnis, in dem du dich befindest (momentan dein Home-Verzeichnis), weder eine Datei mit Namen text-datei noch einen Ordner mit Namen videos hast. Du müstest also die Befehlszeile an deine Gegebenheiten anpassen.

Am einfachsten wäre es, wenn du uns den genauen Namen und den Ort/Pfad deiner Umbenennungs-Datei und den Pfad zu den Videos nennst.

schuhem

(Themenstarter)
Avatar von schuhem

Anmeldungsdatum:
7. April 2012

Beiträge: 5

Pfad des Ordners (/media/Serien/Projekt 060412), enthält die Videos und die Textdatei "ES_Stiftungsfest.txt". Es ist eine externe Festplatte.

jakon Team-Icon

Lokalisierungsteam

Anmeldungsdatum:
16. November 2009

Beiträge: 419

Dann wechselst du in das Verzeichnis und passt den Befehl an (ich war mir mit Antiquas Einzeiler unsicher …, also hab ich Tracks genommen):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
cd "/media/Serien/Projekt 060412"
for datei in *; do
    if [[ "$datei" == ES_Stiftungsfest.txt ]]; then
        continue
    fi

    read zeile
    echo $datei wird zu $zeile
    mv "$datei" "$zeile"
done < ES_Stiftungsfest.txt

schuhem

(Themenstarter)
Avatar von schuhem

Anmeldungsdatum:
7. April 2012

Beiträge: 5

Vielen Dank für die Hilfe, funktioniert einwandfrei! Ich werde mich mal einbisschen in die Bash-Programmierung einlesen, damit ich dann auch weiterhelfen kann... irgendwann ☺

Antworten |