我有一个与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
更简洁的方法来执行此操作?
答案 0 :(得分:2)
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的答案中,在所有其他方面都可以正常工作。