【问题标题】:Expand part of the path in bash script展开 bash 脚本中的部分路径
【发布时间】:2016-12-10 04:00:57
【问题描述】:

我试图在我的 bash 脚本中列出位于某个目录的特定子目录中的所有文件。这是我尝试过的。

root_dir="/home/shaf/data/"
sub_dirs_prefixes=('ab' 'bp' 'cd' 'cn' 'll' 'mr' 'mb' 'nb' 'nh' 'nw' 'oh' 'st' 'wh')

ls "$root_dir"{$(IFS=,; echo "${sub_dirs_prefixes[*]}")}"rrc/"

请注意,我不想扩展存储在 $root_dir 中的值,因为它可能包含空格,但我确实想扩展 {} 中包含的子路径,它是 $sub_dirs_prefixes 的内容的逗号分隔字符串。我将子目录前缀存储在数组变量 $sub_dirs_prefixes 中,因为稍后我必须将它们用于其他用途。

我收到以下错误:

ls: cannot access /home/shaf/data/{ab,bp,cd,cn,ll,mr,mb,nb,nh,nw,oh,st,wh}rrc/

如果我复制错误消息中的路径并从命令行运行ls,它会显示列出的子目录的内容。

【问题讨论】:

  • 大括号扩展发生在变量扩展之前,因此不可能一次性完成。您可以 eval 处理所有安全/可靠性问题,但最好使用循环或数组替换。

标签: bash


【解决方案1】:

您可以使用命令替换来生成扩展模式。

shopt -s extglob
ls "$root_dir"/$(IFS="|"; echo "@(${sub_dirs_prefixes[*]})rrc")

当时间参数可以命令替换已经完成时,shell 会在执行路径名扩展之前看到这一点:

ls "/home/shaf/data/"/@(ab|bp|cd|cn|ll|mr|mb|nb|nh|nw|oh|st|wh)rrc

@(...) 模式匹配包含的前缀之一。

如果目录名称的组成部分包含需要引用的字符,这会变得有点棘手,因为我们没有引用命令替换。

【讨论】:

  • 感谢您的回答。您能否解释一下extglob 的工作原理,以便我接受您的回答?此外,您可能希望在 @ 之前删除 /。你说@ 匹配其中一个包含的前缀,即使它在我尝试并返回正确结果时匹配每个前缀。
猜你喜欢
  • 2011-02-05
  • 2022-10-13
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-28
相关资源
最近更新 更多