在bash中,如何将所有常规文件的名称放在数组中的文件夹中?

时间:2012-10-02 09:38:35

标签: bash unix

据我所知,find . -maxdepth 1 -type f是获取文件夹中文件列表的唯一可靠方法。但是,如果某些文件的名称中包含空格,则天真地将此命令的输出放在bash数组(($(find . -maxdepth 1 -type f))中会失败。

这样做的正确方法是什么?

3 个答案:

答案 0 :(得分:4)

最安全的方法是将find-print0一起使用,这也会正确处理带有换行符的文件名。循环遍历文件并将它们存储在一个数组中:

declare -a arr=()
while IFS= read -r -d $'\0' f
do
    arr+=("$f")
done < <(find . -maxdepth 1 -type f -print0)

测试:

for i in "${arr[@]}"
do
    echo "[$i]"
done

答案 1 :(得分:2)

这是我上次需要允许空格时的方式:

IFS=$'\n' #Setting the Internal field separator to \n instead of \t\n
array=($(find . -maxdepth 1 -type f))

答案 2 :(得分:1)

您可以在一个周期中执行此操作:

ARR=()
find . -maxdepth 1 -type f | while read filename; do
    ARR+=("$filename")
done

更新:遗憾的是, while 版本不起作用,因为在子流程中运行时无法导出结果。

所以显然这必须在 for 循环中完成,无法避免操纵IFS。

正确的答案是dogbane的。上述错误方法保留为警告: - (