|
cptechnik
Anmeldungsdatum: 28. Dezember 2007
Beiträge: 320
|
MEK - Mal Eben Kurz... 😉 Ich möchte viele Dateien umbenennen mit Hilfe eines Strings jeweils der zugehörigen Datei. Bitte helft mir eine Lösung zu finden! DVB-Aufzeichungen, Dateinamen
Datum-Serienname.ts
Datum-Serienname.meta (beinhaltet in Zeile 3 den Namen der Folge
Also gegeben:
20250101 - Heidi.ts
20250101 - Heidi.meta (in Zeile drei: "Abreise")
20250102 - Heidi.ts
20250102 - Heidi.meta (in Zeile drei: "Almöhi") gesucht:
20250101 - Heidi - Abreise.ts
20250102 - Heidi - Almöhi.ts
.meta bleibt unangetastet
möglichst mit keiner zusätzlichen Software... Also sowas wie
ls *.ts > while > grep $1.meta cut zeile 3 > mv $1 $1" - "$GREPPED
|
|
redknight
Moderator & Supporter
Anmeldungsdatum: 30. Oktober 2008
Beiträge: 21863
|
Das geht sicher schlauer, aber als Anfang
| for file in *.ts
do
metafile="${file%.ts}".meta
episode=$(awk 'NR==3' "$metafile")
name="$file" + " - " + "$episode"
mv "$file" "$name"
done
|
|
|
TK87
Anmeldungsdatum: 8. Juli 2019
Beiträge: 266
|
Moin, redknight schrieb: Das geht sicher schlauer, aber als Anfang
Wieso? Sieht doch schon fast gut aus. Nur die Dateiendung würde im neuen Namen an der falschen Stelle stehen.
Zudem würde es Fehler geben, falls die Metadatei nicht existiert (oder in einem vorherigen Durchlauf schon umbenannt wurde). Leicht modifiziert...
| for file in *.ts
do
metafile="${file%.ts}".meta
[ ! -f "$metafile" ]&&continue # Falls Metafile nicht existiert, überspringen
episode=$(awk 'NR==3' "$metafile")
[ -z "$episode" ]&&continue # Falls keine Episode angegeben, überspringen
name="${file%.ts} - ${episode}.ts"
mv "$file" "$name"
done
|
Gruß Thomas
|
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13242
|
redknight schrieb: Das geht sicher schlauer, aber als Anfang [...]
Plus funktoniert nicht so gut mit Zeichenketten in der Shell. Und dann ist da die angemerkte Sache mit der Erweiterung. Vielleicht so: | for file in *.ts
do
base="${file%.ts}"
metafile="$base.meta"
episode=$(awk 'NR==3' "$metafile")
name="$base - $episode.ts"
mv "$file" "$name"
done
|
Ich würde allerdings ein paar Variablen weniger benutzen.
|
|
shiro
Supporter
Anmeldungsdatum: 20. Juli 2020
Beiträge: 1303
|
Hallo cptechnik Und noch'n Gedicht ... Statt der "for" Schleifen Lösung kann man auch das Problem mit "find" lösen, wie im folgenden Beispiel gezeigt werden soll:
# Erzeuge Beispieldateien
touch "20250101 - Heidi.ts"
echo -e "eins\nzwei\nAbreise" >"20250101 - Heidi.meta"
touch "20250102 - Heidi.ts"
echo -e "eins\nzwei\nAlmöhi" >"20250102 - Heidi.meta"
function newFile () { n=$(sed -n '3p' "${1%.ts}.meta" 2>/dev/null) && mv -v "$1" "${1%.ts} - $n.ts"; }
export -f newFile
find ./ -name "*.ts" -exec bash -c "newFile \"{}\"" \;
Die Funktion "newFile" holt die 3. Zeile aus der ".meta" Datei in die Variable "n" und führt ein "mv" aus, wenn die ".meta" Datei gelesen werden konnte. Mit dem "find" wird für jede gefundene ".ts" Datei die Funktion "newFile" ausgeführt.
|
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13242
|
shiro schrieb:
Statt der "for" Schleifen Lösung kann man auch das Problem mit "find" lösen, wie im folgenden Beispiel gezeigt werden soll:
Lohnt sich m.E. nur, wenn die Dateien aus einem Verzeichnisbaum rekursiv verarbeitet werden müssen. Sonst ist das Globbing der Shell (sogar der sh) ausreichend.
|
|
cptechnik
(Themenstarter)
Anmeldungsdatum: 28. Dezember 2007
Beiträge: 320
|
Danke, werde mal mich versuchen... ... nur im aktuellen Verzeichniss,nix rekursiv... lieber Dateien wohin schieben, abarbeiten, zurückschieben... Kopieren wäre sicherer, aber erstmal Kopien erstellen dauert...
|
|
cptechnik
(Themenstarter)
Anmeldungsdatum: 28. Dezember 2007
Beiträge: 320
|
Zwischenstand:
@redknight
awk: Fatal: Die Datei »20250415 2000 - WELT - Spacetime.meta« kann nicht zum Lesen geöffnet werden: Datei oder Verzeichnis nicht gefunden
./rents1.sh: Zeile 6: +: Befehl nicht gefunden
mv: das Verschieben von '20250415 2000 - WELT - Spacetime.ts' nach '' ist nicht möglich: Datei oder Verzeichnis nicht gefunden
.
@rklm:
keine Reaktion des skripts
@shiro: awk: Fatal: Die Datei »20250415 2000 - WELT - Spacetime.meta« kann nicht zum Lesen geöffnet werden: Datei oder Verzeichnis nicht gefunden
insgesamt 8,9M
-rwxr-xr-x 1 peter peter 8,9M Apr 15 21:23 '20250415 2000 - WELT - Spacetime - .ts'
-rwxr-xr-x 1 peter peter 164 Apr 19 00:13 '20250415 2000 - WELT - Spacetime.ts.meta'
-rwxr-xr-x 1 peter peter 171 Apr 27 02:43 rents1.sh
-rwxr-xr-x 1 peter peter 414 Apr 27 02:15 rents2.sh
-rwxr-xr-x 1 peter peter 179 Apr 27 03:09 rents3.sh
wie man sieht... er hängt noch das " - " an obwohl nicht meta nicht geöffnet werden konnte
dings@bums> awk 'NR==3' ./20250415\ 2000\ -\ WELT\ -\ Spacetime.ts.meta
Das Licht - Einem Phänomen auf der Spur
dings@bums>
also... das geht... –-pause-–
|
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13242
|
cptechnik schrieb:
@rklm:
keine Reaktion des skripts
Nicht ganz klar, was Du hier meinst. Ein genereller Tip zum Debuggen: führe das Skript mit set -x aus. Dann spuckt Dir die Shell die ausgeführten Kommandos auf die Konsole und Du kannst sehen, was passiert.
|
|
shiro
Supporter
Anmeldungsdatum: 20. Juli 2020
Beiträge: 1303
|
cptechnik schrieb: @shiro:
awk: Fatal: Die Datei »20250415 2000 - WELT - Spacetime.meta« kann nicht zum Lesen geöffnet werden: Datei oder Verzeichnis nicht gefunden
Da muss bei dir etwas durcheinander gekommen sein. Ein "awk" Befehl wird bei meinem Vorschlag nicht verwendet.
|
|
redknight
Moderator & Supporter
Anmeldungsdatum: 30. Oktober 2008
Beiträge: 21863
|
TK87 schrieb: Nur die Dateiendung würde im neuen Namen an der falschen Stelle stehen.
Ich wusste, ich hab was vergessen 😀 Zudem würde es Fehler geben, falls die Metadatei nicht existiert (oder in einem vorherigen Durchlauf schon umbenannt wurde).
yep. Über fehlerbehandlung hab ich nicht mal nachgedacht
|
|
cptechnik
(Themenstarter)
Anmeldungsdatum: 28. Dezember 2007
Beiträge: 320
|
@shiro
bin durcheinander gekommen... ...danke, deins hat funktioniert... Datei umbenannt './20240130 0352 - TELE 5 - Colony.ts' -> './20240130 0352 - TELE 5 - Colony - Phyllis.ts'
Datei umbenannt './20240130 0307 - TELE 5 - Colony.ts' -> './20240130 0307 - TELE 5 - Colony - 98 Sekunden.ts' Hatte Probleme weil die Dateien anders heissen...
!/bin/bash
function newFile () { n=$(sed -n '3p' "${1%.ts}.ts.meta" 2>/dev/null) && mv -v "$1" "${1%.ts} - $n.ts"; }
export -f newFile
find ./ -name "*.ts" -exec bash -c "newFile \"{}\"" \;
exit 0 ...den Rest werde ich bei Gelegenheit auch mal testen... manchmal will der Kopf halt nicht mehr... ...und nochwas vergessen... :facepalm:
... es sollen alle Dateien umbenannt werden die mit "20250101 0215 - TELE 5 - Heidi" bzw "20240130 0352 - TELE 5 - Colony" anfangen... -rw-rw-r-- 1 peter peter 1078067388 Jan 30 2024 '20240130 0307 - TELE 5 - Colony - 98 Sekunden.ts'
-rw-rw-r-- 1 peter peter 573 Jan 30 2024 '20240130 0307 - TELE 5 - Colony.eit'
-rw-rw-r-- 1 peter peter 105904 Jan 30 2024 '20240130 0307 - TELE 5 - Colony.ts.ap'
-rw-rw-r-- 1 peter peter 36 Jan 30 2024 '20240130 0307 - TELE 5 - Colony.ts.cuts'
-rw-rw-r-- 1 peter peter 143 Apr 26 22:57 '20240130 0307 - TELE 5 - Colony.ts.meta'
-rw-rw-r-- 1 peter peter 1482512 Jan 30 2024 '20240130 0307 - TELE 5 - Colony.ts.sc'
-rw-rw-r-- 1 peter peter 627 Jan 30 2024 '20240130 0352 - TELE 5 - Colony.eit'
-rw-rw-r-- 1 peter peter 900571324 Jan 30 2024 '20240130 0352 - TELE 5 - Colony - Phyllis.ts'
-rw-rw-r-- 1 peter peter 85952 Jan 30 2024 '20240130 0352 - TELE 5 - Colony.ts.ap'
-rw-rw-r-- 1 peter peter 36 Jan 30 2024 '20240130 0352 - TELE 5 - Colony.ts.cuts'
-rw-rw-r-- 1 peter peter 138 Apr 26 22:57 '20240130 0352 - TELE 5 - Colony.ts.meta'
-rw-rw-r-- 1 peter peter 1203344 Jan 30 2024 '20240130 0352 - TELE 5 - Colony.ts.sc' oje...
|
|
cptechnik
(Themenstarter)
Anmeldungsdatum: 28. Dezember 2007
Beiträge: 320
|
@rednight:
awk kann die Datei nicht finden... ...Leerzeichen im Dateiname?
|
|
cptechnik
(Themenstarter)
Anmeldungsdatum: 28. Dezember 2007
Beiträge: 320
|
@tk87
#!/bin/bash
set -x
for file in *.ts
do
metafile="${file%.ts}".meta
[ ! -f "$metafile" ]&&continue # Falls Metafile nicht existiert, überspringen
episode=$(awk 'NR==3' "$metafile")
[ -z "$episode" ]&&continue # Falls keine Episode angegeben, überspringen
name="${file%.ts} - ${episode}.ts"
mv "$file" "$name"
done
exit 0 daraus wird:
./ren-tk87.sh
+ for file in *.ts
+ metafile='20240130 0307 - TELE 5 - Colony.meta'
+ '[' '!' -f '20240130 0307 - TELE 5 - Colony.meta' ']'
+ continue
+ for file in *.ts
+ metafile='20240130 0352 - TELE 5 - Colony.meta'
+ '[' '!' -f '20240130 0352 - TELE 5 - Colony.meta' ']'
+ continue
+ exit 0
...tut sich aber nix... ...vielleicht auch hier das Problem mit Leerzeichen im Dateinamen?
|
|
cptechnik
(Themenstarter)
Anmeldungsdatum: 28. Dezember 2007
Beiträge: 320
|
Ich habe jetzt erstmal eine eigene Version erstellt - mit eurer Hilfe: #!/bin/bash
for file in *.meta ; do.
echo "Diese Datei: $file"
episode=$(sed -n '3p' "$file" 2>/dev/null)
echo "episode = "$episode
alt=${file/.ts.meta/""}
neu=${file/.ts.meta/ - $episode}
echo $alt
echo $neu
mv -v "$alt.eit" "$neu.eit"
mv -v "$alt.ts.ap" "$neu.ts.ap"
mv -v "$alt.ts.sc" "$neu.ts.sc"
mv -v "$alt.ts.cuts" "$neu.ts.cuts"
mv -v "$alt.ts.meta" "$neu.ts.meta"
mv -v "$alt.ts" "$neu.ts"
echo -
done
exit 0
...mal sehen ob das dauerhaft fehlerfrei läuft... ...lokal ja, aber nicht über die samba freigabe von der NAS ....grrr...
|