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