bash – 对于使用find的循环缺乏不能正确处理具有空格字符的目录
好吧,我真的被困在这一个.
我有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 -al’ed但它试图ls -al / var / tmp / old 我怎么能从for循环纠正这个? cat dirs.txt | while read dir; do ls -al "$dir" done >使用反引号运算符时,输出将在每个空格字符处拆分为标记.另一方面,读取将一次读取一行而不是一次读取一个单词.因此,看起来有点奇怪的解决方案是将文件传输到循环中,以便可以逐行读取. 我可能会获得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时,{}会被每个文件名替换. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |