2015-06-30 39 views
2

我有存储在一个变量下面的值 - 模式展开存储在变量文件路径模式在bash

$WS/*.asd 

在我的环境$ WS计算结果为有效目录(/ home /管理员的/ dev /工作区/)。这个目录中有一些.asd文件。我想将pattern变量扩展为该目录中所有匹配的.asd文件。但是,我试过以下命令,但它们都不起作用:

expand "$pattern" 
expand: $WS/*.asd: No such file or directory 

ls $pattern 
ls: cannot access $WS/*.asd: No such file or directory 

eval $pattern 
/home/administrator/dev/workspaces/a.asd: Permission denied 

echo $pattern 
$WS/*.asd 

我得到了模式作为输入。任何想法如何将模式扩展到包含所有匹配文件的列表。

编辑:解释这个问题更详细

我可能会在任何序列ENV-VAR和通配符的任意组合。例如,输入可能是:​​。问题是我想评估所有env-vars并扩展通配符。

回答

3

除了eval你可以试试这个find

pattern='$WS/*.asd' 

find "$WS" -name "${pattern##*/}" 

编辑:根据您编辑的问题,看来你将不得不使用:

eval echo "$pattern" 
+0

对不起,我没有足够的解释的。这个解决方案假设我知道如何提取目录。我可能会得到任何env-vars和通配符的序列。例如'/home/$USER/*/$DIR/*.my_extension“。 – egelev

+2

嗯,在这种情况下'eval echo”$ pattern“' – anubhava

+1

谢谢。真的,这个工作正如我需要它的工作。请,编辑你的答案,把它放在里面,我会标记它。 – egelev

1

你可以将该模式下的所有元素存储在一个数组中:

#!/bin/bash 
arr=() 
shopt -s nullglob # expand the glob pattern to a null sting if no elements caught 
arr+=($WS/*.asd) 
shopt -u nullglob # undo the 'shopt -s nullglob' 

要打印的条目:

for entry in "${arr[@]}"; do 
    echo "$entry" 
done