"ls|wc -l" の結果が実際のファイル数と一致しません。

"ls|wc -l" の結果が実際のファイル数と一致しません。

フォルダの下のファイル数を数え、次のコマンドを使用する必要があります。

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

実際、このフォルダには5つのファイルしかありません。

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

それはファイルls | wc -lと見なされているようですが、これは間違っています。total 44

答え1

上記の内容に関する追加情報は次のとおりです。

出力を処理するには、find結果を他のアプリケーションにパイプするのに適したいくつかのフューチャーがある代わりに使用する必要があります。ls-print0

上記の場合は、このように使用できます。

find . -type f | wc -l

これにはすべての項目がリストされます。文書現在のディレクトリに。

答え2

この場合を含むwc -lコマンド出力の行数が返されるため、機能しません。シェルにエイリアスがあるため、出力を混乱させる追加情報が得られます。lstotal 44lsls -cml

代わりにコマンドを使用してください"ls" -Aq | wc -l。 -Aコマンドは、ドットファイルを含むディレクトリ内のすべてのファイルを一覧表示しますが、.除外します..。ここでの参照は重要です。エイリアスを無視して直接/bin/ls実行されます。

-qファイル名に改行文字が含まれていても、ファイル名が1行にのみ印刷されるようにします(レンダリングされます?)。

答え3

wcファイルカウンタではなく、文字、単語、行カウンタです。

必要な結果を計算し、それに応じて計算を調整することは、プログラマー/スクリプターとしての責任です。

あなたの場合は、次のようにすることができます。

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

最後に、ls引数なしで正常でない非常に長いリストを提供するので、エイリアスを指定できますls。したがって、混乱を避けるためにls(通常は)フルパスを参照することをお勧めします。/bin/ls

答え4

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

はい、出力には6行があります。以下を使用できます。ls -1単一列形式に対応し、次のようになります。

ls -1
Desktop
Documents
Downloads
Music
Pictures
Public
Templates
Videos

これでwc -l正しい数のファイルを返します。

ls -1 | wc -l
8

関連情報