Newsgroup: it.comp.os.linux.software
Titolo: elenchi numerati di file con riempimento di zeri

In windows (il magico mondo di) avevo un software
*Cdrom List Creator*
- 
http://www.leeos.com/cdrom_list_creator.html
che elencava tutti i file (anche quelli contenuti nelle cartelle, in 
maniera ricorsiva), li ordinava alfanumericamente e li salvava in un file 
di testo
questo programma funziona con wine 0.9.22, ma io ho voluto vedere se si 
riusciva a ottenere lo stesso risultato con gli strumenti già inclusi di 
base in Linux e con questa concatenazione di comandi:
ls -1 |nl -w `find | wc -l |wc -L` -n rz | sort
ottengo un elenco di questo tipo
01      217usbkeyboardbug.log
02      bootcnt.txt
03      bootkernel.log
04      bootsysinit.log
05      flashgot.r3y1skkw.slt
06      geany_1256312473.8933
07      missingmods2485.txt
08      missingmods2617.txt
09      missingmods2664.txt
10      missingmods2831.txt
11      missingmods3451.txt
12      missingmods8790.txt
13      modprobes.log
14      oldmousedevice
15      pkgdialog
16      plugtmp
17      serialstuff
18      taglocales.txt
19      testeide.txt
20      xerrs.log
ora, nella cartella flashgot.r3y1skkw.slt, ci sono altri file
ls -1 flashgot.r3y1skkw.slt
flashgot.fgt
flashgot.sh.test
e quindi aggiungo il parametro -R per ottenere una lista ricorsiva
ls -1 -R |nl -w `find | wc -l |wc -L` -n rz | sort
ma... ecco in quale modo vengono ordinati i nomi dei file
01      .:
02      217usbkeyboardbug.log
03      bootcnt.txt
04      bootkernel.log
05      bootsysinit.log
06      flashgot.r3y1skkw.slt
07      geany_1256312473.8933
08      missingmods2485.txt
09      missingmods2617.txt
10      missingmods2664.txt
11      missingmods2831.txt
12      missingmods3451.txt
13      missingmods8790.txt
14      modprobes.log
15      oldmousedevice
16      pkgdialog
17      plugtmp
18      serialstuff
19      taglocales.txt
20      testeide.txt
21      xerrs.log
22      ./flashgot.r3y1skkw.slt:
23      flashgot.fgt
24      flashgot.sh.test
25      ./plugtmp:
non sono più nell'ordine alfabetico che ci si aspetterebbe
23      flashgot.fgt
24      flashgot.sh.test
questi file perché stanno in quella posizione se cominciano per f? non 
capisco
-- 
Puppy Linux wiki:  
http://puppylover.netsons.org/dokupuppy
Puppy Linux Forum: 
http://puppylinux.ilbello.com
Windows me genuit, Ubuntu rapuere / tenet nunc Puppy Linux...

 capisco
Dopo che nl ha aggiunto i numeri di riga sort ordina secondo i numeri di 
riga. in pratica non fa niente.

 essere mostrato all'utente di turno.
[...]
è un altro è, come scritto sotto, la posizione sbagliata del comando sort
l'ho modificato così:
find |sort|nl -w `find | wc -l |wc -L` -n rz >lista.txt
e produce questo output
01	.
02	./217usbkeyboardbug.log
03	./bootcnt.txt
04	./bootkernel.log
05	./bootsysinit.log
06	./flashgot.r3y1skkw.slt
07	./flashgot.r3y1skkw.slt/flashgot.fgt
08	./flashgot.r3y1skkw.slt/flashgot.sh.test
09	./geany_1256330533.28146
10	./lista.file.txt
ecc...
ma io non ci voglio quel . al primo rigo né quei segni ./ quindi aggiungo:
sed -e '1d'
tr -d "./"
find |sed -e '1d'|sort| nl -w `find | wc -l |wc -L` -n rz | tr -d "./" >lista.txt
per cancellare la prima riga e quegli altri segni:
01	217usbkeyboardbuglog
02	bootcnttxt
03	bootkernellog
04	bootsysinitlog
05	flashgotr3y1skkwslt
06	flashgotr3y1skkwsltflashgotfgt
07	flashgotr3y1skkwsltflashgotshtest
08	geany_125633053328146
09	listafiletxt
10	listatxt
ecc...
poi però così non so più quali sono i file e quali le directory, quindi
non è ancora la soluzione ottimale


    tr -d "./" >lista.txt
Prima di tutto tr effettua delle semplici sostituzioni tra caratteri, (tra 
l'altro cosa che anche sed fa) e  sed accetta più comandi  ed è inutile 
richiamare due programmi che fanno la stessa cosa. Ma la ciò che fa tr 
a te non serve, devi sostituire solo la prima barra e non tutte le barre.
Infine c'è un errore grave: Tu vuoi sostituire ina riga che contiene solo un 
punto mentre tu sostituisci sempre e comunque la prima riga.
Allora:
find $path | tee > $tmpfile1 | sed 's:^\./:: ; /\.$/d' | sort > $tmpfile2 &&
  nl -w $(cat $tmpfile1) $tmpfile2 > outfile
A parte che puoi anche modificare la mia soluzione con awk 

 find $path | tee > $tmpfile1 | sed 's:^\./:: ; /\.$/d' |  ...
Scusate, rientrato a casa mi sono accorto che per la fretta 
ho mancato un pezzo
find $path | 
  tee >(wc -l | wc -L > $tmpfile1) |
  sed 's:^\./:: ; /\.$/d' | 
  sort > $tmpfile2 &&
  nl -w $(cat $tmpfile1) -n rz $tmpfile2 > outfile
Che poi, ripensandoci, puoi anche scrivere:
find $path |
  tee >(wc -l > $tmpfile1) |
  sed 's:^\./:: ; /\.$/d' | 
  sort > $tmpfile2 &&
  nl -w $(wc -L $tmpfile1) -n rz $tmpfile2 > $outfile

 }'
Ehm ho dimenticato un paio di logaritmi ed il ciclo comincia da 1
    END { N=log(NR)/log(10)+1 
              for (i=1;i<=NR;i++)
              printf "%0*d\t%s\n",N,i,a[i]
Inoltre mi sono accorto di una piccola ottimizzazione:
find $path   -type f |
sort |
awk ' 	{ a[NR]=$0 }
   END	{ N=log(NR)/log(10)+1
  	for (i=1;i<=NR;i++)


 }'
[...]
lanciandolo premettendogli time dà questi tempi di esecuzione:
real    0m0.032s
user    0m0.016s
sys     0m0.012s
questi quelli dell'altra versione
real    0m0.032s
user    0m0.020s
sys     0m0.008s
assai minore, comunque, in termini di tempo, sullo stesso numero di file, 
della mischia francesca di comandi messa insieme da me.


 della mischia francesca di comandi messa insieme da me.
L'ottimizzazioene è che il contatore ``i'' replicava la variabile predefinita NR quindi ``i'' è inutile. è solo una questione di stile e di
economia, dal punto di vista pratico la differenza nei tempi di esecuzione 
è difficilmente rilevabile.