Dans un projet avec des milliers de fichiers, je voulais comparer les lignes de code totales aux lignes de code uniquement en PHP (suppression de CSS, JavaScript, etc.)
Quand je cours
find . -type f | xargs wc -l
le total sur la dernière ligne est inférieur que quand je cours
find -E . -regex '.+\.(php|inc)' -type f | xargs wc -l
Considérant le second find
doit être une liste de fichiers plus petite que (est un sous-ensemble strict) du premier find
, comment pourriez wc
signaler un total plus élevé dans le second cas?
find . -type f | xargs cat | wc -l
Il y a plusieurs façons de le faire et
xargs
n'est pas le meilleur. Voici un couple:Le plus simple, est de
cat
chacun des fichiers trouvés parfind
et compter les lignes. Attention, cela ne fonctionne que pour vos noms de fichiers sans espaces ni caractères étrangesSi vos noms de fichiers sont susceptibles de contenir des caractères étranges (barres obliques, espaces, etc.), utilisez ceci à la place:
Un meilleur moyen est d'utiliser find
-exec
option:la source
IFS= read –r n
gérer les noms de fichiers contenant des nouvelles lignes? Peut-être que la solution idéale est un hybride:find … –print0 | xargs –0 cat | wc
.-print0
échoue également sur les nouvelles lignes. J'ai supprimé la référence aux nouvelles lignes pour éviter toute confusion.–0
option dexargs
et le–print0
prédicat defind
ont été conçus pour fonctionner main dans la main.Utilisation
awk
résumer les différents nombres "totaux" duwc -l
les sorties!(Remarque:
wc -l
renvoie le nombre de caractères de nouvelle ligne, i. e. "lignes" finales sans finale\n
caractère ne sera pas compté - comme c'est le cas avecawk
oused
.)la source