Je peux lister tous les répertoires par
find ./ -type d
J'ai essayé de répertorier le contenu de chaque répertoire et de compter le nombre de fichiers dans chaque répertoire à l'aide de la commande suivante
find ./ -type d | xargs ls -l | wc -l
Mais cela a additionné le nombre total de lignes renvoyées par
find ./ -type d | xargs ls -l
Existe-t-il un moyen de compter le nombre de fichiers dans chaque répertoire?
./
?Réponses:
En supposant que vous avez GNU find, laissez-le trouver les répertoires et laissez bash faire le reste:
la source
find . -maxdepth 1 -type d | sort
; faire y =find $x | wc -l
; echo $ x, $ y; donefind . -type d -print0 | while read -d '' -r dir; do files=("$dir"/*); printf "%5d files in directory %s\n" "${#files[@]}" "$dir"; done
find . -maxdepth 1 -type d -print0 | while read -d '' -r dir; do num=$(find $dir -ls | wc -l); printf "%5d files in directory %s\n" "$num" "$dir"; done
find . -maxdepth 1 -type d -print0 | while read -d '' -r dir; do num=$(find "$dir" -ls | wc -l); printf "%5d files in directory %s\n" "$num" "$dir"; done | sort -rn -k1
$dir
devrait être entre guillemets dans votre premier commentaire pour gérer correctement les noms de répertoires avec des espaces. :find . -maxdepth 1 -type d -print0 | while read -d '' -r dir; do num=$(find "$dir" -ls | wc -l); printf "%5d files in directory %s\n" "$num" "$dir"; done
Ceci imprime le nombre de fichiers par répertoire pour le niveau de répertoire actuel:
la source
du -a | sed '/.*\.\/.*\/.*/!d' | cut -d/ -f2 | sort | uniq -c
. Ajouter| sort -nr
pour trier par le nombre au lieu du nom du répertoire.find. -type f
pour trouver tous les éléments du fichier typecut -d/ -f2
pour découper leur dossier spécifiquesort
pour trier la liste des noms de dossiersuniq -c
pour renvoyer le nombre de fois que chaque nom de dossier a été comptéla source
find . -type f | cut -d/ -f2,3 | sort | uniq -c
Vous pouvez vous arranger pour trouver tous les fichiers, supprimer les noms de fichiers, vous laissant une ligne contenant uniquement le nom de répertoire pour chaque fichier, puis compter le nombre de fois que chaque répertoire apparaît:
Le seul problème est que vous avez des noms de fichiers ou de répertoires contenant un caractère de nouvelle ligne, ce qui est assez improbable. Si vous avez vraiment à vous soucier des nouvelles lignes dans les noms de fichiers ou de répertoires, je vous suggère de les trouver et de les corriger afin qu'elles ne contiennent pas de nouvelles lignes (et persuader tranquillement le coupable de l'erreur de ses chemins).
Si vous êtes intéressé par le nombre de fichiers dans chaque sous-répertoire du répertoire actuel, en comptant tous les fichiers dans tous les sous-répertoires avec les fichiers dans le sous-répertoire immédiat, alors j'adapterais la
sed
commande pour imprimer uniquement le répertoire de niveau supérieur:Le premier motif capture le début du nom, le point, la barre oblique, le nom jusqu'à la barre oblique suivante et la barre oblique, et remplace la ligne par juste la première partie, donc:
est remplacé par
Le deuxième remplacement capture les fichiers directement dans le répertoire courant; ils n'ont pas de barre oblique à la fin, et ceux-ci sont remplacés par
./
. Le tri et le décompte fonctionnent alors uniquement sur le nombre de noms.la source
find
. Certains pourraient: s'il y a un fichierdir1/dir2/dir3/file1
, maisdir1/dir2
ne contient que des sous-répertoires (pas de fichiers simples), alors vous pouvez en déduire sa présence. Mais s'ildir1/dir4
n'a pas de fichiers, son nom n'apparaît tout simplement pas.Voici une façon de le faire, mais probablement pas la plus efficace.
Donne une sortie comme celle-ci, avec le nom du répertoire suivi du nombre d'entrées dans ce répertoire. Notez que le nombre de sorties comprendra également les entrées de répertoire qui peuvent ne pas être ce que vous souhaitez.
la source
bash
,ls
,wc
) pour chaque répertoire trouvé parfind
.man bash
,A -- signals the end of options and disables further option processing
. Dans ce cas, cela empêcherait qu'un fichier mal nommé trouvé dans le cadre de la recherche ne fasse partie du traitement des arguments pour bash.La solution de tout le monde a un inconvénient ou un autre.
Explication:
-type d
: nous nous intéressons aux répertoires.-readable
: Nous ne les voulons que s'il est possible de lister les fichiers qu'ils contiennent. Notez quefind
cela émettra toujours une erreur lorsqu'il essaiera de rechercher plus de répertoires dans ces répertoires, mais cela empêche de les appeler-exec
.-exec sh -c BLAH sh {} ';'
: pour chaque répertoire, exécutez ce fragment de script, avec$0
défini sursh
et$1
défini sur le nom de fichier.printf "%s " "$1"
: affiche de manière portative et minimale le nom du répertoire, suivi uniquement d'un espace, pas d'une nouvelle ligne.ls -1UA
: lister les fichiers, un par ligne, dans l'ordre des répertoires (pour éviter de caler le tube), en excluant uniquement les répertoires spéciaux.
et..
wc -l
: compter les lignesla source
find -type d -readable -exec sh -c 'ls -1UA "$1" | wc -l | tr -d "\n" ; printf "\t%s\n" "$1" ' sh {} ';' | sort -n
Version légèrement modifiée de la réponse de Sebastian utilisant
find
au lieu dedu
(pour exclure la surcharge liée à la taille du fichier quidu
doit être exécutée et qui n'est jamais utilisée):-mindepth 2
Le paramètre est utilisé pour exclure les fichiers du répertoire courant. Si vous le supprimez, vous verrez un tas de lignes comme celle-ci:(un peu comme le
du
fait la variante basée sur la base)Si vous devez également compter les fichiers dans le répertoire actuel, utilisez cette version améliorée:
La sortie sera comme suit:
la source
Cela peut également être fait avec une boucle sur ls au lieu de find
for f in */; do echo "$f -> $(ls $f | wc -l)"; done
Explication:
for f in */;
- boucle sur tous les répertoiresdo echo "$f ->
- imprimer chaque nom de répertoire$(ls $f | wc -l)
- appeler ls pour ce répertoire et compter les lignesla source
for f ./* ; do echo $f $(ls "$f" | wc -l); done
Cela devrait renvoyer le nom du répertoire suivi du nombre de fichiers dans le répertoire.
Exemple de sortie:
Le
export -f
est obligatoire car l'-exec
argument defind
ne permet pas d'exécuter une fonction bash sauf si vous appelez bash explicitement, et vous devez exporter explicitement la fonction définie dans la portée actuelle vers le nouveau shell.la source
./dir1/dir2/dir3
(compter les fichiers dansdir1
et ses sous-répertoires tous ensemble, plutôt que de compter les fichiersdir1/dir2/dir3
séparément de ceux dansdir1/dir2
et les deux séparément de ceux dans/dir1
).J'ai combiné la réponse de @glenn jackman et la réponse de @ pcarvalho (dans la liste des commentaires, il y a quelque chose qui ne va pas avec la réponse de pcarvalho parce que la fonction de contrôle de style supplémentaire du caractère `` '(backtick)).
Mon script peut accepter le chemin comme un augument et trier la liste des répertoires comme
ls -l
, il peut également gérer le problème de "l'espace dans le nom du fichier" .Ma première réponse dans stackoverflow, et j'espère que cela pourra aider quelqu'un ^ _ ^
la source
trouver . -type f -printf '% h \ n' | trier | uniq -c
donne par exemple:
la source
J'ai essayé avec certains des autres ici mais je me suis retrouvé avec des sous-dossiers inclus dans le nombre de fichiers alors que je ne voulais que les fichiers. Ceci s'imprime
./folder/path<tab>nnn
avec le nombre de fichiers, sans compter les sous-dossiers, pour chaque sous-dossier du dossier actuel.la source
Un moyen facile de rechercher de manière récursive des fichiers d'un type donné. Dans ce cas, fichiers .jpg pour tous les dossiers du répertoire courant:
find . -name *.jpg -print | wc -l
la source
Une commande miracle ultra rapide, qui parcourt les fichiers de manière récursive pour compter le nombre d'images dans un répertoire et organiser la sortie par extension d'image:
Crédits: https://unix.stackexchange.com/a/386135/354980
la source
Cela pourrait être une autre façon de parcourir les structures de répertoires et de fournir des résultats détaillés.
la source
J'ai édité le script afin d'exclure tous les
node_modules
répertoires à l'intérieur de celui analysé.Cela peut être utilisé pour vérifier si le nombre de fichiers du projet dépasse le nombre maximal que l'observateur de fichiers peut gérer.
Pour vérifier le nombre maximum de fichiers que votre système peut regarder:
node_modules
Le dossier devrait être ajouté aux chemins exclus de votre IDE / éditeur dans les systèmes lents, et le nombre d'autres fichiers ne devrait idéalement pas dépasser le maximum (qui peut être changé cependant).la source
Cela donnera le décompte global.
la source