2014-05-21 75 views
0

我想在阵列把结果命令find *.txt,然后遍历数组了这样申报阵列find命令的结果

for file in array 
do 

done 

我需要把数组,因为以后我需要访问到阵列。所以解决方案

for file in `find *.txt` 
do 

done 

对我不好。

+2

你为什么使用'find'? 'find * .txt'和'* .txt'之间没有区别,除非你有名称以'.txt'结尾的子目录。你的意思是'发现。 -name'* .txt''? – Barmar

回答

1

使用数组赋值语法:

array=($(find *.txt)) 

如果可以有空格的文件名,你应该把

IFS=$"\n" 

上面的命令。如果文件名中可能有换行符,它会变得非常复杂,我不知道处理它的好方法。

然后你可以迭代它具有:

for file in "${array[@]}" 
+1

让我们希望文件名中没有空格......希望和祈祷!你胆大妄为! –

1

如果使用bash 4,和你似乎没有被使用的find任何其他功能除了它的能力通过子目录递归,我建议使用globstar选项。

shopt -s globstar 
array=(**/*.txt) 

这避免了产卵在一个外部进程运行find,以及避免任何讨厌的惊喜,如果任何匹配的文件的名称中包含空格。

+0

他甚至没有递归通过子目录。 – Barmar

+0

然后可以使用更简单的'array =(* .txt)'(它不需要'bash' 4)。这个替换假定他意味着使用'find。 -name'* .txt''。 – chepner

+0

+为简单起见,并且可以安全抵御恶意文件名。 – John1024

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'修饰符构建的,所以一切都很好地转义或引用,以便在这里安全使用!

+1

对于'printf'%q \ n“'的很好的使用+1 – John1024

0

其他答案都有美德。作为一种补充,在这里是一种方法,其中(a)是即使在最困难的文件名安全,(二)允许充分利用find的力量,以及(c)避免eval

array=() 
while read -r -d $'\0'; do 
    array+=("$REPLY") 
done < <(find . -name '*.txt' -print0)