Bash   发布时间:2022-05-13  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了bash – 对于使用find的循环缺乏不能正确处理具有空格字符的目录名称大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_489_0@ 好吧,我真的被困在这一个.

我有dirs.txt,如下:

/var/tmp/old files.txt
/var/tmp/old BACkups.bak

dirs.txt文件由脚本本身生成.

当我想在for循环中使用dirs.txt时:

for dir in `cat dirs.txt` ; do 
    ls -al $dir
done

这是命令抛出的内容:
ls:无法访问/ var / tmp / old:没有这样的文件或目录

我希望整个文件名是ls -al’ed但它试图ls -al / var / tmp / old

我怎么能从for循环纠正这个?

cat dirs.txt | while read dir; do
    ls -al "$dir"
done

>使用反引号运算符时,输出将在每个空格字符处拆分为标记.另一方面,读取将一次读取一行而不是一次读取一个单词.因此,看起来有点奇怪的解决方案是将文件传输到循环中,以便可以逐行读取.
>您需要在ls命令中引用“$dir”,以便将整个文件名,空白和所有文件名视为单个参数.如果你不这样做,ls会看到两个文件名,/ var / tmp / old和files.txt.

我可能会获得USELEss Use of Cat AWARD.你可以通过移除猫来进一步简化这个:

while read dir; do
    ls -al "$dir"
done < dirs.txt

这是有效的,因为整个while循环就像一个大命令,所以就像你可以将cat管道进入它一样,你也可以使用文件重定向.

更进一步……

根据dirs.txt的生成方式,您可能只能完全摆脱它并在一个命令中执行所有操作.如果它只是一个临时文件,您可以通过将命令生成dirs.txt直接导入while循环,跳过临时文件来消除它.例如,替换

find /var -name '*old*' > dirs.txt
while read dir; do
    ls -al "$dir"
done < dirs.txt

find /var -name '*old*' | while read dir; do
    ls -al "$dir"
done

假装查找是您正在执行的任何命令来生成文件列表.

实际上,如果你实际上正在使用find,你可以在一个大的find命令中做任何事情而不需要任何循环或任何东西!例如,使用find和while的上述代码可以使用单个find命令完成,如下所示:

find /var -name '*old*' -exec ls -al {} \;

find是一个非常灵活的命令,可以搜索匹配各种复杂条件的文件,并使用-exec选项将这些文件作为命令行参数传递给其他命令.当您使用-exec时,{}会被每个文件名替换.

大佬总结

以上是大佬教程为你收集整理的bash – 对于使用find的循环缺乏不能正确处理具有空格字符的目录名称全部内容,希望文章能够帮你解决bash – 对于使用find的循环缺乏不能正确处理具有空格字符的目录名称所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:好吧