Bash script para contar el número de archivos

11

Tengo un script y quiero mostrar diferentes mensajes si existe un archivo o no. Tengo un script como:

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

Sin embargo, si no existen archivos, esto se muestra en No such file or directorylugar de 0 archivos. Hay un directorio en el /import/directorio, por lo que no puedo simplemente hacer un lscomando, ya que siempre devolverá un valor mayor que 0.

¿Cómo puedo contar el número de archivos de una extensión específica (.zip, .gz, etc.) y usar ese valor en un script bash para mostrar el número de archivos y luego usarlo en una declaración if para mostrar diferentes mensajes?

Wallace Sean
fuente

Respuestas:

15

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

Chris Ting
fuente
1
Agregué -maxdepth 1 para contar solo archivos en el directorio actual
Wallace Sean
1
Probablemente desee citar '* .zip' en caso de que haya archivos .zip en el directorio actual cuando se invoque, en cuyo caso el shell habrá expandido el * .zip por usted, mientras desea que se lo pase para encontrar (1)
Phil P
4

Prueba con esto:

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

La idea es ocultar el error "no existe tal archivo" que se imprime en STDERR enviándolo al bitbucket, y utilizar la función de prueba adecuada para comparar números. ( -gtSignifica "mayor que". También hay -eq, -lt, -ge, etc.)

Estera
fuente
Como alternativa, también podría hacerlocount=$(find /import -type f -name "*.zip" | wc -l)
slillibri
claro, pero eso tiene un significado diferente a solo ls /import/*.zipsi hay subdirectorios
Mat
Configuré la profundidad máxima para evitar contar archivos en subdirectorios y actualicé el script para usar -gt. Gracias por la ayuda
Wallace Sean
Esto falla si hay demasiados archivos en el directorio para caber en argv para la invocación de ls.
Phil P
Ah bien. Corregido con una findvariante.
Mat
0

Probé su script y, como era de esperar, cuando no coinciden los archivos , muestra 0 archivos en la salida, pero también muestra el lserror justo antes. Resolver esto es bastante fácil, no hay necesidad de deshacerse de él ls. Simplemente reemplace la primera línea con esto:

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

2>/dev/nullredirige stderr a /dev/null, suprimiendo el mensaje de error.

Eduardo Ivanec
fuente