Bash script per contare il numero di file


11

Ho uno script e voglio visualizzare diversi messaggi se un file esiste o no. Ho una sceneggiatura come:

count=ls /import/*.zip | wc -l

echo "Number of files: " $count
if [ "$count" > "0" ]; then
    echo "Import $count files"
else
    echo "**** No files found ****"
fi

Tuttavia, se non esistono file, questo viene visualizzato No such file or directoryinvece di 0 file. C'è una directory nella /import/directory, quindi non posso semplicemente eseguire un lscomando poiché restituirà sempre un valore maggiore di 0.

Come posso contare il numero di file di un'estensione specifica (.zip, .gz, ecc.) E usare quel valore in uno script bash sia per visualizzare il numero di file sia per usarlo in un'istruzione if per visualizzare messaggi diversi?

Risposte:


15

count=$(find /import -maxdepth 1 -name '*.zip' | wc -l)


1
Ho aggiunto -maxdepth 1 per contare solo i file nella directory corrente
Wallace Sean

1
Probabilmente vuoi citare '* .zip' nel caso in cui ci siano file .zip nella directory corrente quando questo viene invocato, nel qual caso la shell avrà espanso il * .zip per te, mentre vuoi che sia passato attraverso per trovare (1).
Phil P

4

Prova con questo:

count=$(find /import/ -maxdepth 1 -type f -name '*.zip' | wc -l)
...
if [ $count -gt 0 ] ; then
  ...
else
  ...
fi

L'idea è quella di nascondere l'errore "nessun file simile" che viene stampato su STDERR inviandolo al bitbucket e di utilizzare la funzione di test appropriata per confrontare i numeri. ( -gtSta per "maggiore di". C'è anche -eq, -lt, -ge, etc.)


In alternativa, potresti anche farecount=$(find /import -type f -name "*.zip" | wc -l)
slillibri il

certo, ma questo ha un significato diverso dal solo ls /import/*.zipse ci sono sottodirectory
Mat

Ho impostato il maxdepth per evitare il conteggio dei file nelle sottodirectory e ho aggiornato lo script per usare -gt. Grazie per l'aiuto
Wallace Sean,

Questo non riesce se ci sono troppi file nella directory per adattarsi ad argv per l'invocazione ls.
Phil P

Ah giusto. Corretto con una findvariante.
Mat

0

Ho provato lo script e, come previsto, quando nessun file sono abbinati esso non mostra 0 file in uscita, ma mostra anche l' lserrore di poco prima. Risolvere questo è abbastanza facile, non c'è bisogno di abbandonare ls. Sostituisci la prima riga con questa:

count=$(ls /import/*.zip 2>/dev/null| wc -l)

2>/dev/nullreindirizza stderr a /dev/null, eliminando il messaggio di errore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.