PDA

View Full Version : [BASH] scremare file e cartelle in base alla dimensione: si può con awk?


]DaLcA[
14-09-2006, 18:16
Come da titolo, dovrei effettuare una ricerca scremando i risultati (tra le varie altre cose, che so fare) in base alla dimensione. Per i file non c'è problema, il comando find considera già quest'opzione, che però non funziona per le cartelle.

Sbattendo la testa e cercando in rete, il modo più semplice è usare il comando awk, ad esempio:

find /tmp/ -exec du -sb {} \; | awk '{if ($1 > 0 && $1 < 10000) print $2}'

Nota: per semplicità ho deciso di usare il du con la find anche per i file (senza quindi l'opzione -type d).

Beh, da console funziona tutto perfettamente, solo che io ho bisogno di metterlo in uno script. Ecco, mi sono accorto che non posso passare i miei argomenti nel codice dell'awk (per colpa degli apici singoli, credo), quindi non posso dargli i limiti per la dimensione, ad esempio:


#!/bin/bash

PERCORSO="$1"
DIM_MIN="$2"
DIM_MAX="$3"

find $PERCORSO -exec du -sb {} \; | awk '{if ($1 > "$DIM_MIN" && $1 < "$DIM_MAX") print $2}'



Ora non so proprio come fare, qualcuno ha in mente qualcosa in proposito? Altri metodi per scremare le cartelle in base alla dimensione sono più che ben accetti :)

kingv
15-09-2006, 09:40
non conosco molto awk ma una cosa così potrebbe andare?

#!/bin/bash

PERCORSO="$1"

find $PERCORSO -exec du -sb {} \; | awk -v DIM_MIN="$2" -v DIM_MAX="$3" '{if ($1 > DIM_MIN && $1 < DIM_MAX) print $2}'

]DaLcA[
17-09-2006, 09:24
Alla fine ho risolto (per pura fortuna). Ecco il codice -- attenzione agli apici singoli --:


#!/bin/bash

PERCORSO="$1"
DIM_MIN="$2"
DIM_MAX="$3"

find $PERCORSO -exec du -sb {} \; | awk '{if ($1 > '$DIM_MIN' && $1 < '$DIM_MAX') print $2}'

Così funziona :D


@kingv : non avevo visto che col parametro -v si possono assegnare i valori dei parametri a variabili prima dell'inizio del codice. Però credo che l'esempio che hai fatto tu non funzioni perchè nel manuale è scritto che il valore delle variabili è disponibile solo nel blocco BEGIN del codice di awk, quindi bisogna mettere il BEGIN.

Grazie lo stesso :)

kingv
17-09-2006, 11:12
sono contento che abbia risolto ma funzionava anche come te l'ho indicato io, ho provato ;)

]DaLcA[
17-09-2006, 11:19
Umm... credevo che per il tuo esempio fosse necessario il blocco BEGIN come indicato nel man, ma è meglio così :) Terrò a mente il tuo metodo, che è certamente più corretto del mio :stordita:

Ora resta "solo" il problema dell'altro thread (http://www.hwupgrade.it/forum/showthread.php?t=1283492) :muro: