加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 对于使用find的循环缺乏不能正确处理具有空格字符的目录

发布时间:2020-12-15 17:02:14 所属栏目:安全 来源:网络整理
导读:好吧,我真的被困在这一个. 我有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 $dirdone 这是命令抛出的内容: ls:无法访问/ var
好吧,我真的被困在这一个.

我有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时,{}会被每个文件名替换.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读