Compter les espaces dans le répertoire BASH
Je veux juste compter les espaces blancs dans le répertoire mais je ne trouve pas comment faire avec la commande AWK. Actuellement j'ai ce code
res=0
IFS="
"
cd DirPath
res2=0
res3=0
ws=0
for f in `find . ! -type d`;
do
let " res += `wc -l $f | awk '{print $1}'` "
let " res2 += `wc -c $f | awk '{print $1}'` "
let " res3 += `wc -w $f | awk '{print $1}'` "
let " ws += `wc -c $f | awk -v RS='[[:space:]]' 'END{print NR}'` "
done
mais le résultat est très bas (176) alors que j'ai 1300000 caractères dans ce répertoire
Réponses
Pour compter le nombre de caractères de retour à la ligne ( -l), de mots ( -w, qui wcsont des séquences de caractères non blancs , les mots sont donc délimités par des espaces blancs ou des non-caractères), de caractères ( -m) et d'octets ( -c), vous pouvez faire :
find . -type f -exec cat {} + | wc -lwmc
Cependant, notez que parce que catconcatène les fichiers, cela pourrait donner des résultats incorrects pour le nombre de mots et de caractères s'il y a des fichiers qui ne se terminent pas par un caractère d'espacement (les fichiers texte doivent se terminer par un caractère de nouvelle ligne, qui est un caractère d'espacement) comme ça pourrait finir par joindre deux octets en un caractère valide par exemple, ou joindre deux mots ensemble.
Exemple:
$ od -tx1 a 0000000 c3 0000001 $ od -tx1 b
0000000 a9
0000001
$ wc -m a b 0 a 0 b 0 total $ cat a b | wc -m
1
$ printf foo > a $ printf bar > b
$ wc -w a b 1 a 1 b 2 total $ cat a b | wc -w
1
Pour compter les caractères d'espacement, POSIXly, vous pouvez faire :
find . -type f -exec cat {} + | tr -cd '[:space:]' | wc -m
(avec la même mise en garde concernant la jonction des octets en caractères), mais notez qu'avec GNU tr, cela ne fonctionne que pour les caractères à un octet (donc pas les caractères non ASCII encodés en UTF-8 par exemple).
Sur les systèmes GNU, vous pouvez recourir à GNU grepet utiliser :
grep -rzo '[[:space:]]' . | LC_ALL=C tr -cd '\0' | wc -c
Cependant, notez que parce qu'avec -z, grepfonctionne sur des enregistrements délimités par NUL, cela finirait par avaler des fichiers texte entiers en mémoire (car les fichiers texte ne contiennent généralement pas d'octets NUL).
cd DIRPATH
res2=0
res3=0
ws=0
let " ws += `grep -rzo '[[:space:]]' . | LC_ALL=C tr -cd '\0' | wc -c` "
for f in `find . ! -type d`;
do
let " res += `wc -l $f | awk '{print $1}'` "
let " res2 += `wc -c $f | awk '{print $1}'` "
let " res3 += `wc -w $f | awk '{print $1}'` "
done
Le code précédent vous donne le nombre de caractères d'espacement dans le répertoire sur ws var
Essayez avec GNU grep:
grep -ro '[[:space:]]' | wc -l