我想保存与 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
没有 zsh 风格arr+=()
语法的旧版本):
arr=() i=0
while IFS= read -rd '' file; do
arr[i++]=$line
done < <(find . -type f | grep -zP 'some pattern')
您的方法有几个问题:
- 使用 时
-o
,grep
仅打印记录中与模式匹配的部分,而不是完整记录。你不想要它在这里。 find
的默认换行符分隔输出无法进行后期处理,因为换行符与文件路径中的任何字符一样有效。您需要 NUL 分隔的输出(因此-print0
infind
和-z
ingrep
来处理 NUL 分隔的记录。- 你还忘记传递
IFS=
给read
. - 在 中
bash
,如果没有该lastpipe
选项,管道的最后一部分在子 shell 中运行,因此,您只需更新$arr
该子 shell 的 。