2016-04-22 3 views
0

ディレクトリ内のファイル名をループして、それぞれに対して操作を実行しようとしています。ディレクトリの長さでbash doループを実行する

私が使用している場合、私はちょうど10のファイル名をループすることができる午前:

var=($(ls directory)) 
for k in {1..10} 
do 
    echo ${var[$k]} 
done 

私に私のディレクトリに最初の10個のファイル名を与えます。しかし、私はそれらをすべてループしたい。

私が行う場合:私は一緒にすべてを組み合わせると

length=($(ls directory -1 | wc -l)) 

が、私はそう

(この例では、それは62です)長さを取得:

var=($(ls directory)) 
length=($(ls directory -1 | wc -l)) 
for k in {1..$length} 
do 
    echo ${var[$k]} 
done 

を私はエラーを取得します'構文エラー:オペランドが必要です(エラートークン "{1..62}")

これを解決するには、 olutionは非常に高く評価されるでしょう!

+0

[ブレース展開] (https://www.gnu.org/software/bash/manual/bash.html#Brace-Expansion)強力で限定的です。変数が展開される前にそれが起こっていることに注意してください。 '{1 .. $ length} 'を使用しようとすると失敗します。 –

答えて

1

変数展開前にシェルでブレース拡張を行っているため、エラーが発生しています。

あなたは使用することができます。

for k in $(seq 1 "$length") 

は、問題を回避します。

files=(*) 
for i in "${files[@]}"; do echo "$i"; done 

またはさらに簡単:また


何をやっているのが容易にすることによって行うことができ

printf '%s\n' "${files[@]}" 
+0

パーフェクト!ご協力ありがとうございました!その 'lsのdirectory'一部であるとM.Simpson @ –

+0

なしproblem..pleaseあなたの答えや他の回答(I型として)どちらも扱うことhttp://stackoverflow.com/help/someone-answers – heemayl

1

なぜ単に:

for file in *; do 
    if [ -f "$file" ]; then 
    echo "Do what you want with" "$file"; 
    fi 
done 
+0

一つの問題を読みません。ある点まで、 'directory/* 'を使って動作します。それは使用可能な形式で名前を与えます( 'shopt -s nullglob'が有益かもしれません)。しかし、 'ls'コマンドは単に' file/'が' directory/file'を生成する 'file'を与えます。これは、ループ内で扱うことができます(例えば 'basename'やマイナーな警告' $ {file ## * /} ')。 –

+0

ファイルを取得するためのテストを追加しました。 – SLePort

+0

@JonathanLeffler:または: '(CDディレクトリ; *内のファイルのため、...ん。行っては)' – rici

関連する問題