当文件名中有空格时,如何解析 find 命令的输出?

Sco*_*son 12 linux find

使用循环,例如

for i in `find . -name \*.txt` 
Run Code Online (Sandbox Code Playgroud)

如果某些文件名中有空格,则会中断。

我可以使用什么技术来避免这个问题?

gee*_*aur 12

理想情况下,您根本不会这样做,因为在 shell 脚本中正确解析文件名总是很困难(修复空格,您仍然会遇到其他嵌入字符的问题,尤其是换行符)。这甚至被列为BashPitfalls 页面中的第一个条目

也就是说,有一种方法几乎可以做你想做的事:

oIFS=$IFS
IFS=$'\n'

find . -name '*.txt' | while read -r i; do
  # use "$i" with whatever you're doing
done

IFS=$oIFS
Run Code Online (Sandbox Code Playgroud)

记住$i在使用它时也要引用,以避免以后解释空格的其他事情。还记得$IFS在使用后退后一步,因为不这样做会导致以后出现令人困惑的错误。

这确实附加了另一个警告:while循环内部发生的事情可能发生在子shell中,具体取决于您使用的确切shell,因此变量设置可能不会持续存在。在for这一点,但在价格,即使你的应用循环版本避免$IFS的解决方案,以避免问题与空间,然后你会惹上麻烦,如果find返回的文件太多。

在某些时候,所有这些的正确解决方法是使用诸如 Perl 或 Python 之类的语言而不是 shell。


D.W*_*.W. 12

使用find -print0并将其通过管道传输到xargs -0,或者编写您自己的小 C 程序并将其通过管道传输到您的小 C 程序。这是-print0-0被发明。

Shell 脚本不是处理包含空格的文件名的最佳方法:您可以这样做,但它会变得笨拙。