シェルスクリプトで2つの配列とそのディレクトリを比較しますか?

シェルスクリプトで2つの配列とそのディレクトリを比較しますか?

シェルスクリプトにプライマリファイルアレイとセカンダリファイルアレイがあります。どちらの配列もファイル番号を含みます。

#!/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[@]に存在し、セカンダリアレイのすべてのファイルがディレクトリに存在する必要があります。両方のディレクトリのファイル名は次のとおりです。ここで、1041はファイル番号です。/primariessnd[@]/secondariesproc_1041_test.data

プライマリ配列ファイル番号をプライマリディレクトリのファイルとどのように比較し、セカンダリディレクトリのファイルも同様に比較しますか?

メモ: /primariesまた、/secondariesディレクトリにはサブディレクトリがある可能性があるため、サブディレクトリではなくこれら2つの親ディレクトリでのみファイルを見つけることができます。

答え1

アレイの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

つまり、配列の数を繰り返して予想されるファイル名を構成し、予想されるファイル名がディレクトリにあるかどうかをテストします。それ以外の場合は、標準エラーストリームに診断メッセージを書き込みます。

一度に2つのファイルセットを完了します。

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(ループ内の最初、prisnd)にアクセスされます。

ディレクトリ名は位置引数に割り当てられ、$primaryループの前に使用され、ソースが完了したときにループ内で使用されます。$secondary$1$2setshift $2$1$1


1は定期的なファイル(またはアクセス可能な一般ファイルへのシンボリックリンク)を使用して、タイプ[ ! -e "$primary/$name" ] && [ ! -L "$primary/$name" ]に関係なくファイルが存在することを確認するには、に変更します。

関連情報