ファイル名に改行(またはその他の奇妙な文字)を含めることができるディレクトリ内のファイルの数

ファイル名に改行(またはその他の奇妙な文字)を含めることができるディレクトリ内のファイルの数

特定のディレクトリに含まれる項目(ファイル、サブディレクトリなど)の数を知りたいです。

それについて多くの質問があるようですが、ほとんどの答えは(すべてではありませんが)に依存しているようですwc -l。たとえば、

ls -1 | wc -l

ただし、1つ以上のファイル名に新しい行が含まれている場合、誤った答えが与えられます。ここでもう1つの問題は、ls -1ファイル以上のものが返される可能性があることです。

移植性のない答えは次のとおりです。何千もの同様の質問の1つのコメントに隠されています。。うまくいきますが、残念ながら-printf私のディストリビューションでは利用できないものに依存します。

find -maxdepth 1 -type f -printf "\n" | wc -l (新鮮なオタクによる)

名前に文字を含むファイルを正しく処理するためのより移植可能なソリューションはありますか?

ベストアンサー1

位置パラメータが必要ないと仮定すると、次のことができます。設定する計算してみてください。

set -- .* *
echo $#

これは、次の効果を制限するために関数またはサブシェル内にありますset

countfiles() {
    set -- .* *
    echo $#
}

countfiles

または

(set -- .* *; echo $#)

ここでは、関数またはサブシェルのパラメータのみが「失われ」、基本コンテキストの位置パラメータは変更されずに残ります。

パスを指定することもできます。

set -- path/to/dir/.* path/to/dir/*
echo $#

隠しファイルの具体的な拡張は、シェルの設定によって異なります。拡張の際、POSIX シェルには以下を含める必要があります....*したがって、これらの項目が計算されます。カウントできない場合は確認してください。はい結果から2を含めて($1合計を参照)、減算します。$2

一部のシェルでは、ポイント拡張を設定でき、および/または追加の拡張()を使用してBashで次を使用できます.[^.]* ..?*...dotglob

shopt -s dotglob
set -- *
echo $#

おすすめ記事