ディレクトリ内のファイル数を数える最良の方法は何ですか?

ディレクトリ内のファイル数を数える最良の方法は何ですか?

解析された出力がls奇妙な文字(スペース、...)によって壊れる可能性があるため、危険な場合に\nディレクトリ内のファイル数を知るための最良の方法は何ですか?

find私は通常この種の解析を避けることに頼っていますが、やはりfind mydir | wc -l同じ理由で中断されます。

私は今Solarisで作業していますが、他のuniceと他のシェルの間でできるだけ移植可能な答えを探しています。

答え1

このヒントはどうですか?

find . -maxdepth 1 -exec echo \; | wc -l

findwc

答え2

Bashには外部ユーティリティやループはありません。

shopt -s dotglob
files=(*)
echo "${#files[@]}"

shopt -s dotglobkshではに置き換えるか、FIGNORE=.?(.)zsh
ではに置き換えるsetopt glob_dotsか、shopt呼び出しを削除してくださいfiles=(*(D))。 (またはドットファイルを含めない場合は、その行を削除するだけです。)

ドットファイルに興味がない場合は移植可能です。

set -- *
echo "$#"

本当にドットファイルを含めたい場合:

set -- *
if [ -e "$1" ]; then c=$#; else c=0; fi
set .[!.]*
if [ -e "$1" ]; then c=$((c+$#)); fi
set ..?*
if [ -e "$1" ]; then c=$((c+$#)); fi
echo "$c"

答え3

find . ! -name . -prune -print | grep -c /

80年代以降のシステムでは、移植性は非常に優れています。

これは.、およびを除く現在のディレクトリのすべてのディレクトリエントリを計算します。..

また、サブディレクトリのファイル数も計算します。

find .//. ! -name . | grep -c //

(これはUnix V6(1975)にも移植可能でなければなりません。そうする必要はありません-prune。)

答え4

私はいつも使っていましたが、問題がなかった最も簡単なバージョンは次のとおりです。 ls -b1 | wc -l

関連情報