À des fins de test, je voudrais compter le nombre de fichiers images dans un répertoire, en séparant chaque type de fichier image par extension de fichier (jpg = "yes". Ceci car plus tard, il sera utile pour un autre script qui exécutera une action sur chaque extension de fichier). Puis-je utiliser quelque chose comme le suivant pour les fichiers JPEG uniquement?
jpg=""
count=`ls -1 *.jpg 2>/dev/null | wc -l`
if [ $count != 0 ]
then
echo jpg files found: $count ; jpg="yes"
fi
Compte tenu des extensions de fichier jpg, png, bmp, raw et autres, dois-je utiliser un while
cycle pour ce faire?
la source
JPG
et lesjpg
fichiers, et je le voulais récursivement donc ma solution était d'écrirefind . -type f | awk -F . '{print tolower($NF)}' | sort | uniq -c | awk '{print $2,":",$1}'
Cela traverse récursivement les fichiers et compte les extensions qui correspondent:
la source
la source
find
. En outre, cela peut aider les futurs lecteurs de ces réponses si vous donnez une brève explication de votre solution (au cas où ils souhaiteraient la modifier pour un cas légèrement différent).find
par défaut dans le répertoire courant, c'est ainsi que j'utilise ceci. Je ne pense pas que Dieu voulait que les noms de fichiers contiennent des espaces, mais cela fonctionne bien pour ce cas. Si vous avez des nouvelles lignes, vous méritez tout ce que vous obtenez. J'ai pensé à une explication mais j'ai décidé que cela rendrait la réponse trop longue, je pense que la simplicité est ce qui compte. 99% des cas dans 1% du temps. Ceci est probablement compatible avec la version 7.Peut-être que ça peut raccourcir
la source
Tout ce qui implique
ls
est susceptible de produire des résultats inattendus avec des caractères spéciaux (espace et autres symboles). Tout bashisme (comme les tableaux) n'est pas portable. Tout ce qui impliquewhile read
est généralement lent.D'un autre côté, il
find
est TRÈS flexible (beaucoup d'options à filtrer), il a [au moins] deux syntaxes qui sont sûres pour les caractères spéciaux ... et il évolue bien sur un grand répertoire.Pour cet exemple, j'ai utilisé
-iname
pour faire correspondre le nom de l'extension en majuscule et en minuscule. J'ai également restreint le-maxdepth 1
respect de votre question "dans le répertoire courant". Plutôt que de compter le nombre de lignes, où les noms de fichiers pourraient inclure CR / LF,-print0
affichera un octet NULL à la fin de chaque nom de fichier ... tout| tr -d -c "\000" | wc -l
comme le comptage précis des fichiers (octets NULL!).PS
-print0 | tr -d -c "\000" | wc -c
peut être remplacé par-printf "\000" | wc -c
ou même-printf '\n' | wc -l
.la source
peut simplement utiliser ls pour quelque chose de ce simple IMO
ou
ou
la source
Si vous êtes sûr de l'extension, vous pouvez aller avec
find
commela source
touch $'foo\nbar.jpeg
et qu'il soit compté deux fois au lieu d'une fois. Ou pire, quelqu'un le faitmkdir directory.jpeg; touch directory.jpeg/{1..100}.txt