ubuntuusers.de

Dateien umbenennen?

Status: Gelöst | Ubuntu-Version: Ubuntu 10.04 (Lucid Lynx)
Antworten |

Aff007

Anmeldungsdatum:
25. April 2011

Beiträge: Zähle...

Situation:

1. Paar hundert Dateien in verschiedenen Verzeichnissen: AVSEQ01.DAT, AVSEQ02.DAT, ... usw.

2. daneben text Dateien AVSEQ01.DAT.son, AVSEQ02.DAT.son, ... usw.

3. Eigenschaften und Inhalt von Dateien *.DAT.son:

1
2
3
aff007@altekiste:/tmp/1$ file AVSEQ0[0-2].DAT.son
AVSEQ01.DAT.son: Little-endian UTF-16 Unicode text, with CRLF, CR line terminators
AVSEQ02.DAT.son: Little-endian UTF-16 Unicode text, with CRLF, CR line terminators
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
aff007@altekiste:/tmp/1$ cat AVSEQ01.DAT.son

��
[]
index=10601
title=Sch�ner fremder Mann (org. Pioneer)
chars=35
singer=Francis, Connie
language=Deutsch
style=Schlager
grade=0
channel=
order_time=0
region=
library=E:\VCD Olli
media_file=\106\AVSEQ01.DAT
remark=VCD
lupd_by=
lupd_time=

Frage: wie umbenennt man, anhand "richtigen" Name aus Zeilen die beginnen mit Wort "title=", Dateien *.DAT und *.DAT.son?

Ich bin Dankbar im voraus!

PS: für konvertation und extraxion von Name im Momemnt kommt nichts besseres als:

iconv -f utf-16 -t utf-8 AVSEQ01.DAT.son | grep title | sed 's/.$//'

Entschuldigung für mein Hundsmiserable Deutsch ☹

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7782

Vielleicht so? Auf eigene Gefahr!

mkdir new

for f in *.DAT
do
    title="`iconv -f utf-16 -t utf-8 < "$f".son | grep ^title= | sed -e s/^title=//`"
    cp "$f" new/"$title".DAT
    cp "$f".son new/"$title".DAT.son
done

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Hi Aff007,

erstmal herzlich willkommen hier auf dem Forum !

Das was Du als "PS:" geschrieben hast sieht doch gar nicht schlecht aus.

Drei Kleinigkeiten würde ich dabei noch ändern:
1.) sed kann die Zeilenauswahl mit erledigen. Durch den Parameter "-n" und den p-Befehl brauchst Du das grep nicht mehr
2.) man sollte die die CRs von den Win..- Zeilenenden entfernen, damit sie nicht im Dateinamen landen und
3.) das Suchwort am Zeilenanfang verankern, damit es keine falschen Treffer gibt, wenn ein Sänger z.B. "Stitler" heißt
(so hat es frostschutz oben auch gemacht):

iconv -f utf-16 -t utf-8 "AVSEQ01.DAT.son"  |  sed -n 's/\r$//; s/^title=//p'

Erklärungen zu sed findest Du z.B. im sed-Tutorium. Damit hättest Du den Titel. Jetzt musst Du damit noch die Dateien umbenennen.

Dazu würde ich die Befehle in ein kleines Skript packen:

#!/bin/bash

alter_name="$1"
pfad="${alter_name%/*}"
titel="$(iconv -f utf-16 -t utf-8 "$1.son"  |  sed -n 's/\r//; s/^title=//p' )" 
neuer_name="$pfad/$titel.DAT"

echo mv -iv "$1" "$neuer_name"

und dieses Skript dann für jede Datei aufrufen. Die Namen habe ich mit Parameter Expansion und Command Substitution zusammengebaut.
Mit dem echo zeigt er nur an, was er tun würde. Erst wenn Du das entfernst, benennt er wirklich die Dateien um.

1. Paar hundert Dateien in verschiedenen Verzeichnissen: AVSEQ01.DAT, AVSEQ02.DAT, ... usw.

Damit Du die Verzeichnisse nicht alle einzeln durchgehen musst, nimmst Du dafür am besten find (→ Wiki find oder man find):

find . -name "AVSE*.DAT" -exec bash -c  das_skript_oben {} \;

Testest Du mal zuerst mit dem "echo" im Skript, ob das soweit klappt ?

LG,

track

Aff007

(Themenstarter)

Anmeldungsdatum:
25. April 2011

Beiträge: 11

Lieber frostschutz und track, vielen Dank für eure Hilfe!

frostschutz: schleife for läuft tadellos.
track: zuerst vielen Dank für Ermutigung, und nützliche links!
konstruktion nur mit sed finde ich wirklich elegant!
mit find klappt im Moment nicht, Fehlermeldung:

1
2
iconv: Kann die Eingabedatei ».son« nicht öffnen: Datei oder Verzeichnis nicht gefunden\\
mv: Aufruf von stat für „“ nicht möglich: Datei oder Verzeichnis nicht gefunden

Ich versuche noch das Ganze testen...

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

iconv: Kann die Eingabedatei ».son« nicht öffnen: Datei oder Verzeichnis nicht gefunden\\
mv: Aufruf von stat für „“ nicht möglich: Datei oder Verzeichnis nicht gefunden

