내 스크립트는 다음과 같습니다.
- 특정 경로에서 사용 가능한 모든 isos 검색
- isos 이름을 파일의 목록과 비교
- 일치하는 항목만 반환
간단히 말해서 코드는 다음과 같습니다.
isos_found=() # here we save the isos
isos_search=<find isos>
mapfile -t supported_isos < supported_systems # see below
for iso in "${isos_search[@]}" ; do
[[ "${supported_isos[@]}" =~ "$(basename "$iso")" ]] && isos_found+=("$iso")
done
supported_systems
다음을 포함하는 파일은 어디에 있습니까?
clonezilla-live-2.6.1-25-amd64.iso
debian-live-10.0.0-amd64-xfce+nonfree.iso
linuxmint-19.1-cinnamon-64bit.iso
linuxmint-19.1-xfce-32bit.iso
lubuntu-18.04-alternate-amd64.iso
supported_systems
이제 파일 내용을 다음과 같이 만들고 싶습니다 .
clonezilla*
debian*
linuxmint*
lubuntu*
그래서 각 버전/릴리스를 인코딩하지 않고 릴리스 이름만 일치시켜야 합니다.
위의 ( )와 유사한 코드를 사용하여 이것이 가능합니까 "${supported_isos[@]}" =~ "$(basename "$iso")"
? 그렇지 않은 경우 제안을 받을 수 있습니다.
답변1
supported_systems
파일에 다음이 포함되어 있다고 가정접두사 문자열(패턴이 아님) 좋아요
clonezilla
debian
linuxmint
lubuntu
그런 다음 먼저 모든 ISO 파일을 찾은 다음 특정 패턴과 일치하는지 수동으로 확인하는 대신 이러한 문자열을 읽고 파일 전역 일치에 사용할 수 있습니다.
shopt -s dotglob nullglob globstar
isos=()
while IFS= read -r prefix; do
isos+=( ./**/"$prefix"-*.iso )
done <supported_systems
printf '%s\n' "${isos[@]}"
먼저 모든 ISO 파일을 찾은 다음 이를 반복하여 접두사와 일치하는 파일을 찾으려면 다음을 사용할 수 있습니다.
shopt -s dotglob nullglob globstar
isos=( ./**/*.iso )
while IFS= read -r prefix; do
for iso in "${isos[@]}"; do
if [[ $iso =~ /"$prefix"-[^/]*$ ]]; then
matched_isos+=( "$iso" )
fi
done
done <supported_systems
printf '%s\n' "${matched_isos[@]}"
여기서 정규식은 /"$prefix"-[^/]*$
주어진 $prefix
(뒤에 )로 -
시작하는 모든 기본 이름 과 일치합니다.