아래와 같이 3개의 파일이 있습니다.
CV_REF_DATA_09012021.txt
DB_ONLINE_CL_09012021.txt
DFR_CL_INS_09012021.txt
/NAS/CFG/에 파일이 있는지 확인한 다음 이를 배열에 추가하고 싶습니다. 항상 3개의 파일이 모두 존재할 필요는 없습니다. 따라서 1개, 2개 또는 3개 파일 모두일 수 있습니다. 파일이 없으면 스크립트가 종료되고 동일한 내용이 표시되어야 합니다. 다음으로 배열을 기반으로 반복하고 "호출" 스크립트를 실행하고 싶습니다.
호출 스크립트도 파일 모드를 사용하여 파일 수를 확인합니다. 다음 코드는 호출 스크립트에서 가져온 것입니다.
NASFilecnt=`find . -type f -name "${CV_REF_DATA}*.txt" | wc -l`
그렇다면 위의 내용을 기반으로 루프를 어떻게 실행합니까? 질문이 있으시면 알려주시기 바랍니다.
답변1
당신이 원하는 일에 대한 설명은 파일의 존재에 따라 약간 모호합니다. 각 파일 이름 접두사의 이름을 개별적으로 수집할지 아니면 함께 수집할지 명확하지 않습니다. 예를 들어 특정 날짜를 선택하고 해당 날짜에서 파일 세트를 찾는 것이 좋습니다. 아래 코드는 프로그래밍 작업에 대한 일부 지원을 제공해야 합니다.
이 답변은 다음에 대한 내 답변과 유사합니다.이전 질문정적 문자열 세트를 반복하여 이러한 문자열을 포함하는 파일 이름이 존재하는지 테스트합니다.
파일 이름 접두사를 반복하고 각 반복마다 .txt
해당 접두사(및 파일 이름 접미사)가 있는 파일이 있는지 확인할 수 있습니다.
for prefix in CV_REF_DATA_ DB_ONLINE_CL_ DFR_CL_INS_; do
set -- /NAS/CFG/"$prefix"*.txt
if [ -e "$1" ]; then
printf 'There exists names matching "%s"*.txt:\n' "$prefix"
printf '\t%s\n' "$@"
else
printf 'No names matches "%s"*.txt\n' "$prefix"
fi
done
루프는 파일 이름 접두사를 반복하고 각 반복에서 해당 접두사에 대해 관심 있는 파일과 일치해야 하는 패턴을 확장하려고 시도합니다. 이 set
명령은 일치하는 파일 이름을 위치 인수 목록에 저장합니다( "$@"
; "$1"
는 목록의 첫 번째 요소입니다).
bash
쉘 에서는 위의 코드 블록을 다음과 같이 작성할 수 있습니다.
shopt -s nullglob
for prefix in CV_REF_DATA_ DB_ONLINE_CL_ DFR_CL_INS_; do
names=( /NAS/CFG/"$prefix"*.txt )
if [ "${#names[@]}" -gt 0 ]; then
printf 'There exists names matching "%s"*.txt:\n' "$prefix"
printf '\t%s\n' "${names[@]}"
else
printf 'No names matches "%s"*.txt\n' "$prefix"
fi
done
셸 nullglob
옵션을 사용하면 일치하지 않는 와일드카드 패턴이 확장되지 않은 채로 남아 있는 대신 사라지게 됩니다. names
각 반복에서 일치하는 파일 이름을 유지하기 위해 명명된 배열을 사용합니다 .
질문에 대한 문자 그대로의 설명: 디렉토리에 트리 파일 이름이 하나 이상 있으면 다른 스크립트가 호출됩니다 CV_REF_DATA_09012021.txt
.
DB_ONLINE_CL_09012021.txt
배열에 기존 이름을 추가합니다.DFR_CL_INS_09012021.txt
/NAS/CFG
shopt -s nullglob
unset -v names
for name in CV_REF_DATA_09012021.txt DB_ONLINE_CL_09012021.txt DFR_CL_INS_09012021.txt
do
[ -e /NAS/CFG/"$name" ] && names+=( "$name" )
done
if [ "${#names[@]}" -eq 0 ]; then
echo 'no files could be found' >&2
exit 1
fi
# At least one name is in the "names" array.
# Call your other script below here.