正如这里提到的:
\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