.shファイルを使用してディレクトリ内のファイル数を返します。

.shファイルを使用してディレクトリ内のファイル数を返します。

以下のスクリプトを作成しましたが、ディレクトリ内のファイル数に関係なく、ディレクトリ内のファイル数に対して0を返します。

source ~/Alan/assign/changeDir.sh
num=$(( ls | wc -l ))
echo $num

ChangeDir.shスクリプトは次のとおりです

function my_cd() {
cd ~/Alan
}

私にとって必要なのは、後で同じスクリプトで使用できるように数字を返すことです。これについての指示をいただきありがとうございます。ありがとう

答え1

単一のディレクトリにある名前の数を見つけるには、*その中のglobを展開して生成された単語の数を数えます。

shopt -s nullglob    # to make the * glob expand to nothing
                     # if there is no matching names
set -- *
num=$#

printf '%s\n' "$num"

特別な値$#は位置引数の数です。このsetコマンドは位置パラメータを設定します。

数えてみたいですか?定期的なファイルのみを含め、隠し名前を含めてから

shopt -s nullglob dotglob

for name in *; do
    if [ ! -f "$name" ] || [ -L "$name" ]; then
        # skip non-regular files and symbolic links
        continue
    fi
    files+=( "$name" )
done

num=${#files[@]}

printf '%s\n' "$num"

サブディレクトリでこれを繰り返し実行するには、globstarシェルオプションも設定し、それを**/*グローブパターンとして使用します。

zshシェルではを使用しても十分ですset -- **/*(.DN); print $#

あなたの問題

num=$(( ls | wc -l ))

2つです:

  1. $(( ... ))算術拡張です。ここでコマンドの置き換えを実行する必要があるかもしれません$( ... )
  2. wc -lファイル数はカウントされません。出力の改行数を計算しますls。名前に1つ以上の改行が含まれるファイルは、複数のファイルと見なされますwc -l。を使用してこのようなファイルを生成してテストできますtouch $'hello\nworld'

答え2

隠しファイル()を含むファイル数を数え、.*サブディレクトリを除外するには、次のようにします。

find . -maxdepth 1 -type f -printf '.' | wc -c

すべての特典をfind楽しむことができます。

答え3

問題はコマンド置換の構文エラーだと思います。

注文する

num=$(( expression ))

角かっこの内容を次のように解釈します。山水式を入力して数値結果を割り当てますnumいいえ括弧内にコードで記述された実行の出力を返します。代わりに、lsおよびwcはシェル変数として解釈され、「OR減算」操作が実行lされます。これらの「変数」のどれも初期化されていないため、結果はゼロになります。$ls$wc$l

やりたいことは次のように書かれます

num="$(ls | wc -l)"

しかしそれにもかかわらず、出力の解析ls通常、これは良い考えではありません。代わりにいくつかの答えを見てください。この同様の質問ファイル名に特殊文字が含まれていても機能する「強力な」ソリューションが提供されます。

関連情報