据我所知,find . -maxdepth 1 -type f
是获取文件夹中文件列表的唯一可靠方法。但是,如果某些文件的名称中包含空格,那么天真地将此命令的输出放入bash数组(($(find . -maxdepth 1 -type f)
)将会失败。
执行此操作的正确方法是什么?
发布于 2012-10-02 17:44:52
最安全的方法是在-print0
中使用find
,它也会正确地处理包含换行符的文件名。循环遍历文件并将其存储在数组中:
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-02 17:53:34
这是我上一次需要留出空格时的做法:
IFS=$'\n' #Setting the Internal field separator to \n instead of \t\n
array=($(find . -maxdepth 1 -type f))
发布于 2012-10-02 17:48:42
你可以在一个循环中做到这一点:
ARR=()
find . -maxdepth 1 -type f | while read filename; do
ARR+=("$filename")
done
UPDATE:不幸的是, while 版本不能工作,因为while在一个子进程中运行,无法导出结果。
显然,这必须在for循环中完成,无法避免操作IFS。
正确的答案是dogbane的。以上不正确的方法被保留下来作为警告:-(
https://stackoverflow.com/questions/12687911
复制相似问题