Precedente :: Successivo |
Autore |
Messaggio |
Shannara Dio maturo
Registrato: 18/05/05 17:24 Messaggi: 1083 Residenza: In cerca di GRoANE
|
Inviato: 24 Mag 2005 09:35 Oggetto: bash script (Linux) |
|
|
Ho già sparso un po' di rischieste per la rete e fatto le mie ricerche, ma, a distanza di una settimana non sono ancora riuscito a risolvere un problema che ho con uno script per la shell bash.
In pratica devo fare una ricerca che mi elenchi tutte le cartelle che abbiano una dimensione superiore ad un certo valore "n".
La versione per file funziona che è una meraviglia:
Codice: | find . -type f -size <n> |
ma la versione per cartelle:
Codice: | find . -type d -size <n> |
non restituisce il risultato sperato e nemmeno un errore. Solo se eseguito nella directory radice "/" mi elenca due cartelle, peraltro con dimensione errata.
Allora ho provato con questo comando:
Codice: | find . -type d -exec du {} \, | sort -n |
In questo modo ottengo una lista ordinata per dimensione con tutte le cartelle incontrate, ma non so come istruire "tail", o un'altro filtro, per escludere le cartelle con dimensione inferiore a n. L'unico vantaggio che ho ottenuto è quello di vedere la dimensione corretta delle cartelle. Se può servire la lista che ottengo è in due colonne (dimensione e path cartella) separate da tabulazione; ad esempio:
Codice: | 13544 ./Desktop
15689 ./.kde
687415 ./.gnome
1769546 ./Pippo
|
Inoltre la lista la salvo in un file di testo tramite redirezione dell'output.
Insomma: come faccio ad avere un elenco di cartelle con dimensione superiore a "n"? (Non m'interessa visualizzare anche la dimensione, purché questa sia corretta)
--- *** --- *** ---
Già che ci sono, chiedo anche se qualcuno mi sa dire come faccio, dato un file di testo con una lista di soli file (con il path completo al file) a creare un'altra lista contenente solo i file della prima lista al cui interno sia presente una certa stringa di testo. In pratica devo filtrare la prima lista non in base ai nomi dei file, ma al loro contenuto.
Ho fatto un tentativo dando in pasto a find una riga per volta ricorsivamente e l'ho impostato in modo che l'output non fosse la riga del file con la stringa di ricerca, ma solo il nome del file contenete la stringa. Find funziona, ma il risultato è una lista di file senza percorso e a me serve tutto il path dato che molti file si trovano in sottocartelle.
Per esempio se la lista iniziale è:
Codice: | /path1/file1.txt
/path2/file2.html
/cartella1/pippo/file3.txt
/cartella1/.tizio/file4.html
|
e la parola "ciao" si trova solo nei file "file2.html" e "file3.txt", l'output di find (perdonatemi, ma non ho a portata di mano la stringa del comando) è:
Codice: | file2.html
file3.txt
|
mentre io voglio che sia:
Codice: | /path2/file2.html
/cartella1/pippo/file3.txt
|
Attendo speranzoso un guru che sappia aiutarmi.
- |
|
Top |
|
|
kingofworms Moderatore Internet e Telefonia
Registrato: 12/09/03 23:01 Messaggi: 1714
|
Inviato: 25 Mag 2005 20:46 Oggetto: |
|
|
Per il primo quesito forse ho ottenuto qualcosa (se non hai già risolto e se ho capito il problema) usando awk. Uno scriptino potrebbe essere: Codice: | #!/bin/bash
echo "Valore minimo: "; read min # dimensione minima delle directory da visualizzare
find . -type d -exec du {} \; | sort -n | awk -v mi=$min '{ if ($1 > mi) { print } } ' |
|
|
Top |
|
|
Shannara Dio maturo
Registrato: 18/05/05 17:24 Messaggi: 1083 Residenza: In cerca di GRoANE
|
Inviato: 25 Mag 2005 22:03 Oggetto: |
|
|
Grazie kingofworms.
Domani faccio una prova appena mi alzo.
Adesso è un po' tardi: devo provarlo su una distro che non è quella che ho installato.
- |
|
Top |
|
|
kingofworms Moderatore Internet e Telefonia
Registrato: 12/09/03 23:01 Messaggi: 1714
|
Inviato: 25 Mag 2005 22:50 Oggetto: |
|
|
Prego; spero che ti sia utile.
Se trovi il comando del secondo quesito quando ho tempo ci penso su. |
|
Top |
|
|
Shannara Dio maturo
Registrato: 18/05/05 17:24 Messaggi: 1083 Residenza: In cerca di GRoANE
|
Inviato: 26 Mag 2005 10:10 Oggetto: |
|
|
OK! il problema delle cartelle pare essere risolto.
Credo anche di aver risolto il secondo problema. Probabilmente quel giorno viaggiavo a mezzo cervello perché ho scritto che usavo find, mentre si trattava di grep. Inoltre oggi ho voluto dare un occhio alle man-pages di grep appena sveglio e ho trovato un'opzione "-l" che mi era sfuggita l'altra volta. In pratica il comando è:
Codice: | grep -l ./testscript/*.sh -e echo |
l'output della prova (ricerca della stringa "echo" nella cartella di test) è:
Codice: | [/] $ grep -l ./testscript/*.sh -e echo
./testscript/dimdir.sh
./testscript/GestioneFile.bck.sh
./testscript/GestioneFile.sh
[/] $
[/] $ grep -l ./testscript/dimdir.sh -e echo
./testscript/dimdir.sh
[/] $ |
Certo, non mi dispiacerebbe un comando più elegante da mettere in uno scrpt al posto del ciclo che devo usare per dare a questo una riga per volta. Comunque funziona e, a me, va bene così.
Devo ancora aggiungere un po' di funzioni allo script, quindi può darsi che incontri altri problemi. Ma per il momento è tutto.
Di nuovo, grazie dell'aiuto kingofworms.
- |
|
Top |
|
|
The_Noise Eroe in grazia degli dei
Registrato: 27/04/05 15:35 Messaggi: 103
|
Inviato: 26 Mag 2005 10:52 Oggetto: |
|
|
Nei casi in cui bisogna effettuare operazioni su un elenco a me piace usare questa sintassi che trovo molto elgante:
Codice: | comando_genera_elenco | while read file; do
# il file corrente e' nella variabile $file
echo "Sto processando $file"
done
|
nel tuo caso si potrebbe scrivere:
Codice: | cat elenco.txt | while read file; do
grep -l "echo" "$file"
done
|
Se elenco.txt contiene una lista di file, viene fatto il grep su ogni file e stampato il nome solo se contiene la stringa "echo".
Ancora meglio sarebbe inserire un test sul nome del file (per essere sicuri che il file esista e sia leggibile). Basta sotituire la riga del grep con:
Codice: | [ -r "$f" ] && grep -l "echo" "$file"
|
in questo modo file non esistenti o non leggibili (tra quelli elencati in elenco.txt) non produrranno errore.
Ciao |
|
Top |
|
|
Shannara Dio maturo
Registrato: 18/05/05 17:24 Messaggi: 1083 Residenza: In cerca di GRoANE
|
Inviato: 26 Mag 2005 12:30 Oggetto: |
|
|
Ottimo, grazie The_Noise.
Per gli errori redirigevo a /dev/null lo std_err, ma la tua soluzione è molto più elegante!
- |
|
Top |
|
|
|