Newsgroup: it.comp.os.linux.sys
Titolo: script per tipo-file

Salve a tutti e perdonate l'oggetto insulso: il lunedì post ponte non è il 
massimo :-)
veniamo al dunque: ho un fileserver ed avrei la necessità di determinare 
quanti (in MB, o GB) file ho di determinati tipi di file.
qualcosa del tipo:
pdf            1.23 GB
jpg            0.56 GB
ecc..
ho provato a fare delle prove ma il problema del case mi ha frenato ed il 
tempo è tiranno..
ho cercato un po' in rete ma non ho trovato nulla.. qualcuno sa consigliarmi 
qualcosa, anche degli spunti? esiste qualche utility per scopi del genere?
TIA
Stefano 

 massimo :-)
E' una domanda da .iniziare
man apropos
man file

 man file
ti ringrazio per la risposta, ma non vedo come i due comandi suddetti 
possano essermi di aiuto
mi spiegheresti come fai a sapere lo spazio totale occupato da tutti i file 
di un tipo (es. pdf) a partire da una directory e considerando tutte le 
sottodirectory usando i due comandi da te indicati?
ti ringrazio
Ciao
Stefano 

 ecc..
<snip>
Prova questo:
----------------------------------------------------------------------
#!/bin/bash
#
DIRECTORY=/var
RISULTATO=/tmp/ris
IFS="
"
[ -f $RISULTATO ] && rm $RISULTATO
# Estrae la lista dei file contenuti in $DIRECTORY.
# Ogni riga contiene il nome ed il tipo del file.
LISTA_FILE=$(find $DIRECTORY -type f -print0 |
                xargs -0 file |
                        sed -e 's/\(^.*: *[a-zA-Z0-9 ,]*\).*/\1/' |
                                sed -s 's/,.*//')
# Per ogni file scrive in $RISULTATO il tipo e la dimensione
# separati da tab.
for F in $LISTA_FILE
do
        NOME=$(echo $F | cut -f1 -d ":")
        DIMENSIONE=$(ls -l $NOME | tr -s " " | cut -f 5 -d " ")
        TIPO=$(echo $F | tr -s " " | sed -e "s/.*: //" | sed -e "s/ /_/g")
        [ -z $TIPO ] && TIPO="Tipo_Non_Trovato"
        echo -e "$TIPO\t$DIMENSIONE" >> $RISULTATO
done
# Riprende i dati contenuti in $RISULTATO, calcola il totale per
# tipo e lo visualizza in ordine di dimensione crescente
clear
cat $RISULTATO |
        awk '{totale[$1]+=$2}
             END{
                 for ( item in totale )
                        print totale[item], item}' |
                sort -n |
                        sed -e "s/_/ /g"
----------------------------------------------------------------------
Rimane da formattare l'output numerico.
Se trovi errori, fammelo sapere che uno scriptillo come questo puo' far
comodo anche a me.
Ciao
Stefano

 usando i due comandi da te indicati?
$ du -a nomedirectory | grep '\.[pP][dD][fF]
lista tutti i file fi tipo pdf con alla sinistra (primo campo) il 
numero di blocchi occupato da ciascun file.
Con uno script non dovrebbe essere difficile calcolare lo spazio totale.
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   Registered Linux user #337974  < 
http://giovanni.homelinux.net/
 >

 man awk
Hai dimenticato:
man du

 ...
Ti stai arrampicando sugli specchiquando basta solo
connettere du e find.

mallin.shetland wrote:

Come?

 Come?
