我在 shell 脚本中有主文件数组和辅助文件数组。这两个数组都将包含文件号。
#!/bin/bash
pri=(958 955 675 703 936 933 930 927 908 905 902 899 709)
snd=(953 947 943 939 916 915 1023 889 1010 1054 977 970 966)
# directories where we need to compare
primary=/primaries
secondary=/secondaries
echo "primary files: ${pri[@]}"
echo "secondary files: ${snd[@]}"
# now compare files in primary array `pri[@]` with `/primaries` directory. All files in primary array should be present in `/primaries` directory.
# and compare secondary array `snd[@]` with `/secondaries` directory. All files in secondary array should be present in `/secondaries` directory.
# If any of the file is missing, log a message.
现在,主阵列中的所有文件都pri[@]
应该存在于/primaries
目录中,辅助阵列中的所有文件都snd[@]
应该存在于/secondaries
目录中。两个目录中的文件名都是这样的proc_1041_test.data
。这里1041是文件号。
如何将主阵列文件号与主目录中的文件进行比较,以及如何将辅助目录中的文件进行类似比较?
笔记: /primaries
并且/secondaries
目录中可以有子目录,因此我只需要在这两个父目录中查找文件,而不是在任何子目录中查找文件。
答案1
对于数组之一:
for num in "${pri[@]}"; do
name="proc_${num}_test.data"
if [ ! -f "$primary/$name" ]; then
printf '"%s" not found in "%s"\n' "$name" "$primary" >&2
fi
done
也就是说,循环数组中的数字,构造预期的文件名并测试目录中是否存在预期的文件名。如果没有,请将诊断消息写入标准错误流。
一次性完成两组文件:
set -- "$primary" "$secondary"
typeset -n array
for array in pri snd; do
for num in "${array[@]}"; do
name="proc_${num}_test.data"
if [ ! -f "$1/$name" ]; then
printf '"%s" not found in "%s"\n' "$name" "$1" >&2
fi
done
shift
done
这引入了一个名称引用变量array
。当访问 时${array[@]}
,名称已被分配的变量array
(在循环中,先是pri
然后是snd
)将被访问。
目录名称$primary
和$secondary
被分配给位置参数$1
和$2
在循环之前使用set
,并且在循环中当我们shift
$2
完成$1
原始的$1
.
1 是一个常规的文件(或可访问的常规文件的符号链接),更改为以[ ! -e "$primary/$name" ] && [ ! -L "$primary/$name" ]
检查文件是否存在,无论其类型如何。