主要观点:不应解析ls(1)
的输出,因其在处理包含特殊字符(如换行符等)的文件名时存在问题,输出不可靠且难以准确获取文件名信息。
关键信息:
ls(1)
默认输出文件名用换行符分隔,若文件名含换行符会导致错误,且很少有实现允许用NUL
字符终止文件名。- 枚举文件或处理文件时,不应使用
for f in $(ls)
等方式,而应使用for f in *
结合shopt -s nullglob
等。 - 对于特定排序需求,若
ls
不行可使用perl
,或把修改时间放入文件名以实现glob
顺序与mtime
顺序一致。 - 解析
ls -l
输出获取文件元数据时要注意多个问题,如每次只处理一个文件、不解析时间戳等。 - GNU coreutils
ls
在 2014 年拒绝添加-0
选项,但 2021 年添加了--zero
选项,还支持--quoting-style
选项,其中--quoting-style=shell-always
输出可被 Bourne 类 shell 解析。
重要细节:
- 给出了各种错误示例,如在循环中使用
ls
、find
等获取文件列表的错误方式。 - 详细说明了解析
ls -l
输出获取元数据时的注意事项及不同系统上ls
显示时间戳格式的差异。 - 展示了使用
eval
结合ls --quoting-style=shell-always
解决某些问题的示例。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。