Newsgroup: it.comp.os.linux.iniziare
Titolo: script creare parecchie playlist

ho diversi file audio organizzati in directory così:
artista\anno album\num. traccia titolo.estensione.
ora vorrei creare delle playlist (una per directory) che abbiano come 
nome file lo schema "artista - anno album" presi dai nomi delle 
directory e dei file.
per crearne una per volta è facile, si va nelle singole directory, si fa 
ls *.estensione>playlist.m3u e la lista viene poi letta senza problemi 
dai vari programmi, almeno sotto linux, ma penso che né i player per 
windows né i vari lettori portatili siano schizzinosi.
però vorrei evitarmi la seccatura di spostarmi nelle varie directory e 
scrivere il nome del file. c'è un modo elegante per dare un comando 
ricorsivo o qualcosa del genere?

 ricorsivo o qualcosa del genere?
il tuo script deve:
   - creare la lista degli 'A'
      - creare la lista degli 'a'
         - creare la lista delle 't'
inizia a scrivere, e po fai sapere.
ciao
michele
PS
è più facile di quanto sembri, le indentazioni hanno un significato,
a te scoprirlo.

 ls *.estensione>playlist.m3u e la lista viene poi letta senza problemi 
cd ~/music
find . -type d -mindepth 2 -maxdepth 3 | while read dir
do
    album=$(basename "$dir")
    cd "$dir"
    ls -1 > "$album.m3u"
    cd -
done
-- 
Flavio Visentin
Ubuntu in Zulu significa "Non so usare Debian". (cit. CtRiX)

 
Due cose.
Il modo giusto per fare è:
find . -type d -mindepth 2 -maxdepth 3  -print0 | 
while IFS= -rd''  read  dir
  do
    ...
accettabile anche:
find . -type d -mindepth 2 -maxdepth 3  -print | 
while -r  read  dir
  do
    ...
Attento a ``ls'' è il comando meno affidabile da usare in uno script 
perché il suo output è il meno affidabile ed il più vario possibile.
Certo  nella maggior parte dei casi funziona ma questo è proprio il 
caso su mille dove potresti avere problemi.
In questo caso il problema è la codifica dei caratteri: il formato 
m3u usa la codifica 1252 mentre in genere nei sistemi Linux si usa
Latin-16 o UTF-8. niente di grave, iconv può aggiustare questo e
comunque rischi solo che il lettore mp3 non potrà leggere quella 
playìlist.

 ricorsivo o qualcosa del genere?
No, non c'è un modo elegante, Però la soluzione già proposta è
la migliore.

 playìlist.
Didn't know... ma in effetti non ascoltando musica non mi sono mai imbattuto
nel formato m3u. :-)


 while -r  read  dir
Sarebbero dovuti essere rispettivamente:
while IFS= read -r -d '' dir
e 
while read -r dir
Mi scuso per gli errori

 l'output 
p.es
. a xargs il -print0 sarebbe stato d'obbligo.
Ed io infatti ho anche scritto che la variante  
... print |  while read -r dir''  ...
è accettabile in questo caso.
Comunque i problemi non si verificano solo con gli a capo ma anche 
con i caratteri di controllo, i file che iniziano con uno spazio o file che 
contengono degli escape. 
In particolare l'opzione -r di read evita l'interpretazione delle barre 
rovesciate ed elimina questo ultimo problema.


come è stato impostato da the_zipman è andato tutto bene, semmai proverò 
anche con questa variante. in effetti ho avuto dei problemini per aver 
mischiato audio di formati differenti (ad esempio ho cambiato mp3 con 
ogg nello script e mi ha creato delle playlist vuote nelle directory 
senza ogg sovrascrivendo quelle precedenti), ma ho prevalentemente mp3, 
quindi basta 1 po' di artigianato, x fortuna nel tenere insieme i file 
sono abbastanza ordinato. la "fregatura" in realtà è che il mio lettore 
è un creative zen che ho appena scoperto che ha un formato tutto suo di 
playlist (.zpl) e probabilmente il modo meno rognoso di manipolarlo è 
tramite programmi ad hoc, forse anche gli stessi rhytmbox e/o gnomad, 
volendo perderci un po' di tempo. ad ogni modo, vista la semplicità 
dell'output, ls liscio senza opzioni è più che sufficiente, mi scrive 
nella playlist (di formato m3u)
01 traccia1.mp3
02 traccia2.mp3
eccetera
che viene aperta senza problemi sia in windows che in linux e già è 
moltissimo

 a te scoprirlo.
in effetti tutto è in funzione di due parametri di find:
mindepth e maxdepth.
sinceramente se non avessi visto l'esempio di mallin...
ma appena visto, il neurone s'è ingrifato di brutto,
manco il viagra fà un effetto così :-P
attenzione "playlist" va messo su un file separato,
find così non la digerisce, basta adattarla alle proprie esigenze
e puoi costruirti tutti i cataloghi che vuoi.
ciao
michele
----------------------------  cut - here ----------------------
#!/bin/bash
function playlist ()
{
    cd "$1"
    printf "Sono nell'album: [%s] (%s)\n" "$1" "`pwd`"
    ls -1
    printf "\n===================================\n"
}
declare -f playlist
catalog=""
author=""
album=""
if [ $# -eq 0 ]
then
    printf "usage: %s -c dir [-a author [-d album] ]\n" `basename $0`
    exit
fi
while [ $# -gt 0 ]
do
    case $1 in
    	-c)
    	    shift
    	    catalog="$1"
    	    ;;
    	-a)
    	    shift
    	    author=$1
    	    ;;
    	-d)
    	    shift
    	    album=$1
    	    ;;
    	*)
    	    printf "usage: %s -c dir [-a author [-d album] ]\n" `basename
$0`
    	    exit
    	    ;;
    esac
    shift
done
if [ -n "$catalog" -a -z "$author" -a -z "$album" ]
then
    find "$catalog" -mindepth 2 -maxdepth 3 -type d -exec playlist
"{}" \;
    exit
fi
if [ -n "$catalog" -a -n "$author" -a -z "$album" ]
then
    find "$catalog/$author" -mindepth 1 -maxdepth 2 -type d -exec
playlist "{}" \;
    exit
fi
if [ -n "$catalog" -a -n "$author" -a -n "$album" ]
then
    playlist "$catalog/$author/$album"
    exit
fi
printf "usage: %s -c dir [-a author [-d album] ]\n" `basename $0`
exit -1
----------------------------------------------------------