web-dev-qa-db-ja.com

lsまたはfindコマンドからの出力をキャプチャして、すべてのファイル名を配列に保存するにはどうすればよいですか?

現在のディレクトリ内のファイルを1つずつ処理する必要があります。 lsまたはfindの出力を取得し、結果の値を配列の要素として保存する方法を探しています。このようにして、必要に応じて配列要素を操作できます。

33
fzkl

正確な質問に答えるには、次を使用します。

arr=( $(find /path/to/toplevel/dir -type f) )

$ find . -type f
./test1.txt
./test2.txt
./test3.txt
$ arr=( $(find . -type f) )
$ echo ${#arr[@]}
3
$ echo ${arr[@]}
./test1.txt ./test2.txt ./test3.txt
$ echo ${arr[0]}
./test1.txt

ただし、ファイルを1つずつ処理する場合は、find 's -execオプションは、スクリプトがやや単純な場合、またはfindが返すようなループを実行できます。

while IFS= read -r -d $'\0' file; do
  # stuff with "$file" here
done < <(find /path/to/toplevel/dir -type f -print0)
49
SiegeX
for i in `ls`; do echo $i; done;

それよりも簡単になることはできません!

編集:うーん-デニスウィリアムソンのコメントによると、それはあなたができるようだ!

編集2:OPはlsの出力を解析する方法を具体的に尋ねますが、以下のコメンテーターが言ったように、正しい答えは「あなたはしない」であると指摘したかっただけです。使用する for i in *または同様のもの。

9
simon

実際には、現在のディレクトリ内のファイルに対してls/findを使用する必要はありません。

Forループを使用するだけです:

for files in *; do 
    if [ -f "$files" ]; then
        # do something
    fi
done

また、隠しファイルも処理する場合は、相対オプションを設定できます。

shopt -s dotglob

この最後のコマンドはbashでのみ機能します。

4
marco