1 |
* Sebastian Damm schrieb: |
2 |
> Am 18. Januar 2006 schrieb Volker Katz: |
3 |
>> Die Dateien finde ich mit find und die id3-Tags kann ich mit id3info |
4 |
>> auslesen: find /home/musik -iname '*.mp3' -exec id3info {} \; |
5 |
>> Aus id3info die BPMs extrahieren, kann man so machen: |
6 |
>> id3info file.mp3 | grep TBPM | cut -c 36- |
7 |
> |
8 |
> ===== 8< ===== Schnipsel ausm Kopf ohne Testen ===================== |
9 |
> |
10 |
> #!/bin/bash |
11 |
> |
12 |
> FILENAME=path/to/filename |
13 |
> |
14 |
> if [ -f "$FILENAME" ] |
15 |
> then |
16 |
> rm "$FILENAME" |
17 |
> touch "$FILENAME" |
18 |
> fi |
19 |
|
20 |
Wenn es eh überschrieben wird kann man auch einfach drauflos: |
21 |
|
22 |
echo -n > "$FILENAME" |
23 |
|
24 |
|
25 |
> for i in `find /home/musik -iname '*.mp3'` |
26 |
|
27 |
Ist vielleicht antik, aber bei "for in in 'was mit *'" bekomme ich immer |
28 |
Bauchgrimmen, besser fände ich da: |
29 |
|
30 |
find ... | while read i |
31 |
|
32 |
Weiterhin gibt es Probleme mit Blanks in Dateinamen (bei mp3s nicht |
33 |
selten): |
34 |
|
35 |
$> ls |
36 |
foo.mp3 |
37 |
baz baz.mp3 |
38 |
qux.mp3 |
39 |
|
40 |
$> for i in `find /home/musik -iname '*.mp3'` ; do echo "$i"; done |
41 |
./bar |
42 |
baz.mp3 |
43 |
./foo.mp3 |
44 |
./qux.mp3 |
45 |
|
46 |
|
47 |
Da muß IFS ran: |
48 |
|
49 |
$> find /home/musik -iname '*.mp3' | while IFS= read i ; do echo "$i" ; done |
50 |
./bar baz.mp3 |
51 |
./foo.mp3 |
52 |
./qux.mp3 |
53 |
|
54 |
Sauber. |
55 |
|
56 |
|
57 |
> do |
58 |
> BPM=`id3info "$i" | grep TBPM | cut -c 36-` |
59 |
> let BPM=$BPM/4 |
60 |
|
61 |
Da muss aber sicher sein, daß $BPM keine Blanks enthält: |
62 |
|
63 |
$> BPM="4 " |
64 |
$> let BPM=$BPM/4 |
65 |
$> echo $BPM |
66 |
4 |
67 |
|
68 |
Hängt natürlich vom Datenmaterial ab, also ggf. tr oder sed drüber |
69 |
laufen lassen. Vielleicht sollte man sich das aber auch alles sparen und |
70 |
gannzen Krams durch awk ersetzen. Dazu müste man mal ein paar |
71 |
Beispieldatensätze sehen (ich habe nur *.ogg hier ;-). Awk ist wirklich |
72 |
sehr mächtig. |
73 |
|
74 |
|
75 |
> echo "$i $BPM" >> "$FILENAME" |
76 |
> done |
77 |
> |
78 |
> cat "$FILENAME" | sort -n > "FILENAME".sorted |
79 |
|
80 |
Das sortiert numerisch nach Dateiname ($i schreibst Du ja an die erste |
81 |
Stelle). Auch braucht man kein "cat": |
82 |
|
83 |
sort -k 2 -n $FILENAME > "$FILENAME".sorted |
84 |
|
85 |
|
86 |
Mal mein Gegenvorschlag (untested magels mp3s) mit awk, die Feldnummer |
87 |
muß ggf. angepasst werden: |
88 |
|
89 |
| #!/bin/sh |
90 |
| |
91 |
| FILENAME=path/to/filename |
92 |
| echo -n > "$FILENAME" |
93 |
| |
94 |
| find /home/musik -iname '*.mp3' | while IFS= read i |
95 |
| do |
96 |
| BPM=`id3info "$i" | awk '{print $2/4}'` # $2 Feldnummer, ggf anpassen! |
97 |
| echo "$i $BPM" >> "$FILENAME" |
98 |
| done |
99 |
| |
100 |
| sort -k 2 -n $FILENAME > "$FILENAME".sorted |
101 |
|
102 |
Falls es sich um viele Dateien handelt, ist es vielleicht sinnvoller den |
103 |
awk auszulagern: In der Schleife Dateiname und id3info in eine Datei |
104 |
schreiben und danach über diese Datei den awk (vielleicht auch schon |
105 |
sortieren) laufen lassen. Bei möglicherweise tausenden von Dateien, |
106 |
spart das dann enorm Zeit. |
107 |
|
108 |
|
109 |
-kfk |
110 |
|
111 |
-- |
112 |
Object-oriented design is the roman numerals of computing. |
113 |
Rob Pike, 1991 |
114 |
-- |
115 |
gentoo-user-de@g.o mailing list |