Bash: 'find' 出力を 'readarray' にパイプします。

Bash: 'find' 出力を 'readarray' にパイプします。

ファイル検索を使用findし、そのファイルをBash配列に入れて他の操作(またはlsそのファイルなど)を実行しようとしています。ただし、パイプ入力を介して出力が読み取られないgrep理由は理解できません。readarrayfind

現在のディレクトリに2つのファイルがあり、出力は次のとおりfile1.txtですfile2.txtfind

$ find . -name "file*"
./file1.txt
./file2.txt

だから私はこれを2つの要素が文字列"./file1.txt""./file2.txt"(明らかに引用符なしで)配列にパイプしたいと思います。

私はこれといくつかの他のことを試しました:

$ declare -a FILES
$ find . -name "file*" | readarray FILES
$ echo "${FILES[@]}"; echo "${#FILES[@]}"

0

出力からわかるように、echo私の配列は空です。

それで、私は何が間違っていましたか?出力を標準入力としてreadarray読み込み、findその文字列を配列に入れるのはどうですか?

ベストアンサー1

パイプを使用すると、bashはサブシェルでコマンドを実行します。したがって、配列は埋められますが、子シェルにあるため、親シェルからアクセスできません。-t行区切り文字がファイル名の一部ではないため、配列メンバーに保存されないようにこのオプションを使用することもできます。

プロセス代替の使用:

readarray -t FILES < <(find .)

パスに改行文字が含まれるファイルでは機能しません。これが発生しないことを保証できない場合は、改行区切りレコードの代わりにNUL区切りレコードを使用する必要があります。

readarray -td '' < <(find . -print0)

(この-dオプションはbash 4.4に追加されました)


¹このオプションを使用すると、最後のパイプラインコンポーネントは除外されますが、lastpipeこれにのみ適用されますbash

おすすめ記事