ファイルのリストを取得し、その結果を配列に読み込みます。各配列要素はファイル名に対応しています。これは可能ですか?
6 に答える
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
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
次に、を使用printf
して、パスを含む配列の内容を確認できます。
printf '%s\n' "${files[@]}" # i.e. path/to/source/filename.tar.gz
または、パラメータ置換を使用してパス名を除外します。
printf '%s\n' "${files[@]##*/}" # i.e. filename.tgz
実際に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/を参照してください。
これを試して、
path="" # could set to any absolute path
declare -a array=( "${path}"/* )
後でリストから不要なものを引き出すと思います。
グロブを介して返すことができないより具体的なファイルリストが必要な場合は、null文字で区切られfind
たループを使用してコマンドのプロセス置換を使用できます。while
例:
files=()
while IFS= read -r -d $'\0' f; do
files+=("$f")
done < <(find . -type f -name '*.dat' -size +1G -print0)