在bash脚本中展开路径的一部分

时间:2016-12-09 19:35:35

标签: bash

我正在尝试列出位于我的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中的值,因为它可能包含空格,但我想扩展{}中包含的子路径,这是逗号分隔的内容字符串{{1 }}。我将子目录前缀存储在数组变量$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/ ,它会显示列出的子目录的内容。

1 个答案:

答案 0 :(得分:1)

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

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

通过参数can命令替换已经完成,shell在执行路径名扩展之前就会看到这个:

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

@(...)模式匹配其中一个前缀。

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