ksh의 정규 표현식은 tgz, tar.tgz를 확장하는 데 사용됩니다.

ksh의 정규 표현식은 tgz, tar.tgz를 확장하는 데 사용됩니다.

다음 확장명만 가진 파일을 식별하기 위해 정규식(ksh)을 얻으려고 합니다: tgz, tar.gz및 . 여러 가지를 시도했지만 제대로 작동하지 못했습니다. 나는 이 정규식을 사용하여 이러한 확장자를 가진 파일만 선택하여 일부 처리를 수행합니다.TGZTAR.GZ

if [ -f $myregexp ]; then
   ..... 
fi

답변1

[ -f "$myregexp" ]또는 [[ -f $myregexp ]]라는 변수가 있는지 테스트합니다 $myregexp. (작은 괄호에는 큰따옴표가 필요합니다.)

glob 패턴과 일치하는 파일이 존재하는지 테스트하려는 경우 직접적인 방법은 없습니다. 두 단계로 수행해야 합니다. 먼저 일치 항목 목록을 생성한 다음 목록이 비어 있는지 테스트합니다.

a=( ~(Ni)*.@(tgz|tar.gz) )
if [[ ${#a} -ne 0 ]]; then …

이는 다양한 ksh 관련 기능을 사용합니다.

  • ~(N)일치하는 항목이 없으면 빈 접두사 목록이 생성됩니다.
  • ~(i)대소문자를 구분하지 않는 일치를 위한 접두사입니다.
  • @(foo|bar)일치시킬 glob 구문 foo또는bar

이것은 bash와 동일합니다. Bash에서는 구문 및 기타 ksh glob 확장 extglob에 사용되는 옵션에서 일치하지 않는 전역 변수와 대소문자를 구분하지 않는 null 확장을 얻을 수 있습니다 .@(foo|bar)

shopt -s nocaseglob nullglob extglob
a=( *.@(tgz|tar.gz) )
if [[ ${#a} -ne 0 ]]; then …

이것은 zsh와 동일합니다. 이 옵션은 대소문자를 구분하지 않는 일치 접두사 extended_glob에 필요합니다 . (#i)glob (N)한정자는 glob의 빈 확장자가 일치하지 않음을 나타냅니다.

setopt extended_glob
a=( (#i)*.(tgz|tar.gz)(N) )
if [[ ${#a} -ne 0 ]]; then …

답변2

귀하의 예는 어떤 소스와 비교하고 있는지에 대한 단서를 제공하지 않습니다. 현재 디렉터리의 파일을 나열하려면 다음과 같이 일부 glob을 함께 문자열로 묶을 수 있습니다.

for file in *.tgz *.tar.gz *.TGZ *.TAR.GZ; do
    echo $file
done

패턴에 대해 문자열의 파일 이름을 테스트하려면 다음을 시도하십시오.

if [[ ( $file =~ .*\.(tgz|TGZ|tar\.gz|TAR\.GZ) ) ]]; then
    echo $file
fi

또는 다음과 같이 Case 문을 사용할 수 있습니다.

case $file in
    *.tgz|*.tar.gz|*.TGZ|*.TAR.GZ)
        echo $file
        ;;
esac

답변3

glob 표현식만 사용하여 대소문자를 구분하지 않는 일치를 수행할 수도 있습니다.

for f in *.[Tt][Gg][Zz] *.[Tt][Aa][Rr].[Gg][Zz]; do
   echo $f
done

관련 정보