2012-06-11 36 views
41

lsを実行してファイルのリストを取得し、各要素がファイル名に対応する配列に結果を読み込みたいとします。これは可能ですか?ファイル名を配列に読み込む

+0

はい、可能です。名前に任意の文字(名前にスペースや改行が含まれていると悲しみを引き起こす)が含まれている可能性はありますが、実行可能です。マニュアルのどの部分を理解しづらいですか? –

答えて

65

lsを使用しないでください、そうではありませんこの目的のために意図されています。グロビングを使用します。

shopt -s nullglob 
array=(*) 
array2=(file*) 
array3=(dir/*) 

nullglobオプションは、一致するものがない場合、配列を空にします。

+0

ありがとう、とにかく私はこれらの結果をパイプすることができますか?私はarr(* | grep ".txt")のようなものを試しましたが、それは好きではありません。 – dublintech

+7

@dublintech: 'grep'は必要ありません。あなたのglobに' array =(*。txt) 'や' array =(* foo *) 'の文字列を入れてください。 –

+0

Thanks Denisそれはうまくいった。 – dublintech

11

後は、現在のディレクトリにlsの出力を持つARR配列を作成します:lsより

arr=($(ls)) 

はるかに良い、より安全なあなたがecho *を使用することができます。

arr=(*) 

echo ${#arr[@]} # will echo number of elements in array 

echo "${arr[@]}" # will dump all elements of the array 
+2

'ls'は不要であり、この目的のために使用すべきではありません。 –

+0

合意しました。私はちょうどいくつかのコマンド出力から配列を作成する方法を伝えたいと思います。しかし、私は 'ls'の出力を避けるべきであるという私の答えを編集しました。 – anubhava

+2

配列の展開が引用符で囲まれていない場合、配列のすべての要素は配列の個々の要素ではなく、文字列として表されます。引用符で囲まれていない '$ {arr [*]}'と '$ {arr [@]} 'は同じです。 – jordanm

4

実際には、lsは行く方法ではありません。配列から名前を取得するには

declare -a FILELIST 
for f in *; do 
    #FILELIST[length_of_FILELIST + 1]=filename 
    FILELIST[${#FILELIST[@]}+1]=$(echo "$f"); 
done 

:これを試してみてください

のx & yが取得するための最初の要素です
echo ${FILELIST[x] 

- または -

echo ${FILELIST[@]:x:y} 

とどのように多くの要素の後にそれ。 bashのアレイ上の偉大なチュートリアルについては

、以下を参照してください http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

+1

あなたはファイルglobを繰り返し処理する必要があります*または*私の答えのようにファイルのglobを使用して配列を作成します - 両方*!要素を配列に追加するとき、複雑なインデックス式で配列の長さを使用する理由はありません(配列がまばらな場合は期待通りに機能しません)。 'array + =(要素)'。代入を直接行うだけで '$(echo" $ f ")を使う理由はありません。あなたの 'echo'ステートメントの1つに閉じた中括弧がありません。 –

0

PATH="" # could set to any absolute path 
declare -a ARRAY=(${PATH}/*) 

、これを試してみてください、私はあなたが後でリストから不要なものを引き出しますと仮定しています。

関連する問題