0

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

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

4

3 回答 3

4

最安全的方法是使用findwith -print0which 也将正确处理带有换行符的文件名。循环文件并将它们存储在一个数组中:

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
于 2012-10-02T09:44:52.143 回答
2

这就是我上次需要允许空格时的做法:

IFS=$'\n' #Setting the Internal field separator to \n instead of \t\n
array=($(find . -maxdepth 1 -type f))
于 2012-10-02T09:53:33.780 回答
1

您可以在一个循环中执行此操作:

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

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

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

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

于 2012-10-02T09:48:41.813 回答