我想将命令find *.txt
的结果放在数组中,然后像这样迭代数组
for file in array
do
done
我需要放入数组,因为稍后我需要访问数组。所以解决方案
for file in `find *.txt`
do
done
对我没有好处。
答案 0 :(得分:1)
使用数组赋值语法:
array=($(find *.txt))
如果文件名中可以有空格,则应填写
IFS=$"\n"
在上面的命令之前。如果文件名中可能有换行符,则会变得非常复杂,我不确定处理它的好方法。
然后你可以用:
迭代它for file in "${array[@]}"
答案 1 :(得分:1)
如果您使用bash
4,并且因为您似乎没有使用find
的任何其他功能,除了它能够通过子目录进行递归,我建议使用{{1而不是选项。
globstar
这可以避免产生运行shopt -s globstar
array=( **/*.txt )
的外部进程,并且如果任何匹配的文件名称中有空格,则可以避免任何令人讨厌的意外。
答案 2 :(得分:1)
如果您确定文件名中没有任何换行符,mapfile
是个不错的选择:
mapfile -t array < <(find . -name '*.txt')
现在,如果你想要一些更具防弹性的东西,你可以使用:
mapfile -t array < <(find . -name '*.txt' -exec bash -c 'printf "%q\n" "${@:0}"' {} +)
eval array=( ${array[@]} )
在看到最后一行时,您应该感觉非常糟糕:eval
和不加引号${array[@]}
。由于数组array
是使用printf
的'%q'修饰符构建的,所以它有效并且它是防弹的,因此所有内容都可以很好地转义或引用,以便在这里安全使用!
答案 3 :(得分:0)
其他答案都有美德。作为对它们的补充,这里有一种方法,(a)即使是最困难的文件名也是安全的,(b)允许充分利用find
的力量,(c)避免{{1} }:
eval