web-dev-qa-db-ja.com

ファイル名を配列に読み込む

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

59
dublintech

lsは使用しないでください。これは 意図しない です。グロビングを使用します。

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

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

97

次のコマンドは、現在のディレクトリにls出力を含む配列arrを作成します。

arr=( $(ls) )

lsの出力を使用することはまったく安全ではありませんが。

lsよりもはるかに安全で、echo *を使用できます:

arr=( * )

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

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

実際には、lsを使用する方法ではありません。これを試して:

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

配列からファイル名を取得するには:

echo ${FILELIST[x]}

Xから始まる配列からn個のファイル名を取得するには:

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

Bash配列の優れたチュートリアルについては、以下を参照してください。 http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

3
xizdaqrian

Bashでは、パス名拡張(グロビング)でファイル名の配列を作成できます:

#!/bin/bash
SOURCE_DIR=path/to/source
files=(
   "$SOURCE_DIR"/*.tar.gz
   "$SOURCE_DIR"/*.tgz
   "$SOURCE_DIR"/**/*
)

上記はfilesと呼ばれる配列を作成し、それにN個の配列要素を追加します。配列の各要素は、SOURCE_DIRまたは.tar.gzで終わる.tgzの項目に対応します、またはそのサブディレクトリ内の任意のアイテム。サブディレクトリの再帰はDennis point out として可能です。

その後、printfを使用して、パスを含む配列の内容を表示できます。

printf '%s\n' "${files[@]}" # i.e. path/to/source/filename.tar.gz

または、parameter substitutionを使用してパス名を除外します。

printf '%s\n' "${files[@]##*/}" # i.e. filename.tgz
1
Josh Habdas

これを試して、

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

後でリストから不要なものを取り出すと思います。

0
KSU_Physics