web-dev-qa-db-ja.com

「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 -ltotal 44をファイルとしてカウントしているようですが、これは正しくありません。

3
user288609

wcは、文字、Word、および行カウンタであり、ファイルカウンタではありません。

プログラマ/スクリプト作成者であるあなたは、それをあなたが望むものを数えさせ、それに応じて計算を調整する責任があります。

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

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

最後に、lsは、引数のない通常のlsではない長いリストを提供するため、おそらくエイリアスであることに注意してください。したがって、混乱を避けるために、lsのフルパス(通常は/bin/ls)を参照することをお勧めします。

8
Julie Pelletier

上記の追加情報、

出力を処理したい場合は、findの代わりにlsを使用する必要があります。これには、より適切な先物がいくつかあります(例:-print0)結果を他のアプリケーションにパイプするため。

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

find . -type f | wc -l

これにより、現在のディレクトリにあるfilesが一覧表示されます。

11
Rabin

wc -llsコマンドの出力の行数を返すため機能していません。この場合はtotal 44が含まれています。シェルにはlsのエイリアスがls -cmlであるため、出力を台無しにする追加情報を取得しています。

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

-qは、改行文字が含まれている場合でもファイル名がすべて1行に出力されるようにします(改行文字は?としてレンダリングされます)。

9
cutrightjm

他の人がすでに述べたように、ls | wc -lを実行しても、ディレクトリ内のファイル数を確実に取得できるとは限りません。

信頼できる方法は次のとおりです。

  • findを取得して見つかったファイルごとに.を出力し、wc -lを取得して行数をカウントできます。

     find . -type f -printf '.\n' | wc -l
    
  • ディレクトリに多くのファイルがない場合は、ファイル名を配列に保存してから、配列の長さを取得できます。

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

    すべてのファイルとディレクトリで、これは簡単になります。

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

例:

$ 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
1
heemayl
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
0
agilob