gpt4 book ai didi

bash - 使用 find lacks 的循环无法正确处理具有空格字符的目录名称

转载 作者:行者123 更新时间:2023-11-29 09:02:25 26 4
gpt4 key购买 nike

好吧,我真的被困在这个问题上了。

我有 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
  1. 当您使用反引号运算符时,输出会在每个空白字符处拆分为标记。 read ,另一方面,将一次读取一行而不是一次读取一个单词。因此,看起来有点奇怪的解决方案是将文件通过管道传输到循环中,以便可以逐行读取它。

  2. 您需要报价"$dir"ls命令,以便整个文件名、空格和所有内容都被视为单个参数。如果你不这样做 ls将看到两个文件名,/var/tmp/oldfiles.txt .

我可能会获得 Useless Use of Cat Award 奖.您可以通过删除 cat 进一步简化此操作:

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

这是有效的,因为整个 while loop 就像一个大命令,所以就像你可以管道 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 中完成所有事情命令没有任何循环或任何东西!例如,上面的代码使用 findwhile可以用一个 find 来完成命令如下:

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

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

关于bash - 使用 find lacks 的循环无法正确处理具有空格字符的目录名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1053165/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com