【问题标题】:bash - looping through directory [duplicate]bash - 遍历目录[重复]
【发布时间】:2016-08-23 12:13:41
【问题描述】:

我在使用 bash 循环浏览目录中的文件时遇到问题。我对 bash 很陌生,似乎无法弄清楚我遇到的问题。

当我循环浏览我明确提到的目录中的文件时,似乎没有问题。但是,当使用变量来描述要循环的目录时,事情似乎并不顺利。

工作循环,查找~/Desktop/ 中的所有文件:

for file in ~/Desktop/*; do
    echo "$file"
done

但是,以下似乎不起作用,只显示~/Desktop/*

DEST="~/Desktop/*"    

for file in "$DEST"; do
    echo "$file"
done

希望我在这里缺少一些小东西。我的主要目标是我希望能够遍历可以保存在某种配置文件中的任意位置。

提前致谢!

【问题讨论】:

  • 引号防止通配符。

标签: bash loops quotes glob tilde-expansion


【解决方案1】:

根据the reference manual,波浪号扩展在引号中不起作用。 最简单的替代方法是改用 $HOME。

假设问题中的代码与波浪号扩展分开工作(如果 ~/Desktop 中的文件都有非常简单的名称,这是可能的),那么您可以修改您的代码以在没有波浪号的情况下工作:

DEST="$HOME/Desktop/*"    

for file in "$DEST"; do
    echo "$file"
done

但是,如果这样做,您很可能会遇到文件名扩展(通配符)问题。您最好将引号放在任何地方,因为它们不是必需的。另外,延迟文件名扩展,直到真正需要它:

DEST=~/Desktop

for file in $DEST/*; do
    echo $file
done

【讨论】:

  • 我建议将"$DEST" 替换为$DEST
  • 我也是,但我对 OP 代码所做的更改尽可能少。
  • 是的,这似乎可行。谢谢你。我会接受上述答案,即使需要 Cyrus 的建议才能使其正常工作。快速提问,什么时候应该/不应该使用引号?
  • 理想情况下,您应该将 glob 排除在变量之外。 "$DEST"/*.
  • @PaulHicks,...我强烈不同意“一般来说,它们永远不需要”。带有空格的目录名称发生在现实世界中。也许他们不应该这样做,但我们生活在一个桌面用户的世界里,他们受过训练,可以用有意义的多词人名来命名“文件夹”。
猜你喜欢
  • 1970-01-01
  • 2011-08-05
  • 2011-05-11
  • 2019-01-10
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多