staging.inyokaproject.org

Umbenennen vieler Dateien mit Hilfe von vielen Textdateien

Status: Ungelöst | Ubuntu-Version: Ubuntu MATE 22.04 (Jammy Jellyfish)
Antworten |

cptechnik

Avatar von 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 Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21863

Das geht sicher schlauer, aber als Anfang

1
2
3
4
5
6
7
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...

1
2
3
4
5
6
7
8
9
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 Team-Icon

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:

1
2
3
4
5
6
7
8
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 Team-Icon

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 Team-Icon

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)
Avatar von cptechnik

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)
Avatar von cptechnik

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 Team-Icon

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 Team-Icon

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 Team-Icon

Moderator & Supporter
Avatar von redknight

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)
Avatar von cptechnik

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)
Avatar von cptechnik

Anmeldungsdatum:
28. Dezember 2007

Beiträge: 320

@rednight: awk kann die Datei nicht finden...

...Leerzeichen im Dateiname?

cptechnik

(Themenstarter)
Avatar von cptechnik

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)
Avatar von cptechnik

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...

Antworten |