据我所知,find . -maxdepth 1 -type f
是获取文件夹中文件列表的唯一可靠方法。但是,如果某些文件的名称中包含空格,则天真地将此命令的输出放在bash数组(($(find . -maxdepth 1 -type f)
)中会失败。
这样做的正确方法是什么?
答案 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的。上述错误方法保留为警告: - (