Le résultat de "ls | wc -l "ne correspond pas au nombre réel de files

J'ai besoin de countr le nombre de files sous un dossier et utiliser la command suivante.

cd testfolder bash-4.1$ ls | wc -l 6 

En fait, il n'y a que cinq files sous ce dossier,

 bash-4.1$ ls total 44 -rw-r--r-- 1 comp 11595 Sep 4 22:51 30.xls.txt -rw-r--r-- 1 comp 14492 Sep 4 22:51 A.pdf.txt -rw-r--r-- 1 comp 8160 Sep 4 22:51 comparison.docx.txt -rw-r--r-- 1 comp 903 Sep 4 22:51 Survey.pdf.txt -rw-r--r-- 1 comp 1206 Sep 4 22:51 Steam Table.xls.txt 

On dirait que ls | wc -l ls | wc -l count même le total 44 tant que file, ce qui n'est pas correct.

wc est un caractère, un mot et un countur de lignes, pas un countur de files.

Vous, le programmeur / scénariste, êtes responsable de faire en sorte que cela count ce que vous voulez et d'ajuster le calcul en conséquence.

Dans votre cas, vous pourriez faire quelque chose comme:

 echo $((`ls|wc -l`-1)) 

Enfin notez que votre ls est probablement un alias car il donne une longue list qui n'est pas la normale sans argument. Il peut donc être judicieux de se référer au path complet de ls (habituellement /bin/ls ) pour éviter toute confusion.

Juste une information supplémentaire pour ce qui précède,

Vous devriez utiliser find au lieu de ls si vous voulez traiter la sortie, il y a des futures qui sont plus appropriés (par exemple -print0 ) pour -print0 le résultat vers d'autres applications.

Dans le cas ci-dessus, vous pouvez l'utiliser comme ceci,

 find . -type f | wc -l 

qui listra tous les files du directory courant.

Cela ne fonctionne pas car wc -l renvoie le nombre de lignes de la sortie de la command ls , qui dans ce cas inclut le total 44 . Puisque votre shell a un alias pour ls comme ls -cml , vous obtenez ces informations supplémentaires qui gâchent votre sortie.

Utilisez plutôt la command "ls" -Aq | wc -l "ls" -Aq | wc -l . La command -A répertorie tous les files du directory, y compris les files dot, mais exclut . et .. Les citations ici sont importantes – elles ignorent l'alias et exécutent /bin/ls directement.

-q que les noms de files ne sont imprimés que sur une seule ligne, même s'ils contiennent des caractères de nouvelle ligne (qui seraient alors rendus sous la forme ? ).

Comme d'autres l'ont déjà mentionné, faire ls | wc -l ls | wc -l n'est pas toujours un moyen fiable pour get le nombre de files dans un directory.

Voici quelques moyens fiables:

  • Vous pouvez find find pour imprimer a . pour chaque file trouvé et get wc -l pour countr le nombre de lignes:

      find . -type f -printf '.\n' | wc -l 
  • S'il n'y a pas beaucoup de files dans le directory, vous pouvez save les noms de files dans un tableau, puis get la longueur du tableau:

      for f in *; do [ -f "$f" ] && files+=("$f"); done && echo "${#files[@]}" 

    Pour tous les files et directorys, cela devient plus facile:

      files=( * ) && echo "${#files[@]}" 

Exemple:

 $ touch $'foo\nbar' 'foo bar' spam $ ls | wc -l 4 $ find . -type f | wc -l 4 $ find . -type f -printf '.\n' | wc -l 3 $ for f in *; do [ -f "$f" ] && files+=("$f"); done $ echo "${#files[@]}" 3 
 bash-4.1$ ls 1. total 44 2. -rw-r--r-- 1 comp 11595 Sep 4 22:51 30.xls.txt 3. -rw-r--r-- 1 comp 14492 Sep 4 22:51 A.pdf.txt 4. -rw-r--r-- 1 comp 8160 Sep 4 22:51 comparison.docx.txt 5. -rw-r--r-- 1 comp 903 Sep 4 22:51 Survey.pdf.txt 6. -rw-r--r-- 1 comp 1206 Sep 4 22:51 Steam Table.xls.txt 

C'est correct, il y a 6 lignes dans la sortie. Vous voudrez peut-être utiliser: ls -1 qui correspond au format de colonne unique et il ressemble à ceci:

 ls -1 Desktop Documents Downloads Music Pictures Public Templates Videos 

Maintenant, wc -l renvoie le nombre correct de files:

 ls -1 | wc -l 8