フォルダ内のファイル数を数え、次のコマンドを使用する必要があります。
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
をファイルとしてカウントしているようですが、これは正しくありません。
wc
は、文字、Word、および行カウンタであり、ファイルカウンタではありません。
プログラマ/スクリプト作成者であるあなたは、それをあなたが望むものを数えさせ、それに応じて計算を調整する責任があります。
あなたの場合、あなたは次のようなことをすることができます:
echo $((`ls|wc -l`-1))
最後に、ls
は、引数のない通常のls
ではない長いリストを提供するため、おそらくエイリアスであることに注意してください。したがって、混乱を避けるために、ls
のフルパス(通常は/bin/ls
)を参照することをお勧めします。
上記の追加情報、
出力を処理したい場合は、find
の代わりにls
を使用する必要があります。これには、より適切な先物がいくつかあります(例:-print0
)結果を他のアプリケーションにパイプするため。
上記の場合、次のように使用できます。
find . -type f | wc -l
これにより、現在のディレクトリにあるfilesが一覧表示されます。
wc -l
はls
コマンドの出力の行数を返すため機能していません。この場合はtotal 44
が含まれています。シェルにはls
のエイリアスがls -cml
であるため、出力を台無しにする追加情報を取得しています。
代わりに、コマンド"ls" -Aq | wc -l
を使用してください。 -Aコマンドは、dotfilesを含むディレクトリ内のすべてのファイルをリストしますが、.
および..
は除外します。ここでの引用は重要です-エイリアスを無視し、/bin/ls
を直接実行します。
-q
は、改行文字が含まれている場合でもファイル名がすべて1行に出力されるようにします(改行文字は?
としてレンダリングされます)。
他の人がすでに述べたように、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
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