大量のファイルがあるディレクトリがあります。数を表示するためのls
スイッチが見当たりません。ファイルの数を得るためのコマンドラインマジックはありますか?
広い意味での "ファイル "という言葉を使っています。
ls | wc -l
(隠しファイルはカウントせず、ファイル名に改行文字が含まれていないと仮定していることに注意してください)。
隠しファイル(.
と..
を除く)を含め、改行文字の問題を回避するには、正規の方法では次のようになります。
find . ! -name . -prune -print | grep -c /
または再帰的に
find .//. ! -name . -print | grep -c //
ファイルの狭義の定義について
find . -maxdepth 1 -type f | wc -l
カレントディレクトリに少なくとも1つの非隠蔽ファイルがあることがわかっている場合。
set -- *; echo "$#"
これは明らかにあらゆるグロブに一般化できます。
スクリプトでは、位置パラメーターが上書きされてしまうという残念な副作用があります。これを回避するには、サブシェルを使用するか、次のような関数(Bourne/POSIX 版)を使用します。
count_words () {
eval 'shift; '"$1"'=$#'
}
count_words number_of_files *
echo "There are $number_of_files non-dot files in the current directory"
別の解決策としては,$(ls -d -- * | wc -l)
があります。グロブが *
の場合,コマンドは $(ls | wc -l)
と短縮できます。lsの出力を解析すると、いつも不安になりますが、ここでは、ファイル名に改行が含まれていないか、
lsが改行をエスケープしていれば、うまくいくはずです。また、
$(ls -d -- 2>/dev/null | wc -l)には、グロブがマッチしない場合にも潔く対処できるという利点があります (つまり、この場合には 0 を返します。一方、
set ` メソッドでは、グロブが空である可能性がある場合には、面倒なテストが必要です)。
ファイル名に改行文字が含まれる可能性がある場合には,$(ls -d ./* | grep -c /)
を使用する方法もあります。
グロブの展開を ls
に渡すことに依存するこれらの解決策は、マッチするファイルが多い場合には argument list too long エラーで失敗する可能性があります。