使用 ls 时文件名中的换行符是否仍然有问题

使用 ls 时文件名中的换行符是否仍然有问题

正如这里提到的:

\n当将输出通过管道传输到另一个命令时,文件名中的换行符是一个问题ls,因为换行符会将一个文件名分成两行。

手册页指出ls

-b, --escape                print C-style escapes for nongraphic characters
-q, --hide-control-chars    print ? instead of nongraphic characters
-1                          list one file per line.  Avoid '\n' with -q or -b

所以我的解释是,使用-b-q选项可以解决这个问题。还是还存在这种方法未涵盖的情况?

答案1

下一个命令将如何处理这些转义符?如何在目录树中更深层地查找文件?在非 Linux 的 POSIX 上运行是否可行?GNU 版本的 ls 默认会进行一些过滤,但并非在每个系统上都是如此。

戴维·惠勒的文章修复 Unix/Linux/POSIX 文件名:控制字符(如换行符)、前导破折号和其他问题解决了一些问题。许多软件都假设各种控制字符(如 \n 或 \t)可以用作分隔符,因此包含这些字符的文件可能会出现问题。但是,有一些方法可以处理几乎包含任何字符的文件名:

值得注意的是,如果您想要处理完全任意的文件名,请尽可能使用“find . ... -exec”;这是 100% 可移植的,并且可以处理任意奇怪的文件名。较新的 POSIX 添加到 find 中的 -exec ... {} + 也可以提供帮助。因此,在可以的情况下,请执行以下操作:

 # This is correct and portable; painful if "command" gets long:
 find . ... -exec command {} ;
 # This is correct and standard; some systems don't implement this:
 find . ... -exec command {} +

如果您可以阻止文件包含 \n,则可以使用将 shell 输入字段分隔符设置为换行符和制表符的技巧。然后在 shell 脚本中使用文件名变量。

  IFS="`printf '\n\t'`"
  for file in `find . -type f` ; do
    some_command "$file" ...
  done

相关内容