据我所知,find . -maxdepth 1 -type f
这是获取文件夹中文件列表的唯一可靠方法。但是,如果某些文件的名称中有空格,那么天真地将这个命令的输出放入 bash 数组 ( ($(find . -maxdepth 1 -type f)
) 将会失败。
这样做的正确方法是什么?
最安全的方法是使用find
with -print0
which 也将正确处理带有换行符的文件名。循环文件并将它们存储在一个数组中:
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
这就是我上次需要允许空格时的做法:
IFS=$'\n' #Setting the Internal field separator to \n instead of \t\n
array=($(find . -maxdepth 1 -type f))
您可以在一个循环中执行此操作:
ARR=()
find . -maxdepth 1 -type f | while read filename; do
ARR+=("$filename")
done
更新:不幸的是,while版本不起作用,因为 while 在子进程中运行,无法导出结果。
所以显然这必须在for循环中完成,无法避免操纵 IFS。
正确答案是dogbane的。上述不正确的方法保留为警告:-(