Je souhaite obtenir la liste des dossiers au niveau actuel (sans inclure leurs sous-dossiers) et simplement imprimer le nom du dossier et le nombre de fichiers dans le dossier (de préférence filtrer sur * .jpg si possible). Est-ce possible dans le shell bash standard? ls -l
impressions sur tout, mais le nombre de fichiers :)Commande UNIX pour lister les dossiers avec le nombre de fichiers
Répondre
Je suis venu avec celui-ci:
find -maxdepth 1 -type d | while read dir; do
count=$(find "$dir" -maxdepth 1 -iname \*.jpg | wc -l)
echo "$dir ; $count"
done
déposer la deuxième -maxdepth 1
si la recherche dans les répertoires des fichiers jpg doit être récursive considérer les sous-répertoires . Notez que cela ne considère que le nom des fichiers. Vous pouvez renommer un fichier, en cachant que c'est une image jpg. Vous pouvez utiliser la commande file
pour faire une estimation sur le contenu, au lieu (maintenant, les recherches aussi récursive):
find -mindepth 1 -maxdepth 1 -type d | while read dir; do
count=$(find "$dir" -type f | xargs file -b --mime-type |
grep 'image/jpeg' | wc -l)
echo "$dir ; $count"
done
Cependant, ce qui est beaucoup plus lent, car il doit lire une partie des fichiers et éventuellement interpréter ce ils contiennent (s'il a de la chance, il trouve un identifiant magique au début du fichier). Le -mindepth 1
l'empêche d'imprimer .
(le répertoire en cours) en tant qu'un autre répertoire qu'il recherche.
#!/bin/bash
for dir in `find . -type d | grep -v "\.$"`; do
echo $dir
ls $dir/*.jpg | wc -l
done;
le mien est plus rapide à taper de la ligne de commande. :)
Les autres suggestions offrent-elles un réel avantage par rapport aux suivantes?
find -name '*.jpg' | wc -l # recursive
find -maxdepth 1 -name '*.jpg' | wc -l # current directory only
exemple: l'enseignant veut lister les photos jpg de ses élèves. donc il met la commande dans/home et veut lister tous les jpg dans ces sous-répertoires pour valider qu'ils ne contiennent pas quelques *** choses :) exemple de mon précédent enseignant unix. il savait de quoi il parlait: p ppls a essayé de cacher leur pr0n dans les fichiers bin: D –
Cela imprime seulement le nombre total de fichiers, pas le nombre par dossier. Je l'ai fait maintenant de toute façon, suite au commentaire ci-dessus. – DisgruntledGoat
@DisgruntledGoat, j'ai mal interprété votre question. Désolé pour ça. Je comprends maintenant. – m42
Vous pouvez le faire sans commandes externes:
for d in */; do
set -- "$d"*.jpg
printf "%s: %d\n" "${d%/}" "$#"
done
Ou vous pouvez utiliser awk (nawk ou /usr/xpg4/bin/awk sur Solaris):
printf "%s\n" */*jpg |
awk -F\/ 'END {
for (d in _)
print d ":",_[d]
}
{ _[$1]++ }'
J'ai trouvé cette question afte J'avais déjà trouvé mon propre script similaire. Il semble s'adapter à vos conditions et est très flexible, donc j'ai pensé que je l'ajouterais comme une réponse.
Avantages:
- peuvent être regroupées pour toute profondeur (0 pour
.
, 1 pour les sous-répertoires de premier niveau, etc.) - impressions assez sortie
- pas de boucle, et une seule commande
find
, donc il est un peu plus rapide sur les grands répertoires - peut encore être réglé pour ajouter des filtres personnalisés (maxdepth pour le rendre non récurrent, le motif de nom de fichier)
Code Raw:
find -P . -type f | rev | cut -d/ -f2- | rev | \
cut -d/ -f1-2 | cut -d/ -f2- | sort | uniq -c
Emballé en fonction et a expliqué:
fc() {
# Usage: fc [depth >= 0, default 1]
# 1. List all files, not following symlinks.
# (Add filters like -maxdepth 1 or -iname='*.jpg' here.)
# 2. Cut off filenames in bulk. Reverse and chop to the
# first/(remove filename). Reverse back.
# 3. Cut everything after the specified depth, so that each line
# contains only the relevant directory path
# 4. Cut off the preceeding '.' unless that's all there is.
# 5. Sort and group to unique lines with count.
find -P . -type f \
| rev | cut -d/ -f2- | rev \
| cut -d/ -f1-$((${1:-1}+1)) \
| cut -d/ -f2- \
| sort | uniq -c
}
produit une sortie comme ceci:
$ fc 0
1668 .
$ fC# depth of 1 is default
6 .
3 .ssh
11 Desktop
44 Downloads
1054 Music
550 Pictures
Bien sûr, avec le premier numéro, il peut être canalisé à sort
:
$ fc | sort
3 .ssh
6 .
11 Desktop
44 Downloads
550 Pictures
1054 Music
Sous Solaris, il n'y a pas de 'rev' disponible. Vous pouvez utiliser 'perl' à la place comme solution universelle: ' find -P. -type f | perl -lpe '$ _ = reverse' | couper -d/-f2- | perl -lpe '$ _ = reverse' | coupé -d/-f1-2 | couper -d/-f2- | trier | uniq -c' –
- 1. Commande pour compresser tous les fichiers/dossiers sous un répertoire
- 2. API pour lister les fichiers sur un périphérique Windows Mobile
- 3. Rar commande - ignorer certains dossiers
- 4. Lister les fichiers dans la corbeille
- 5. Ligne de commande pour mettre à jour les dossiers SVN
- 6. Copier des fichiers dans le répertoire en fonction de l'entrée utilisateur et en utilisant * pour lister les fichiers
- 7. Commande unix simple, qu'est ce que le {} et \; pour
- 8. ant: liste des dossiers sur la ligne de commande
- 9. Inclure les dossiers de liaison logicielle dans unix "find"
- 10. Comment lancer une commande d'écran Unix avec une commande?
- 11. Puis-je utiliser PowerShell 1.0 pour lister les processus avec leurs PID et lignes de commande?
- 12. Surveillance de fichiers/dossiers
- 13. Fichiers batch - nombre d'arguments de ligne de commande
- 14. nombre de fichiers générés à partir de la commande fractionnée
- 15. Comment énumérer les fichiers + dossiers récursivement avec System.IO.Directory.GetFiles
- 16. Expression régulière pour les fichiers cachés sous unix
- 17. Outils Unix sous GUI pour Windows
- 18. Modification de l'éditeur pour la commande Unix INFO
- 19. Exécuter index.php plutôt que de lister les fichiers
- 20. Comment utiliser une commande shell pour taire une liste de fichiers et de dossiers avec des exclusions
- 21. Exécution d'un script sur plusieurs fichiers sous Unix
- 22. Télécharger le bouton du fichier pour les fichiers distants
- 23. Lister les fichiers par la dernière date de modification
- 24. Inclure les fichiers dans une ligne de commande avec Ruby
- 25. exécuter une commande shell unix si la sortie ne dispose pas d'un certain nombre de lignes
- 26. Commande Unix unique pour transférer correctement un fichier volumineux?
- 27. Comment lister les fichiers dans un répertoire statique?
- 28. Exécuter sa propre commande Unix dans le terminal?
- 29. Comment lister les fichiers installés par un Windows Installer donné?
- 30. TextWriter.ReadToEnd par rapport à Unix wc Commande
à la personne qui a voté à proximité: bash est une langue réelle . – Bernard