Je dois compter le nombre de fichiers sur un grand nombre de répertoires. Existe-t-il un moyen facile de le faire avec un script shell (en utilisant la recherche, wc, sed, awk ou similaire)? Juste pour éviter de devoir écrire un script approprié en python.
La sortie serait quelque chose comme ceci: p> Le nombre après le nom du DIR serait le nombre de fichiers . Un plus serait capable de transformer le comptage de fichiers dot / cachés sur et éteindre. P> merci! P> p>
11 Réponses :
essayer ls | wc code> il répertorie le fichier dans votre répertoire et donne une liste de fichiers sortie sur WC en tant qu'entrée p>
find <dir> -type f | wc -l find -type f will list all files in the specified directory one at each line, wc -l count the amount of newlines seen from stdin.Also for future reference: answers like this are a google away.
Je sais que cette réponse. La question était un peu différente. Y a-t-il un moyen simple de mettre cela dans une boucle pour tous les annuaires?
Essayez le ci-dessous:
du -a | cut -d/ -f2 | sort | uniq -c | sort -nr
Il a répertorié des fichiers pour moi, dommage!
Une manière comme ceci:
$ for dir in $(find . -type d ) > do > echo $dir $(ls -A $dir | wc -l ) > done
plus ou moins ce que je cherchais:
> find . -type d . ./SunWS_cache ./wicked ./wicked/segvhandler ./test ./test/test2 ./test/tempdir. ./signal_handlers ./signal_handlers/part2 > find . -type d | xargs ls -1 | perl -lne 'if(/^\./ || eof){print $a." ".$count;$a=$_;$count=-1}else{$count++}' .: 79 ./SunWS_cache: 4 ./signal_handlers: 6 ./signal_handlers/part2: 5 ./test: 6 ./test/tempdir.: 0 ./test/test2: 0 ./wicked: 4 ./wicked/segvhandler: 9
J'utilise ces fonctions: Les deux supposent que les noms de fichiers ne contiennent pas de nouvelles lignes. P> Voici les versions Bash-seulement: P> nf()(shopt -s nullglob dotglob;for d;do a=("$d"/*);echo "${#a[@]} $d";done)
nfr()(shopt -s nullglob dotglob globstar;for d;do a=("$d"/**);echo "${#a[@]} $d";done)
J'ai aimé la sortie de la réponse basée sur la DU, mais lorsque je cherchais un grand système de fichiers, il prenait des siècles, donc je mets ensemble un petit script basé sur la LS qui donne la même sortie, mais beaucoup plus rapide:
for dir in `ls -1A ~/test/`; do echo "$dir `ls -R1Ap ~/test/$dir | grep -Ev "[/:]|^\s*$" | wc -l`" done
une version générique forte> de la solution de Mehdi Karamosly pour répertorier les dossiers de n'importe quel répertoire sans modification du répertoire actuel em>
trouver -type f -printf '% h \ n' | Trier | UNIQ -C | Trier -n code> p>
Vous pouvez essayer de copier la sortie de la commande LS dans un fichier texte, puis comptez le nombre de lignes dans ce fichier. P>
ls $ emplacement> outtext.txt; Num_files = $ (wc -w wasttext.txt); echo $ num_files
code> p>