15

ディレクトリ内のファイルをリストし、それらをループ処理していますが、ファイルの数も知る必要があります。${#dirlist[@]} は常に 1 ですが、for ループは機能しますか?

#!/bin/bash
prefix="xxx"; # as example

len=${#prefix}; # string length
dirlist=`ls ${prefix}*.text`;
qty=${#dirlist[@]};  # sizeof array is always 1
for filelist in $dirlist
do
    substring="${filelist:$len:-5}";
    echo "${substring}/${qty}";
done

xxx001.text から xxx013.text までのファイルがあります
が、取得できるのは 001/1 002/1 003/1 だけです

4

5 に答える 5

37

これ:

dirlist=`ls ${prefix}*.text`

配列を作成しません。スペースで区切られたファイル名を持つ文字列のみを作成します。

あなたがしなければなりません

dirlist=(`ls ${prefix}*.text`)

配列にします。

次に$dirlist、最初の要素のみを参照するため、使用する必要があります

${dirlist[*]}

ループ内でそれらすべてを参照します。

于 2013-03-05T13:15:27.200 に答える
3

配列を次のように囲まない限り、配列を作成することはありません( )

dirlist=(`ls ${prefix}*.text`)
于 2013-03-05T13:08:21.353 に答える
3

ファイルの配列を宣言します。

arr=(~/myDir/*)

カウンターを使用して配列を反復処理します。

for ((i=0; i < ${#arr[@]}; i++)); do

  # [do something to each element of array]

  echo "${arr[$i]}"
done
于 2016-05-02T06:04:30.090 に答える
2
dir=/tmp
file_count=`ls -B "$dir" | wc -l`
echo File count: $file_count
于 2013-03-05T13:08:45.223 に答える