Réponses:
En supposant que vous souhaitiez uniquement un nombre récursif de fichiers, pas de répertoires et d'autres types, quelque chose comme ceci devrait fonctionner:
find . -maxdepth 1 -mindepth 1 -type d | while read dir; do
printf "%-25.25s : " "$dir"
find "$dir" -type f | wc -l
done
find
... -print0 | xargs -0
....
bash
alias
!!
sort -rn -k 2,2 -t$':'
vous obtenez la liste DESC
Cette tâche m'a tellement fasciné que j'ai voulu trouver moi-même une solution. Cela ne prend même pas une boucle de temps et PEUT être plus rapide en vitesse d'exécution. Inutile de dire que les efforts de Thor m'ont beaucoup aidé à comprendre les choses en détail.
Alors, voici le mien:
find . -maxdepth 1 -mindepth 1 -type d -exec sh -c 'echo "{} : $(find "{}" -type f | wc -l)" file\(s\)' \;
Il semble modeste pour une raison, car il est beaucoup plus puissant qu'il n'y paraît. :-)
Cependant, si vous avez l'intention de l'inclure dans votre .bash_aliases
fichier, il doit ressembler à ceci:
alias somealias='find . -maxdepth 1 -mindepth 1 -type d -exec sh -c '\''echo "{} : $(find "{}" -type f | wc -l)" file\(s\)'\'' \;'
Notez la gestion très délicate des guillemets simples imbriqués . Et non, il n'est pas possible d'utiliser des guillemets doubles pour l' sh -c
argument.
strace -fc script
. Votre version effectue environ 70% d'appels système supplémentaires. +1 pour le code plus court :-)
find . -maxdepth 1 -mindepth 1 -type d -exec sh -c 'echo "$(find "{}" -type f | wc -l)" {}' \; | sort -nr
find . -type f | cut -d"/" -f2 | uniq -c
Répertorie les dossiers et les fichiers du dossier actuel avec un nombre de fichiers trouvés en dessous. IMO rapide et utile. (les fichiers montrent avec le compte 1).
| sort -rn
pour trier les sous-répertoires par nombre de fichiers.
L'utilisation de find est certainement la voie à suivre si vous voulez compter de manière récursive, mais si vous voulez juste un décompte des fichiers directement sous un certain répertoire:
ls dir1 | wc -l
ls -d */ | xargs -n1 ls | wc -l
(Utilisez la réponse que vous avez acceptée si cela fonctionne déjà! C'est juste et maintenant vous savez.)
find
c'est si important. (encore moins -print0
et xargs -0
, déjà souligné par Scott dans l'autre réponse)
find . -mindepth 1 -type d -print0 | xargs -0 -I{} sh -c 'printf "%4d : %s\n" "$(find {} -type f | wc -l)" "{}"'
J'ai souvent besoin de compter le nombre de fichiers dans mes sous-répertoires et d'utiliser cette commande. Je préfère que le décompte apparaisse en premier.
Ce que j'utilise ... Cela fait un tableau de tous les sous-répertoires dans celui que vous donnez comme paramètre. Imprimez le sous-répertoire et le nombre de ce même sous-répertoire jusqu'à ce que tous les sous-répertoires soient traités.
#!/bin/bash
directories=($(/bin/ls -l $1 | /bin/grep "^d" | /usr/bin/awk -F" " '{print $9}'))
for item in ${directories[*]}
do
if [ -d "$1$item" ]; then
echo "$1$item"
/bin/ls $1$item | /usr/bin/wc -l
fi
done
Vous pouvez utiliser ce code python. Démarrez l'interpréteur en exécutant python3
et collez ceci:
folder_path = '.'
import os, glob
for folder in sorted(glob.glob('{}/*'.format(folder_path))):
print('{:}: {:>8,}'.format(os.path.split(folder)[-1], len(glob.glob('{}/*'.format(folder)))))
Ou une version récursive pour les nombres imbriqués:
import os, glob
def nested_count(folder_path, level=0):
for folder in sorted(glob.glob('{}/'.format(os.path.join(folder_path, '*')))):
print('{:}{:}: {:,}'.format(' '*level, os.path.split(os.path.split(folder)[-2])[-1], len(glob.glob(os.path.join(folder, '*')))))
nested_count(folder, level+1)
nested_count('.')
Exemple de sortie:
>>> figures: 5
>>> misc: 1
>>> notebooks: 5
>>> archive: 65
>>> html: 12
>>> py: 12
>>> src: 14
>>> reports: 1
>>> content: 6
>>> src: 1
>>> html_download: 1