通过两个(或更多)文件夹来查找匹配模式的文件

时间:2014-12-29 09:47:25

标签: bash if-statement while-loop do-while

我有一个与bash相关的问题。开始解释。我的文件夹结构如下所示:

config--
       |-config-chain.conf
       |-somefile1.txt
       |-somefile2.txt
       |-somefile3.txt
       |-somefile4.txt
       |-somefile5.txt
       |-somefile6.txt 

config-chain.conf包含如下文字:

somefile1
somefile2
somefile3
somefile4
somefile5
somefile6

在今天之前,所有这些txt文件都在一个文件夹中,因此迭代这很简单。

但规范已经改变,我必须采用新的方式。

config--
       |-config-chain.conf
       |
       |--folder1--
                  |-somefile1.txt
                  |-somefile2.txt
                  |-somefile3.txt
       |--folder2--
                  |-somefile4.txt
                  |-somefile5.txt
                  |-somefile6.txt

在此之前,我通过一个简单的循环迭代这个。它看起来像这样:

while read config-chain
do
    if [ -f $config-chain.txt ];
    then
        echo "Config file found"
    else
        echo "Config file not found"
    fi
done < config-chain.conf

但现在这些文件位于两个不同的文件夹中。我的实际方法看起来像这样:

while read config-chain
do
    if [ -f folder1/$config-chain.txt ] || [ -f folder2/$config-chain.txt ];
    then
        echo "Config file found"
    else
        echo "Config file not found"
    fi
done < config-chain.conf

对我来说这看起来很难看,因为我正在寻找两个文件夹中存在的文件。我不知道将来会怎么样,也许会有15个文件夹,所以想象这个OR有15个语句......有没有办法做到这个更干净?也许用find?或者使用IF更简洁的方法来执行此操作?

3 个答案:

答案 0 :(得分:2)

globbing和

下的globstar

有我的演示:

mkdir config{,/folder{1,2}}
touch config/{{,folder{1,2}}/somefile1,folder{1,2}/somefile2,folder1/somefile{3,4},folder2/somefile{5,6}}

这会产生所需的情况:

ls -lR
.:
total 4
drwxr-xr-x 4 user user 4096 déc 29 11:13 config

./config:
total 8
drwxr-xr-x 2 user user 4096 déc 29 11:13 folder1
drwxr-xr-x 2 user user 4096 déc 29 11:13 folder2
-rw-r--r-- 1 user user    0 déc 29 11:13 somefile1

./config/folder1:
total 0
-rw-r--r-- 1 user user 0 déc 29 11:13 somefile1
-rw-r--r-- 1 user user 0 déc 29 11:13 somefile2
-rw-r--r-- 1 user user 0 déc 29 11:13 somefile3
-rw-r--r-- 1 user user 0 déc 29 11:13 somefile4


./config/folder2:
total 0
-rw-r--r-- 1 user user 0 déc 29 11:13 somefile1
-rw-r--r-- 1 user user 0 déc 29 11:13 somefile2
-rw-r--r-- 1 user user 0 déc 29 11:13 somefile5
-rw-r--r-- 1 user user 0 déc 29 11:13 somefile6

比现在:

while read config_chain ;do
    cfgfile=(config/**/$config_chain)
    echo ${cfgfile[*]}
  done < <(seq -f somefile%g 1 7)
config/folder1/somefile1 config/folder2/somefile1
config/folder1/somefile2 config/folder2/somefile2
config/folder1/somefile3
config/folder1/somefile4
config/folder2/somefile5
config/folder2/somefile6
config/**/somefile7

缺少一个文件!!

shopt -s globstar
while read config_chain ;do
    cfgfile=(config/**/$config_chain)
        echo ${cfgfile[*]}
  done < <(seq -f somefile%g 1 7)
config/folder1/somefile1 config/folder2/somefile1 config/somefile1
config/folder1/somefile2 config/folder2/somefile2
config/folder1/somefile3
config/folder1/somefile4
config/folder2/somefile5
config/folder2/somefile6
config/**/somefile7

那就是它!比现在:

while read config_chain ;do
    for cfgfile in config/**/$config_chain;do
        if [ -f $cfgfile ] ;then
            echo $cfgfile
          fi
      done
  done < <(seq -f somefile%g 1 7)
config/folder1/somefile1
config/folder2/somefile1
config/somefile1
config/folder1/somefile2
config/folder2/somefile2
config/folder1/somefile3
config/folder1/somefile4
config/folder2/somefile5
config/folder2/somefile6

答案 1 :(得分:1)

是的,你可以使用如下命令:

filePath=$(find parentDir -name "config-chain.txt")
if [ -z "$filePath" ]
then 
    echo "Config file not found"
else
    echo "Config file found"
fi

在你的while循环中你可以使用$ filePath而不是config-chain.conf来获取输入。

答案 2 :(得分:0)

dziki,请注意bash不会接受&#39; - &#39;作为变量名称的一部分,但它将接受一个&#39; _&#39;。因此

read config_chain

将比

更好地工作
read config-chain

使用下划线还可以替换

"config-chain.txt"

通过

"$config_chain.txt"

在almas shaikh和F. Hauri的答案中,在所有其他方面都可以正常工作。