我有 3 个文件,如下所示:
CV_REF_DATA_09012021.txt
DB_ONLINE_CL_09012021.txt
DFR_CL_INS_09012021.txt
我想检查 /NAS/CFG/ 中是否存在文件,然后将其添加到数组中。并不要求所有 3 个文件始终都存在。因此,它可以是 1 个、2 个或全部 3 个文件。如果没有文件,脚本应该退出并说同样的话。接下来我想基于数组循环并运行“调用”脚本。
调用脚本还使用文件模式来检查文件计数。以下代码来自调用脚本。
NASFilecnt=`find . -type f -name "${CV_REF_DATA}*.txt" | wc -l`
那么,如何根据上述内容运行循环呢?如有任何疑问,请告诉我。
答案1
根据文件的存在,您对想要发生的情况的描述有点模糊。还不清楚您是否希望单独收集每个文件名前缀的名称或一起收集。例如,最好选择一个特定日期,并尝试从中查找文件集。下面的代码应该为您的编程工作提供一些支持。
这个答案将类似于我对你之前的问题我们将循环一组静态字符串来测试包含这些字符串的文件名是否存在。
您可以循环遍历文件名前缀,并在每次迭代中检查是否存在具有该前缀(以及.txt
文件名后缀)的任何文件。
for prefix in CV_REF_DATA_ DB_ONLINE_CL_ DFR_CL_INS_; do
set -- /NAS/CFG/"$prefix"*.txt
if [ -e "$1" ]; then
printf 'There exists names matching "%s"*.txt:\n' "$prefix"
printf '\t%s\n' "$@"
else
printf 'No names matches "%s"*.txt\n' "$prefix"
fi
done
该循环迭代文件名前缀,并且在每次迭代中,我们尝试扩展应该与我们对该前缀感兴趣的文件相匹配的模式。该set
命令会将匹配的文件名存储在位置参数列表中("$@"
;"$1"
是该列表的第一个元素)。
在bash
shell中,我们可以将上面的代码块编写如下。
shopt -s nullglob
for prefix in CV_REF_DATA_ DB_ONLINE_CL_ DFR_CL_INS_; do
names=( /NAS/CFG/"$prefix"*.txt )
if [ "${#names[@]}" -gt 0 ]; then
printf 'There exists names matching "%s"*.txt:\n' "$prefix"
printf '\t%s\n' "${names[@]}"
else
printf 'No names matches "%s"*.txt\n' "$prefix"
fi
done
shellnullglob
选项使不匹配的通配模式消失而不是保持不展开。我们使用命名数组names
来保存每次迭代中任何匹配的文件名。
对于您的问题的字面解释:如果目录 中至少存在一个树文件名CV_REF_DATA_09012021.txt
,
DB_ONLINE_CL_09012021.txt
, 则调用其他脚本。将现有名称添加到数组中。DFR_CL_INS_09012021.txt
/NAS/CFG
shopt -s nullglob
unset -v names
for name in CV_REF_DATA_09012021.txt DB_ONLINE_CL_09012021.txt DFR_CL_INS_09012021.txt
do
[ -e /NAS/CFG/"$name" ] && names+=( "$name" )
done
if [ "${#names[@]}" -eq 0 ]; then
echo 'no files could be found' >&2
exit 1
fi
# At least one name is in the "names" array.
# Call your other script below here.