解析 Ls - Greg 的维基

主要观点:不应解析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 解析。

重要细节

  • 给出了各种错误示例,如在循环中使用lsfind等获取文件列表的错误方式。
  • 详细说明了解析ls -l输出获取元数据时的注意事项及不同系统上ls显示时间戳格式的差异。
  • 展示了使用eval结合ls --quoting-style=shell-always解决某些问题的示例。
阅读 11
0 条评论