쉘 스크립트에서 두 배열과 해당 디렉토리를 비교하시겠습니까?

쉘 스크립트에서 두 배열과 해당 디렉토리를 비교하시겠습니까?

쉘 스크립트에 기본 파일 배열과 보조 파일 배열이 있습니다. 두 배열 모두 파일 번호를 포함합니다.

#!/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디렉터리에는 하위 디렉터리가 있을 수 있으므로 하위 디렉터리가 아닌 이 두 상위 디렉터리에서만 파일을 찾으면 됩니다.

답변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$2setshift $2$1$1


1은정기적인파일(또는 접근 가능한 일반 파일에 대한 심볼릭 링크)을 사용하여 [ ! -e "$primary/$name" ] && [ ! -L "$primary/$name" ]유형에 관계없이 파일이 존재하는지 확인하려면 로 변경하세요.

관련 정보