web-dev-qa-db-fra.com

Utilisez wc sur tous les sous-répertoires pour compter la somme des lignes

Comment puis-je compter toutes les lignes de tous les fichiers dans tous les sous-répertoires avec wc?

cd mydir
wc -l *
..
11723 total

man wc suggère wc -l --files0-from=-, mais je ne sais pas comment générer la liste de tous les fichiers en tant que NUL-terminated names

find . -print | wc -l --files0-from=-

n'a pas fonctionné.

39
Jonas Stein

Vous voulez probablement ceci:

find . -type f -print0 | wc -l --files0-from=-

Si vous ne voulez que le nombre total de lignes, vous pouvez utiliser

find . -type f -exec cat {} + | wc -l
78
gniourf_gniourf

Vous recherchez peut-être l'option exec de find.

find . -type f -exec wc -l {} \; | awk '{total += $1} END {print total}'

Pour compter toutes les lignes pour une extension de fichier spécifique que vous pouvez utiliser,

find . -name '*.fileextension' | xargs wc -l

si vous le voulez sur deux ou plusieurs types de fichiers différents, vous pouvez mettre l'option -o

find . -name '*.fileextension1' -o -name '*.fileextension2' | xargs wc -l
4
Ankur

Une autre option serait d'utiliser un grep récursif:

grep -hRc '' . | awk '{k+=$1}END{print k}'

L'awk ajoute simplement les chiffres. Les options grep utilisées sont:

   -c, --count
          Suppress normal output; instead print a count of matching  lines
          for  each  input  file.  With the -v, --invert-match option (see
          below), count non-matching lines.  (-c is specified by POSIX.)
   -h, --no-filename
          Suppress the prefixing of file names on  output.   This  is  the
          default  when there is only one file (or only standard input) to
          search.
   -R, --dereference-recursive
          Read all files under each directory,  recursively.   Follow  all
          symbolic links, unlike -r.

Le grep, par conséquent, compte le nombre de lignes correspondant à n'importe quoi (''), donc compte essentiellement les lignes.

4
terdon

Je suggérerais quelque chose comme

find ./ -type f | xargs wc -l | cut -c 1-8 | awk '{total += $1} END {print total}'
0
sge