
解析された出力がls
奇妙な文字(スペース、...)によって壊れる可能性があるため、危険な場合に\n
ディレクトリ内のファイル数を知るための最良の方法は何ですか?
find
私は通常この種の解析を避けることに頼っていますが、やはりfind mydir | wc -l
同じ理由で中断されます。
私は今Solarisで作業していますが、他のuniceと他のシェルの間でできるだけ移植可能な答えを探しています。
答え1
このヒントはどうですか?
find . -maxdepth 1 -exec echo \; | wc -l
find
とwc
。
答え2
Bashには外部ユーティリティやループはありません。
shopt -s dotglob
files=(*)
echo "${#files[@]}"
shopt -s dotglob
kshではに置き換えるか、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