쉘 스크립트에 기본 파일 배열과 보조 파일 배열이 있습니다. 두 배열 모두 파일 번호를 포함합니다.
#!/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은 파일 번호입니다./primaries
snd[@]
/secondaries
proc_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
$2
set
shift
$2
$1
$1
1은정기적인파일(또는 접근 가능한 일반 파일에 대한 심볼릭 링크)을 사용하여 [ ! -e "$primary/$name" ] && [ ! -L "$primary/$name" ]
유형에 관계없이 파일이 존재하는지 확인하려면 로 변경하세요.