74

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

4

6 に答える 6

122

ls使用しないでください。この目的を目的としたものではありません。グロブを使用します。

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

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

于 2012-06-11T13:53:40.937 に答える
32

以下は、現在のディレクトリに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
于 2012-06-11T13:53:23.367 に答える
3

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
于 2018-08-04T07:53:35.080 に答える
2

実際に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/を参照してください。

于 2012-06-12T03:45:00.703 に答える
1

これを試して、

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

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

于 2016-07-15T19:03:42.550 に答える
0

グロブを介して返すことができないより具体的なファイルリストが必要な場合は、null文字で区切られfindたループを使用してコマンドのプロセス置換を使用できます。while

例:

files=()
while IFS= read -r -d $'\0' f; do
    files+=("$f")
done < <(find . -type f -name '*.dat' -size +1G -print0)
于 2021-10-23T22:18:37.693 に答える