如何将find的输出分配给数组

时间:2014-08-12 08:00:44

标签: linux bash shell

在linux shell脚本中我试图将find的输出设置为数组,如下所示

#!/bin/bash
arr=($(find . -type -f))

但是它会给出错误,因为-type应该只包含一个字符。任何人都可以告诉我问题在哪里。

由于

2 个答案:

答案 0 :(得分:1)

如果您使用bash 4,readarray命令可以与进程替换一起使用。

readarray -t arr < <(find . -type f)

正确支持所有文件名,包括那些包含换行符的文件名,需要更多工作,以及支持find的{​​{1}}版本:

-print0

答案 1 :(得分:0)

我建议使用以下脚本:

#!/bin/bash
listoffiles=$(find . -type f)
nfiles=$(echo "${listoffiles}" | wc -l)
unset myarray
for i in $(seq 1 ${nfiles}) ; do
    myarray[$((i-1))]=$(echo "${listoffiles}" | sed -n $i'{p;q}')
done

因为你不能通过myarr=( one two three )语法依赖Bash自动数组实例化,因为它在括号内看到的所有空格(包括空格)都是一样的。所以你必须手动处理生成的多行变量listoffiles种类,我在上面的脚本中做了什么。

没有echo选项的

-n会在变量的最后打印一个尾随的换行符,但在我们的情况下这很好,因为find没有(&{t}}您可以使用echo -n "${listoffiles}")进行检查。

我使用 sed 来提取相关的第i行,其中$i被shell解释,然后被赋予 sed 作为第一行自己剧本的特征。