Newsgroup: it.comp.os.linux.iniziare
Titolo: Elencare solo nome file e dimensioni

Dunque, vorrei elencare i film che ho in una cartella, nome file e 
dimensione per poi mandarli ad un txt, tipo
 
capolavoro del cinema.mkv - 669 MB
filmaccio trash.avi - 1.3 GB
 
comincio con
 
find . -printf '%P - %s\n' |sort
 
ed il risultato e'
 
capolavoro del cinema.mkv - 701497344
filmaccio trash.avi - 1.395.864.371
 
non male ma le dimensioni non sono elencate come vorrei. Con
 
stat -c "%n - %s" *
 
ottengo un risultato analogo. Allora provo
 
ls -lah | tr -s ' ' | cut -d' ' -f5,9-
 
ed il risultato e'
 
669 MB 	capolavoro del cinema.mkv
1.3 GB	filmaccio trash.avi
 
carino, ma vorrei le dimensioni dopo il nome file, e poi non c'e' il 
trattino :-P. Ho provato anche ad invertire 5 con 9- ma continua a 
mettere prima la dimensione.
 
Qualche idea?
 
Grazie

 mettere prima la dimensione.
 
Togli "cut" e metti "gawk".
 
ls -lah | gawk '{print $9" - "$5}'
 
