Indice del forum Olimpo Informatico
I Forum di Zeus News
Leggi la newsletter gratuita - Attiva il Menu compatto
 
 FAQFAQ   CercaCerca   Lista utentiLista utenti   GruppiGruppi   RegistratiRegistrati 
 ProfiloProfilo   Messaggi privatiMessaggi privati   Log inLog in 

    Newsletter RSS Facebook Twitter Contatti Ricerca
bash script (Linux)
Nuovo argomento   Rispondi    Indice del forum -> Linux
Precedente :: Successivo  
Autore Messaggio
Shannara
Dio maturo
Dio maturo


Registrato: 18/05/05 17:24
Messaggi: 1083
Residenza: In cerca di GRoANE

MessaggioInviato: 24 Mag 2005 09:35    Oggetto: bash script (Linux) Rispondi citando

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
Profilo Invia messaggio privato
kingofworms
Moderatore Internet e Telefonia
Moderatore Internet e Telefonia


Registrato: 12/09/03 23:01
Messaggi: 1714

MessaggioInviato: 25 Mag 2005 20:46    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
Shannara
Dio maturo
Dio maturo


Registrato: 18/05/05 17:24
Messaggi: 1083
Residenza: In cerca di GRoANE

MessaggioInviato: 25 Mag 2005 22:03    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
kingofworms
Moderatore Internet e Telefonia
Moderatore Internet e Telefonia


Registrato: 12/09/03 23:01
Messaggi: 1714

MessaggioInviato: 25 Mag 2005 22:50    Oggetto: Rispondi citando

Prego; spero che ti sia utile.
Se trovi il comando del secondo quesito quando ho tempo ci penso su.
Top
Profilo Invia messaggio privato
Shannara
Dio maturo
Dio maturo


Registrato: 18/05/05 17:24
Messaggi: 1083
Residenza: In cerca di GRoANE

MessaggioInviato: 26 Mag 2005 10:10    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
The_Noise
Eroe in grazia degli dei
Eroe in grazia degli dei


Registrato: 27/04/05 15:35
Messaggi: 103

MessaggioInviato: 26 Mag 2005 10:52    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
Shannara
Dio maturo
Dio maturo


Registrato: 18/05/05 17:24
Messaggi: 1083
Residenza: In cerca di GRoANE

MessaggioInviato: 26 Mag 2005 12:30    Oggetto: Rispondi

Ottimo, grazie The_Noise.

Per gli errori redirigevo a /dev/null lo std_err, ma la tua soluzione è molto più elegante!



-
Top
Profilo Invia messaggio privato
Mostra prima i messaggi di:   
Nuovo argomento   Rispondi    Indice del forum -> Linux Tutti i fusi orari sono GMT + 1 ora
Pagina 1 di 1

 
Vai a:  
Non puoi inserire nuovi argomenti
Non puoi rispondere a nessun argomento
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi