ファイル検索を使用find
し、そのファイルをBash配列に入れて他の操作(またはls
そのファイルなど)を実行しようとしています。ただし、パイプ入力を介して出力が読み取られないgrep
理由は理解できません。readarray
find
現在のディレクトリに2つのファイルがあり、出力は次のとおりfile1.txt
ですfile2.txt
。find
$ 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
。