在 shell 脚本中比较两个数组及其各自的目录?

在 shell 脚本中比较两个数组及其各自的目录?

我在 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" ]检查文件是否存在,无论其类型如何。

相关内容