使用find命令的结果声明数组

时间:2014-05-21 20:20:44

标签: bash shell

我想将命令find *.txt的结果放在数组中,然后像这样迭代数组

for file in array
do

done

我需要放入数组,因为稍后我需要访问数组。所以解决方案

for file in `find *.txt`
do

done

对我没有好处。

4 个答案:

答案 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