使用循环,例如
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 脚本不是处理包含空格的文件名的最佳方法:您可以这样做,但它会变得笨拙。
| 归档时间: |
|
| 查看次数: |
14479 次 |
| 最近记录: |