ファイルのリストを取得して、結果を配列に読み込み、各配列要素がファイル名に対応するようにします。これは可能ですか?
ls
は使用しないでください。これは 意図しない です。グロビングを使用します。
shopt -s nullglob
array=(*)
array2=(file*)
array3=(dir/*)
nullglob
オプションを使用すると、一致するものがない場合、配列は空になります。
次のコマンドは、現在のディレクトリに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
実際には、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/
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
これを試して、
path="" # could set to any absolute path
declare -a array=( "${path}"/* )
後でリストから不要なものを取り出すと思います。