Attenzione pero`, questo assume che
vi siano sempre e solo 9 campi.
Non so se la condizione sia sempre
rispettata.
 
bye,
 
-- 
 
piergiorgio

Addi' 12 gen 2021 17:04:30, Geronimo Bosco scrive:

Considera che il campo Titolo ha lunghezza variabilissima:
Avatar.mkv
Il prof. dott. Guido Tersilli primario della clinica Villa Celeste
convenzionata con le mutue.avi
 
percio' magari forse ti conviene abituarti alle dim a sinistra.
 
Se pero' non t'importa dell'allineamento puoi farlo con ls:
\ls -gG --block-size=1048576 --time-style="+" | awk '{print $4,"-",$3}'
 
con questa i campi sono 4 fissi e con awk, come dice Piergiorgio, ti
viene proprio come vuoi tu ciao
 
P.S. Io ci metto pure la durata, estratta con ffmpeg ariciao
 
-- 
Yoda
 

 Yoda
 
 
 
-- 
bye, Yoda
 

 detto dei campi fissi -> TUTTO SBAGLIATO, come non detto ciao
 
Per rimediare ho provato questa.. fammi sapere ciao
 
\ls -gG --block-size=1048576 --time-style="+#" \
| sed 's/.......... [0-9][0-9]*  *//' | awk -F"# " '{print $2,"-",$1}'
 
Certo pero' che uno che conosce meglio awk lo fa tutto senza bisogno
d'invocare sed ariciao
 
-- 
Yoda
 

 per poi mandarli ad un txt
 
https://www.sttmedia.com/filelistcreator
 
 
-- 
Henry The Mole.
"I can't believe I ate the whole thing."


Un'idea un po' brutale, ma che può essere d'ispirazione:
 
paste \
     <(find . -printf "%f\n" 2>/dev/null) \
     <(find . -printf "%s\n" 2>/dev/null | numfmt --to=iec) \
     | sort -t$'\t' -k2 -h -r \
     | sed 's/\t/ -/' \
     | less
 
siccome paste lavora con dei files in input, ho usato il "process
substitution":
 
https://tldp.org/LDP/abs/html/process-sub.html
 
 
1)
Prendiamo i nomi dei files (tra l'altro senza il path che fa brutto,
sempre che il path non ti serva ad altro...):
 
find . -printf "%f\n" 2>/dev/null
 
2)
Poi prendiamo la dimensione dei files e la traduciamo in "umanamente
leggibile" human readable... Così si ha anche la sua unità di misura
in G M K. Vedere man numfmt per vari formati iec-i, iec, ecc ecc... 
 
find . -printf "%s\n" 2>/dev/null | numfmt --to=iec
 
3)
Ora prendiamo i 2 outputs dei punti (1) e (2) e li diamo in pasto
a "paste" che li unisce così su due colonne. Rispetta ovviamente
gli accoppiamenti (il primo col primo, il secondo col secondo ecc).
Otteniamo quindi due colonne separate da TAB, del tipo:
 
nome<TAB>dimensione_umana
 
La tab, non si vede, ma c'è. Provare in pipe su sed 's/\t/_ECCOMI_/'.
 
4)
A questo punto vogliamo ordinare la lista su una colonna, qua dipende
da cosa si vuole: se si vuole per nome è più facile, basta ordinare
con sort -k1 ecc, o anzi non serve neanche specificare il campo di
ordinamento con -k, basta "sort -h", che ordina praticamente in
alfabetico sul nome. Dovrebbe funzionare anche con "sort" e stop,
se si vuole ignorare il maiuscolo / minuscolo "sort -f", man sort per
altre cuoriosità.
Nel mio esempio ho voluto ordinare per dimensione, inversa quindi dal
file più grande, e in quel caso il numero che è in formato umano, va
valutato da sort tenendo conto del formato umano appunto:
 
sort -t$'\t' -k2 -h -r
 
ordina in base alla seconda colonna tenendo conto che il separatore è
la tab, e che la grandezza da ordinare è un numero in formato umano,
infine inverti l'ordinamento (dal più grande al più piccolo quindi).
 
5)
In teoria abbiamo finito, ma era richiesta la formattazione:
 
nome<SPAZIO>-<SPAZIO>dimensione-umana
 
Invece noi abbiamo
 
nome<TAB>dimensione
 
per cui ho dato tutto in pasto a sed sostituendo TAB con l'altro:
 
sed 's/\t/ - /'
 
 
Il vantaggio di find è che restituisce anche i files delle
sottocartelle, io ho eliminato il path completo, ma si può
modificare la formattazione di printf a seconda di quello
che serve. Magari non era necesario in questo caso, ma può
tornare utile in altre situazioni.

 dimensione per poi mandarli ad un txt, tipo
 
Ok, innanzitutto grazie a tutti per le risposte. Stamattina ho dato 
un'occhiata veloce ma non avevo molto tempo ed ho visto la soluzione di 
Yoda
 
\ls -gG --block-size=1048576 --time-style="+#" \
| sed 's/.......... [0-9][0-9]*  *//' | awk -F"# " '{print $2,"-",$1}'
 
che leggermente modificata
 
ls -gGh --time-style="+#" \
| sed 's/.......... [0-9][0-9]*  *//' | awk -F"# " '{print $2,"-",$1}'
 
mi da esattamente quello che volevo, adesso vedro' di capire come 
ricavare anche la durata con ffmpeg :-P. Anche la soluzione di Joe e' 
ottima, molto interessante la sezione dedicata a "sort" e l'utilizzo di 
  alcuni comandi che non conoscevo e che approfondiro'.
 
Di nuovo grazie a tutti

 ricavare anche la durata con ffmpeg :-P.
 
Ho scritto ffmpeg perche' ffprobe e' nel pacchetto stesso di ffmpeg,
devi buttar fuori 1 e 2 insieme e filtrarli con sed meglio che con
grep. Un'alternativa e' lo scritto perl exiftool (il pacchetto con
la Deb e' libimage-exiftool-perl, attento che c'e' un omonimo),
pero' bada che con questo se non ci vai cauto ti puo' sovrascrivere
o tagliar via il file, se non ricordo male ciao
 
-- 
Yoda
 

 Si' lo so che non l'avevi chiesto, ma i mega sono la migliore unita'
-snip-
 
Che poi se vuoi i byte e' da ridere tutta la riga di comando mia qui
su, perche' basta semplicissimamente questa:
find -type f -printf "%P - %s\n"
 
la differenza e' che questa entra e cerca i file-film anche dentro
eventuali subdirectory (come ha fatto notare Joe), ma ti scrive solo
i file che ci trova. Mentre invece la mia di ieri qui su ti scrive
soltanto i nomi delle subdir ciao
 
-- 
Yoda
 

 find -type f -printf "%P - %s\n"
 
E forse e' pure meglio questa con la subdir ariciao
find -type f -printf "%f - %s\n"
 
-- 
Yoda
 

 grep. 
 
Stavo proprio guardando ffprobe, mi sembra lo strumento piu' adatto. 
Grazie per le integrazioni negli altri messaggi.
 
Bye


%f     File's name with any leading directories
       removed (only the last %element).
 
%p     File's name.
 
%P     File's name with the name of the command line
       argument under which it was found removed.
 
 
 
Se volete solo il nome del file senza path usate "%f",
se volete la subdir usate "%P" o anche "%p", ma è più
pulita la maiuscola forse.
 
printf fa anche qualche allineamento più mirato, esempio:
 
find -type f -printf '%-80P  -%12s\n'
 
%-80P	significa, nome allineato a sinistra, ma con
	80 caratteri dedicati.
 
-%14s	significa, metti il trattino "-", poi metti la
	dimensione allineata a destra con 12 caratteri
	dedicati ad ospitare il numero in bytes.
	Calcolando che un film è grande 1G quindi 1
	miliardo di bytes 1.000.000.000, 10 caratteri,
	al limite potrebbero essere 11 nel caso di un
	video dell'ordine dei 100G, non direi ma non si
	sa mai, con 14 stiamo sicuri che l'allineamento
	non dovrebbe andare a ramengo.

       non dovrebbe andare a ramengo.
 
Ma non credo che Geronimo lo voglia allineato il campo dim,
altrimenti lo metterebbe per primo come fanno tutti gli umani.
 
Allinearlo a destra e' un orrore quando si deve leggere, pero' in
effetti sembra che a Geronimo interessi solo per trovare eventuali
duplicati e allora in questo caso l'allineamento e' praticamente
essenziale, destra o sinistra che sia ciao
 
-- 
Yoda
 

 
 
O forse gli converrebbe, per evitare questo e altri 
"problemi", abituarsi ad usare underscore al posto degli 
spazi nei nomi file, come consigliato praticamente in 
qualunque guida per imparare l'uso della shell.
In quel caso ls e cut sarebbero sufficienti.
Scusate la pedanteria...
 
Ciao.

 Scusate la pedanteria...
 
Be' allora s'impone la conoscenza dell'eccezionale detox:
 
------------------
Package: detox
Description-it: sostituzione di caratteri problematici nei nomi dei file
 detox è un'utilità progettata per ripulire i nomi dei file. Sostituisce i
 caratteri con cui è difficile lavorare, come gli spazi, con equivalenti
 standard. Ripulisce anche i nomi dei file che contengono caratteri UTF-8 o
 Latin-1 (o CP-1252).
 .
 Funzionalità:
  * rimozione o sostituzione di caratteri maiuscoli ASCII Latin-1 (ISO
    8859-1);
  * rimozione o sostituzione di caratteri Unicode codificati come UTF-8;
  * rimozione o sostituzione di spazi e altri caratteri potenzialmente
    difficoltosi;
  * riduzione di "_" e "-" eccessivi;
  * ricorsione di directory, esecuzioni di prova, elenchi prolissi.
 .
 È progettato con la sicurezza in mente: non sovrascriverà un file già
 esistente e non toccherà i file speciali se non richiesto.
 .
 detox è utile per rinominare file in massa automaticamente. Come esempio,
 si può usare detox per standardizzare facilmente moltissimi file, come MP3
 o film, scaricati o memorizzati dentro a una directory.
 .
 Questo pacchetto fornisce i comandi detox e inline-detox. inline-detox può
 essere usato nelle righe di comando come filtro in procedure di shell.
----------------------
 
esempio di inline-detox (le righe le spezzo io qui) ciao
 
[~]yoda_$: echo "Riusciranno i nostri eroi a ritrovare l'amico \
misteriosamente scomparso in Africa?" | inline-detox
 
Riusciranno_i_nostri_eroi_a_ritrovare_l_amico_misteriosamente_\
scomparso_in_Africa_
 
-- 
Yoda
 

   Latin-1 (o CP-1252).
 
Non conoscevo. Io, con i miei file (ma anche con i pochi 
che, saltuariamente, devo produrre per altri), ho preso 
l'abitudine di "detossicarli" alla fonte. :P