Hier ist die Musterlösung zu Aufgabe: Kopieren von Audio CDs: cpaudiocd.
Was man daran sehen kann?
#!/bin/sh # kopiert eine Audio-CD komplett auf Platte, und schreibt ein # Skript zum Brennen # # 27.04.2000 kw # # Das Unterdrücken der 2-sec-Pause soll laut "man cdrecord" so nur # mit TEAC-Brennern funktionieren (ich habe einen TEAC CDR55S, da # klappt das auch). # # SCSI-Bus,SCSI-Id,LUN DEVICE0="0,6,0" if [ $# -ge 1 ] then projekt=$1 else echo -n "Name der CD und des Verzeichnisses: " read projekt fi echo "Das Verzeichnis für die Tracks ist $projekt" echo -n "Der CD-Brenner hat SCSI-Bus,SCSI-Id,LUN: ($DEVICE0) " read DEVICE if [ ! "$DEVICE" ] then DEVICE=$DEVICE0 fi echo -n "Welche Tracks, z.B.: 1 5 8 10? (alle) " read trackliste echo -n "Zwischen den Stücken eine 2-sec-Pause j/n? (j) " read jn if [ "$jn" = "n" -o "$jn" = "N" ] then pregap=" defpregap=0" else pregap="" fi mkdir $projekt 2>/dev/null cd $projekt # Inhaltsverzeichnis lesen: # diese Version hatte ich bis SuSE 6.2/cdda2wav 0.95beta07 verwendet: # if cdda2wav -D $DEVICE -N -t1 -d1 -v 3 /dev/null 2>tmp.txt # then # echo "Audio-CD erkannt." # else # echo "keine Audio-CD?" # false # exit # fi # Das klappt jetzt leider nicht mehr, weil cdda2wav jetzt (SuSE 6.3) # nicht mehr 0 zurückgibt, wenn alles ok läuft. # Deshalb wird der Rückgabewert jetzt ignoriert: cdda2wav -D $DEVICE -N -t1 -d1 -v 3 /dev/null 2>tmp.txt # jetzt steht in tmp.txt etwa folgendes: # Read TOC CD Text failed (probably not supported). # #Cdda2wav version 0.95beta07 plus real time scheduling ... # AUDIOtrack pre-emphasis copy-permitted tracktype channels # 1-13 no no audio 2 # Table of Contents: total tracks:13, (total time 39:37.00) # 1.( 3:21.00), 2.( 2:31.00), 3.( 3:44.00), 4.( 1:23.00),... # 6.( 5:35.00), 7.( 2:51.00), 8.( 5:39.00), 9.( 2:06.00),... # 11.( 4:25.00), 12.( 1:20.00), 13.( 1:05.00), # CDDB discid: 0x9d09470d # samplefile size will be 176444 bytes. # recording 1.00000 seconds stereo with 16 bits @ 44100 Hz ->... # votes for little: 160, votes for big: 0 # little endian detected # track 1 successfully recorded # # Daraus extrahieren wir mit grep die Zeile: # 1-13 no no audio 2, # und daraus mit sed dann die Anzahl der Tracks (hier: 13). #echo "cdda2wav sagt:" #cat tmp.txt TRACKS=`cat tmp.txt | grep "^ *1-[0-9]* "|sed 's/^ *1-\([0-9]*\).*$/\1/'` rm tmp.txt if [ "$trackliste" ] then # Tracks angegeben, also nur die kopieren: for i in $trackliste do # Damit die Dateinamen von ls und der shell richtig sortiert # werden, schreiben wir in i2 die Tracknummer zweistellig, und # nehmen dann $i2, um einen Dateinamen daraus zu bilden. # ( || true, weil cdda2wav wieder irgendeinen Unfug zurückgibt) i2=`printf %02d $i` if cdda2wav -q -D $DEVICE -s -b 16 -r 44100 \ -t $i -H $projekt"_"$i2.wav \ || true then echo "Track $i gelesen" else echo "Lesen von Track $i gescheitert." false exit fi done else # alle Tracks sollen kopiert werden # ( || true, weil cdda2wav wieder irgendeinen Unfug zurückgibt) if cdda2wav -q -D $DEVICE -s -b 16 -r 44100 \ -t 1+$TRACKS -B -H $projekt \ || true then echo "Tracks 1-$TRACKS gelesen" else echo "Lesen der CD gescheitert." false exit fi fi echo "#!/bin/sh" >brenn echo "cdrecord -eject -speed=16 dev=$DEVICE -audio -pad$pregap "\ *.wav >>brenn chmod 755 brenn echo "Brennen der CD mit:" echo " cd $projekt; ./brenn; cd .." true exit