Script Bash pour compter le nombre de fichiers


11

J'ai un script et je souhaite afficher différents messages si un fichier existe ou non. J'ai un script comme:

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

Cependant, si aucun fichier n'existe, cela s'affiche No such file or directoryau lieu de 0 fichier. Il y a un répertoire dans le /import/répertoire, donc je ne peux pas simplement faire une lscommande car cela retournera toujours une valeur supérieure à 0.

Comment puis-je compter le nombre de fichiers d'une extension spécifique (.zip, .gz, etc.) et utiliser cette valeur dans un script bash pour afficher à la fois le nombre de fichiers et ensuite l'utiliser dans une instruction if pour afficher différents messages?

Réponses:


15

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


1
J'ai ajouté -maxdepth 1 pour ne compter que les fichiers du répertoire courant
Wallace Sean

1
Vous voudrez probablement citer «* .zip» au cas où il y aurait des fichiers .zip dans le répertoire courant lorsque celui-ci est invoqué, auquel cas le shell aura développé le * .zip pour vous, pendant que vous voulez qu'il soit passé pour trouver (1).
Phil P

4

Essayez avec ceci:

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

L'idée est de masquer l'erreur "no such file" qui est imprimée dans STDERR en l'envoyant au bitbucket et d'utiliser la fonction de test appropriée pour comparer les nombres. ( -gtSignifie « supérieur ». Il y a aussi -eq, -lt, -ge, etc.)


Comme alternative, vous pouvez également fairecount=$(find /import -type f -name "*.zip" | wc -l)
slillibri

bien sûr, mais cela a une signification différente de juste ls /import/*.zips'il y a des sous
Mat

J'ai défini le maxdepth pour éviter de compter les fichiers dans les sous-répertoires et mis à jour le script pour utiliser -gt. Merci pour l'aide
Wallace Sean

Cela échoue s'il y a trop de fichiers dans le répertoire pour tenir dans argv pour l'invocation ls.
Phil P

Ah, c'est vrai. Corrigé avec une findvariante.
Mat

0

J'ai essayé votre script et, comme prévu, qu'aucun fichier ne correspondent il ne montre 0 fichiers dans la sortie, mais montre aussi l' lserreur juste avant. Résoudre cela est assez facile, il n'est pas nécessaire de laisser tomber ls. Remplacez simplement la première ligne par ceci:

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

2>/dev/nullredirige stderr vers /dev/null, supprimant le message d'erreur.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.