Questo è il mio best effort (un po' naif, lo ammetto):
echo "0" > /tmp/zero ; find ~ -name '*.pdf' -exec cksum {} \; | cut -d"
" -f2 | sed -e 's/$/+\\/g' | cat - /tmp/zero | bc

 lista tutti i file fi tipo pdf con alla sinistra (primo campo) il
Lista tutti i file con "estensione" pdf non di "tipo" pdf.
E comunque per quelli senza estensione?
Ciao
Stefano

 $ du -a nomedirectory | grep '\.[pP][dD][fF]
Buon tentativo, ma dovresti invertire la logica 
dell'operazione; du fa gia` il lavoro che vuoi quindi devi
dare in pasto a du la lista dei file. 


una cosa così:
find /dir -iname "*.pdf" -exec du -b  \{\} \; | awk '{ s+=$1; print "la 
somma è", s }' | tail -n 1 -
il tipo di file è determinato dall'estensione, se vuoi verificarlo a 
prescindere da questa devi usare file, ma mi sa che sarebbe troppo lungo.

ste...@tin.it
 scrisse:

Queste sono cose adatte per icoli, posta li'.
(Mi sembra di stare alle medie quando i bulli davano 
appuntamenti all'uscita dalla scuola dietro il vicolo)

 prescindere da questa devi usare file, ma mi sa che sarebbe troppo lungo.
Perche`?
Basta usare find, fare eseguire file e filtrare l'output con 
grep o sed.

 Queste sono cose adatte per icoli, posta li'.
Senti, qualcuno ha chiesto come risolvere un problema.
Altri hanno proposto la loro soluzione pratica.
Tu sai solo dare indicazioni di massima parlando di du e find, dimenticando
che il tipo di file e' legato all'estensione solo in windows (e comunque
esistono anche i file privi di estensione).
Mostraci un tuo codice.
Personalmente sono sempre pronto ad imparare.
E comunque non dirmi di spostarmi su icoli.
Io il problema l'ho risolto.
Stefano

 solo in windows...
No non lo ho dimenticato.
Pero` in Linux il tipo del file puo` essere file regolare, 
directory, device a carattere, device a blocchi, FIFO, link
simbolico e socket. Ed inoltre questa divisione in tipi non
e`  una cosa fondamentale ma e` legata solo a motivi di 
efficienza: i file che non sono file regolari vengono (o 
venivano) gestiti direttamente dal kernel e quindi il 
filesystem li distingue ma non li tratta diversamente dai
file regolari. Credo che tu stia facendo confusione tra
tipo e formato di un file. 

 tipo e formato di un file.
Strano le prime due righe di man file riportano:
-----------------------------------------------
FILE(1)
file - determina il tipo di file
-----------------------------------------------
Quindi sembrerebbe che, almeno in IT.comp.os.linux.sys, il tipo di file sia
quello di cui parlo nei miei post.

 grep o sed.
certo, ma l'esecuzione sarà lentissima

 certo, ma l'esecuzione sarà lentissima
Se questo e` quello che serve... 


indipendentemente dalla banalità o meno della mia richiesta, tu hai 
suggerito di usare i comandi:
apropos
file
du
<premessa>
non è un flame
</premessa>
ora, visto che tutti gli altri suggerimenti usano find, awk, sed ed altri 
comandi DIVERSI da quelli da te indicati, ti rinnovo la richiesta di 
mostrare, per pura accademia, come ottenere il risultato che ho chiesto *con 
i comandi* da te indicati..
questo perchè io non ho problemi ad imparare da chi sa più di me, ma mi da 
fastidio chi come te tratta gli altri con fare da sborone salvo poi non 
produrre nulla.
la soluzione io l'ho già trovata, grazie ai suggerimenti degli altri poster, 
che ringrazio.
Stefano

 find /dir -iname "*.pdf" -print0 | du -bc --files0-from=- | tail -n1 -
[root@file-server files]# find ./ -iname "*.pdf" -print0 | 
du -bc --files0-from=- | tail -n1 -
du: unrecognized option `--files0-from=-'
Try `du --help' for more information.
pare che la mia versione di du (S.O. centos 4.6) non contempli tale 
parametro :-)
grazie comunque
Saluti
Stefano

 quanti (in MB, o GB) file ho di determinati tipi di file.
jdiskreport


interessante.. ma farlo girare su una macchina senza X e java e da remoto su 
ssh la vedo ardua.. :-)
lo segno comunque perchè può essere utile
Ciao
Stefano 

 grazie comunque
eh già, hai ragione, esiste soltanto da coreutils 5.3.0

 interessante.. ma farlo girare su una macchina senza X e java 
E questo lo dobbiamo indovinare?

 parametro :-)
Basta usare xargs ed un po` di collante.

 Basta usare xargs ed un po` di collante.
E per collante intendo qualcosa del tipo:
find /dir -iname "*.pdf" -print0 |xargs du -b | 
 awk 'BEGIN {totale=0}
      totale += $1
      END {print $totale}'
***NON TESTATO***

 *con i comandi* da te indicati..
Quali erano le tue richieste iniziali?
Volevi avere qualche spunto? 
apropos sta per questo.
Volevi una utility per scopi del genere?
I tuoi scopi erano sapere le dimensioni di dei file
di un certo tipo?
file indovina il tipo di un file
du stampa le dimensioni di un file
find non lo ho nominato perche` solo in seguito si e` 
ipotizzato che volevi conoscere le dimensioni cumulative 
dei file con una certa estensione e non di quelle dei file
con un certo formato.

 ***NON TESTATO***
Lo ho testato, pare funzioni ma ho commesso alcuni refusi; 
ecco la versione corretta:
find . -iname '*.pdf' -print0 | 
  xargs -0 du -b |
  awk 'BEGIN {totale=0}
             {totale += $1}
      END    {print totale}'

 E questo lo dobbiamo indovinare?
Su un server non e' certo una condizione insolita.
-- 
Per rispondermi, sostituisci a nomecognome il mio nome e cognome
To reply me, substitute nomecognome with my real name and surname
http://bitsandchaos.wordpress.com

 Queste sono cose adatte per icoli, posta li'.
Non credo.


 
Ancora meno insolita se è un file server :-)
Almeno per quel che riguarda X.
PSK

Mandi! Stefano Zamboni
  In chel dì si favelave...
SZ> ho cercato un po' in rete ma non ho trovato nulla.. qualcuno sa consigliarmi 
SZ> qualcosa, anche degli spunti? esiste qualche utility per scopi del genere?
Che problema hai?
Io sostanzialmente degli share samba che sono alla mercè degli utenti,
il nastro che stava per finire e utenti cazzoni che non facevano
pulizia.
[Si, basterebbe definire quota o grpquota, ma ovviamente poi ci sarebbe
stata la crocefissione in sala mensa... ;)]
Ho cercato tanto, ma alla fine mi sono scritto un accrocchione enorme
di script perl che ho chiamato cupec (Colpirne Uno Per Educarne Cento ;)
che ravana nello share e usando File::Magic mi fa un elenco utente per
utente dell'occupazione disco, e invia email agli utenti 'morosi'.
All'inizio volevo fare una cosa ipermodificabile, poi mi sono scassato
e ho 'hardcodato' nello script le email per gli utenti, quindi ne è
uscito un accrocchio totale.
Se serve... non fa molto di più di find, file, sed, ... messi assieme,
a dire il vero, ma credo possa essere utile.
-- 
  Dio del cielo se mi vorrai
  in mezzo agli altri uomini mi cercherai		(F. De Andre`)