bash: 폴더 이름 패턴을 기반으로 폴더에서 작동

bash: 폴더 이름 패턴을 기반으로 폴더에서 작동

나는 이름이 다음 구문에 있는 많은 폴더가 포함된 디렉토리에 있는 특정 폴더를 선택하는 작업을 하고 있습니다. prot_cne_ligNNN(여기서 NNN은 1부터 1000까지의 숫자)

선택한 번호(NNN에 제공됨)의 폴더를 선택한 다음 다른 폴더에 복사하는 bash 스크립트가 필요합니다.

# define the list on numbers, which directories will be coppied
# meaning that I need to take a directory prot_cne_lig331, prot_cne_lig767, prot_cne_lig998
list=['331','767','998']
for system in ${somewhere}/*
system_name=$(basename "$system")
   if system_name == '*one_of_the_element_from_the_list*'
   cp $system $desired_output_folder
   fi
done

따라서 여기에서는 폴더 이름에 목록에 언급된 숫자 중 하나가 포함되어 있는지 확인하는 데 적합한 IF 문을 정확하게 정의해야 합니다.

답변1

디렉토리의 모든 이름을 반복하고 목록에 대해 각각을 테스트하는 것보다 목록을 반복하는 것이 더 쉬운 것 같습니다.

list=( 331 767 998 )

for number in "${list[@]}"; do
    cp -r "$somewhere/prot_cne_lig$number" "$destdir"
done

에서 배열을 정의하는 구문을 참고하세요 bash.

혹은 별도의 배열변수 없이,

for number in 331 767 998; do
    cp -r "$somewhere/prot_cne_lig$number" "$destdir"
done

또는 다음을 사용할 수 있습니다.

shopt -s extglob
cp -r "$somewhere"/prot_cne_lig@(331|767|998) "$destdir"

괄호 안의 패턴과 일치하는 @(331|767|998)확장된 와일드카드 패턴은 어디에 있습니까(so).shopt -s extglob

관련 정보