主要观点:不应解析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) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。