パイプを使用せずにループを使用して現在のディレクトリ内のファイル数を確認する方法があるかどうか疑問に思います。
ファイルが3つある場合、出力は3にする必要があります。
私はあなたが簡単にできることを知っています
ls | wc -l
しかし、パイプを使わずにループに入れる方法があるかどうか疑問に思います。
ありがとう
答え1
echo
Bashでは、配列内の要素数とともに、すべてのファイルを配列に追加できます。
arr=(*)
echo "${#arr[@]}"
答え2
ここにあります:
files_num=0
for i in *; do
(( files_num++ ))
done
echo $files_num
答え3
もちろん、ループを使用できますが、ループは必要ありません。なぜループを使用するのですか?
シェルには、ディレクトリ内のファイルを列挙して数を数えるすべてのツールがあります。基本的なアイデア(関数にカプセル化されています)は次のとおりです。
count_files () {
set *
echo $#
}
つまり、位置引数を現在のディレクトリのファイル名のリストに設定し、位置引数の数を印刷します。これはいくつかの極端なケースに分類されます。
- 最初のファイル名がで始まる場合は、
-
オプションとして解釈されますset
。簡単に解決してくださいset -- *
。 - 一致するファイルがない場合は、
*
変更されずにそのまま残ります。 POSIXシェルに移植するには、この特別なケースを処理する必要があります。 ksh、bash、またはzshを要求する能力がある場合は、より良い方法があります。 - これにはドットファイル(で始まるファイル)は含まれません
.
。個別に含める必要があります。 glob には、pdksh と Forsyth シェル、および zsh の他のすべてのサブエントリを含むまたは除外したドットファイルが一覧表示されます(空で.*
ない場合)。これを計算してはならないと仮定すると、2を引いてください。.
..
bash
GLOBIGNORE
POSIXソリューション:
count_files () {
set -- * .*
if [ "$1" = "*" ] && ! [ -e "$1" ] && ! [ -L "$1" ]; then
shift # Remove the * which didn't match any file
fi
echo $#
}
Ksh93ソリューション:
function count_files {
typeset FIGNORE='@(.|..)'
set -- ~(N)
echo $#
}
すごい解決策:
count_files () (
shopt -s dotglob nullglob
set -- *
echo $#
)
zshソリューション:
count_files () {
emulate -LR zsh
set -- *(DN)
echo $#
}