Das bedeutet, dass kein Dateiname an das Skript übergeben wird. (dann ist die Variable "$1" leer)

Probier mal zum testen:

find . -name "AVSE*.DAT" -exec bash -c  echo "X{}X" \;

Kommen da die (alten) Dateinamen mit "X" davor und dahinter ?

track

Aff007

(Themenstarter)

Anmeldungsdatum:
25. April 2011

Beiträge: 11

Ich rekonstruire meine Schritte, vielleicht mache ich was falsch:

cat ren2

1
2
3
4
5
6
7
8
#!/bin/bash

alter_name="$1"
pfad="${alter_name%/*}"
titel="$(iconv -f utf-16 -t utf-8 "$1.son"  |  sed -n 's/\r//; s/^title=//p')"
neuer_name="$pfad/$titel.DAT"

echo mv -iv "$1" "$neuer_name"

ren2 AVSEQ01.DAT

1
mv -iv AVSEQ01.DAT AVSEQ01.DAT/Schöner fremder Mann (org. Pioneer).DAT

nach entfernen "echo" von Zeile 8: ren2 AVSEQ01.DAT

1
mv: Zugriff auf „AVSEQ01.DAT/Schöner fremder Mann (org. Pioneer).DAT“: Ist kein Verzeichnis

Aufruf:

1
find . -name "AVSE*.DAT" -exec bash -c  echo "X{}X" \;

findet nichts, aber

1
2
3
4
find . -name "AVSE*.DAT" -exec echo "X{}X" \;
X./AVSEQ09.DATX
X./AVSEQ02.DATX
... usw.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

find . -name "AVSE*.DAT" -exec bash -c  echo "X{}X" \;

findet nichts ..

Ja, sorry, war mein Fehler. 😳 Die Gänsefüßchen müssen anders stehen:

find . -name "AVSE*.DAT" -exec bash -c  "echo X{}X" \;

Dann passt es.
Genauso musst Du auch in dem anderen find-Befehl die Gänsefüßchen setzen:

find . -name "AVSE*.DAT" -exec bash -c  "ren2 {}" \;

..

ren2 AVSEQ01.DAT

mv -iv AVSEQ01.DAT AVSEQ01.DAT/Schöner fremder Mann (org. Pioneer).DAT

Das ist natürlich Unsinn. - kommt aber daher, dass mein Skript nach dem / sucht, um den Dateipfad zu finden. Das klappt natürlich nur bei Dateinamen, wie find sie liefert.

Probier es mal mit Pfad: ren2 ./AVSEQ01.DAT - dann funktioniert es.

LG,

track

Aff007

(Themenstarter)

Anmeldungsdatum:
25. April 2011

Beiträge: 11

track schrieb:

... Die Gänsefüßchen müssen anders stehen ...
... Probier es mal mit Pfad: ren2 ./AVSEQ01.DAT - dann funktioniert es. ...

Tatsächlich! Jetzt läuft alles. Hier ist Variante welche mir eigentlich genügt ist, und
vielleicht könnte noch jemand das gebrauchen?:

 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
#!/bin/bash

# find . -name "AVSE*.DAT" -exec bash -c "ren2 {}" \;; sort -o /tmp/namen_list.csv /tmp/list.txt && rm -f /tmp/list.txt

alter_name="$1"
pfad="${alter_name%/*}"
titel="$(iconv -f utf-16 -t utf-8 "$1.son" | sed -n 's/\r//; s/^title=//p')"
# komma in Sänger Namen entfernen s/,//;
SINGER="$(iconv -f utf-16 -t utf-8 "$1.son" | sed -n 's/\r//; s/,//; s/^singer=//p')"
SPRACHE="$(iconv -f utf-16 -t utf-8 "$1.son" | sed -n 's/\r//; s/^language=//p')"
STYLE="$(iconv -f utf-16 -t utf-8 "$1.son" | sed -n 's/\r//; s/^style=//p')"
LIBRARY="$(iconv -f utf-16 -t utf-8 "$1.son" | sed -n 's/\r//; s/^library=//p')"
MEDIA_FILE="$(iconv -f utf-16 -t utf-8 "$1.son" | sed -n 's/\r//; s/^media_file=//p')"

neuer_name="$pfad/$titel.DAT"
SINGER_NAME="$pfad/$SINGER.DAT"

if [ -n "$titel" ]; then
mv "$1" "$neuer_name"
mv "$1.son" "$neuer_name.son"
# sollte Titel Zeile leer sein, Sänger Name als Datei Name verwenden:
elif [ -n "$SINGER" ]; then
mv --backup=numbered "$1" "$SINGER_NAME"
mv --backup=numbered "$1.son" "$SINGER_NAME.son"
fi

# Anschlißend tabelle (csv) erstellen:
for in
do
echo -e "\"${titel:-Unbekannt}\";\"${SINGER:-Unbekannt}\";\"${STYLE:-Unbekannt}\";\"${SPRACHE:-Unbekannt}\";\"${LIBRARY:-Unbekannt}${MEDIA_FILE:-Unbekannt}\";" >>/tmp/list.txt
done

Noch mal: ich Danke Dir, lieber track!

Antworten |