bash配列のパターンに一致するすべてのファイル名を保存したいと思います。
私の解決策は動作しません。パイプの使用で問題が発生したようですが、どのように解決するのかわかりません。
i=0
find . -type f | grep -oP "some pattern" | while read -r line; do
arr[$i]=$line;
let i=i+1;
done
答え1
bash-4.4
上記のように使用すると、次のようになります。
readarray -d '' -t arr < <(
find . -type f -print0 | grep -zP 'some pattern')
以前のbash
バージョンの場合:
arr=()
while IFS= read -rd '' file; do
arr+=("$file")
done < <(find . -type f -print0 | grep -zP 'some pattern')
または(bash
zsharr+=()
スタイルの構文を持たない古いバージョンとの互換性のため):
arr=() i=0
while IFS= read -rd '' file; do
arr[i++]=$line
done < <(find . -type f | grep -zP 'some pattern')
あなたのアプローチにはいくつかの問題があります。
-o
を使用すると、レコード全体ではなくパターンgrep
に一致するレコード部分のみが印刷されます。あなたはここでそれをしたくありません。find
改行はファイルパスのすべての文字と同じくらい有効であるため、改行で区切られたデフォルトの出力は後処理できません。 NULで区切られた出力が必要です。したがって、NULで区切られたレコードを処理するには-print0
infind
と-z
inが必要です。grep
IFS=
に渡すのも忘れてしまいましたread
。- このオプションがないと
bash
、パイプラインの最後の部分がサブシェルで実行されるため、そのサブシェルのみをlastpipe
更新できます。$arr