web-dev-qa-db-fra.com

Compter les fichiers dans un répertoire

J'utilise le code suivant à la fin de l'un de mes scripts pour calculer le nombre de fichiers que j'ai traités et déplacés dans ce répertoire.

# Report on Current Status
echo -n "Cropped Files: "
ls "${Destination}" | wc -l

Mon problème réside dans la façon dont je gère les fichiers en double. À partir de maintenant, je vérifie d'abord la présence du fichier (mon script étant de nature destructive pour les fichiers source que je traite). S'il détecte un fichier de ce nom déjà traité, je modifie le nom du fichier comme suit.

Fichier en double: foo.pdf

Changement de nom: foo.x.pdf

S'il existe un fichier foo.x.pdf, je le renomme à nouveau en foo.xx.pdf. Répétez si nécessaire. J'ai l’intention d’aller plus tard et d’évaluer chaque "version" et de choisir celle qui convient le mieux. Mais c'est là que réside mon problème. Je voudrais compter le nombre de fichiers qui ne contiennent pas .x. .xx. etc. Comment puis-je les supprimer de la sortie ls afin que wc -l ne puisse compter que les fichiers uniques?

TL; DR: Comment obtenir le nombre de fichiers dans un répertoire donné qui ne contiennent pas une sous-chaîne donnée dans leur nom de fichier?

4
Aaron Nichols

Pour trouver le nombre de fichiers dans un répertoire qui ne contiennent pas .x.pdf, essayez:

find "${Destination}" -mindepth 1 ! -name '*.x.pdf' -printf '1' | wc -c

Pour rechercher le nombre de fichiers d’un répertoire ne contenant pas de période - un ou plusieurs x - période - pdf, essayez:

find "${Destination}" -mindepth 1 ! -regex '.*\.x+\.pdf' -printf '1' | wc -c

La recherche ci-dessus récursivement à travers les sous-répertoires. Si vous ne le souhaitez pas, ajoutez l'option -maxdepth 1. Par exemple:

find "${Destination}" -mindepth 1 -maxdepth 1 ! -regex '.*\.x+\.pdf' -printf '1' | wc -c

Notez que, comme nous utilisons -printf '1', cette méthode est sécurisée même si le répertoire contient des fichiers dont le nom contient des caractères de nouvelle ligne.

8
John1024

Sans sous-répertoires:

echo $(($(for file in *.sh ; do echo -n 1+; done; echo 0;)))

parce que:

for file in *.sh ; do echo -n 1+; done; echo 0;
1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+0
2
user unknown

Vous pouvez exclure un ou plusieurs fichiers correspondant à un motif de la commande ls en utilisant (une ou plusieurs fois) l'option -I, --ignore=PATTERN ( référence ):

ls -I "*.x*.pdf" "${Destination}" | wc -l

Ou vous pouvez utiliser la méthode de soustraction de cette manière:

echo $(($(ls "${Destination}" | wc -l) - $(ls "${Destination}"/*.x*.pdf | wc -l)))
0
pa4080