Lorsque vous comptez des lignes avec wc, n'imprimez pas d'erreur chaque fois qu'il s'agit d'un répertoire


12

Je veux compter le nombre total de lignes dans tous les /etcfichiers mais pas les fichiers dans les sous-répertoires, j'ai donc tapé: wc -l /etc/* | tail -1et la sortie est comme:

xxxx is a directory 
yyyy is a directory
total 1752

Ma question est, comment puis-je supprimer (supprimer) ces commentaires et existe-t-il une meilleure façon de faire ce type de décompte?


1
Je pense que l'utilisation de find n'est pas à 100%, car dans / etc il n'y a pas seulement des fichiers réguliers f mais aussi des liens l. donc cette version est bien meilleure: $ sudo wc -l / etc / * 2> / dev / null | queue -1
Hamza

Réponses:


14

Vous pouvez afficher les messages d'erreur dans / dev / null

$ wc -l /etc/* 2>/dev/null | tail -1

Avec cette commande, vous ne voyez que le nombre de lignes dans les fichiers qui sont lisibles par tous. Pour voir le nombre de lignes de tous les fichiers, vous devez augmenter la commande avec sudo.

$ sudo wc -l /etc/* 2>/dev/null | tail -1

8

Isolez les fichiers et exécutez wc dessus

Qu'est wc -l /etc/*- ce qui est *étendu à tous les éléments du /etc/répertoire. L'objectif est donc alors d'isoler les fichiers et de les exécuter wc. Il existe plusieurs façons de procéder.

pour boucle avec test

La testcommande, ou plus fréquemment abrégée, [peut être utilisée pour déterminer si un élément est un fichier normal comme ceci:

[ -f "$FILE" ]

Ainsi, ce que nous pouvons faire est d'itérer sur tous les éléments /etc/et de les exécuter wcsi et seulement si la commande ci-dessus renvoie true. Ainsi:

for i in /etc/*; do [ -f "$i" ] && wc -l "$i" ; done             

trouver

Nous pouvons également utiliser findavec -maxdepth, -typeet -execdrapeaux

find /etc/ -maxdepth 1 \( -type f -o -type l \) -exec wc -l {} +

  • -maxdepthinforme de la profondeur de la structure du répertoire; la valeur 1 signifie uniquement les fichiers du répertoire que nous voulons.
  • -type f lui indique de rechercher des fichiers normaux, OU (représenté par un -oindicateur) pour les liens syboliques (représentés par type l). Toute cette bonté est enfermée entre crochets ()échappés de \sorte que shell les interprète comme faisant partie de la findcommande, plutôt que quelque chose d'autre.
  • -exec COMMAND {} +La structure exécute ici la commande que nous lui donnons, +indiquant de prendre tous les fichiers trouvés et de les remplir comme arguments de ligne de commande pour la commande.

Pour produire un total, nous pourrions canaliser la sortie à tailaimer

$ find /etc/ -maxdepth 1 \( -type f -o -type l \) -exec wc -l {} + | tail -n 1           
[sudo] password for xieerqi: 
 11196  total

Note de côté

Il est plus facile à utiliser wc -l /etc/* 2>/dev/null | tail -1, comme dans la réponse de LD James, mais finddevrait faire partie d'une habitude de traiter les fichiers pour éviter de traiter les noms de fichiers difficiles. Pour plus d'informations à ce sujet, lisez l'essai Comment gérer correctement les noms de fichiers


5

find le fait facilement:

sudo wc -l $(find /etc/ -maxdepth 1 -type f -iname '*')

Production:

...
828 /etc/mime.types
25 /etc/ts.conf
66 /etc/inputrc
 0 /etc/subgid-
8169 total

MAIS si vous voulez juste le nombre en sortie et rien d'autre:

sudo wc -l $(find /etc/ -maxdepth 1 -type f -iname '*') | grep total | awk '{print $1}'

EDIT : newlineserreur kos dit prévaut. Utiliser uniquement le -execrectifie. En outre, /etcne contient pas de tels fichiers.

Production:

8169

Comme indiqué par kos , la commande ci-dessus peut être réduite à:

sudo wc -l $(find /etc/ -maxdepth 1 -type f -iname '*') | awk 'END {print $1}'

EDIT : newlineserreur kos dit prévaut. Utiliser uniquement le -execrectifie. En outre, /etcne contient pas de tels fichiers.

Production:

8169

4
Quel est le but de -iname '*'? ne findcorrespond pas à tout par défaut?
Steeldriver

@steeldriver - Cela n'a pas fonctionné pour moi sans '*'.
Raphael

2

En utilisant z-shell ( zsh), la reine des coquilles , au lieu de bash.

sudo wc -l /etc/*(.) | tail -1
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.