Bash 파일 이름 확장: 특정 문자 피하기

Bash 파일 이름 확장: 특정 문자 피하기

Bash Foo1.png에서는 Foo9.png.Foo[0-9].pngFoo5.png사용을 피할 수 있습니다 Foo[1-46-9].png. 소수점 이하 자릿수에 대해 일련의 제외를 지정하는 방법이 있습니까?

Foo3.png예를 들어 and 를 제외하고 싶다면 을 Foo7.png사용할 수 있지만 훨씬 읽기 쉬운 Foo[0-24-689]패턴을 찾을 수 있습니다 . Foo[^37].png이것이 Vim 구문이고 Bash는 3and 를 제외하고 이를 해석하지 않습니다 7. 하지만 Bash의 파일 이름 확장에 문자 제외 패턴이 있는지 궁금합니다.

이에 맞는 솔루션이 있다면모두3또는 이외의 단일 문자는 7일부 상황(예: 위의 지나치게 단순화된 설명에도 불구하고 이 질문의 동기가 된 특정 문자)에서도 도움이 될 수 있습니다.

답변1

bash은 정규식과 유사한 Foo[^37].png패턴과 표준 쉘 패턴을 모두 이해하므로 제외해야 하는 등 의 Foo[!37].png이름을 가진 다른 파일이 없으면 문제 없이 사용할 수 있습니다 .Food.pngFool.png

Foo[^37].png스크립트에서 이 예상대로 작동하지 않으면 이는 를 사용하지 않고 다른 쉘(예: (GNU가 아닌 시스템에서?))을 사용하고 있음을 나타냅니다. 명령 bash줄 에서 dash를 사용하여 스크립트를 실행했습니까 ? sh그렇다면 그렇게 하지 말고 #!올바른 쉘 인터프리터를 가리키는 스크립트에서 적절한 -line을 사용하십시오.

Food.png제외하려는 이름이 있다고 가정하고 Foo뒤에 숫자가 오는지 확인한 .png다음 을 사용하세요 Foo[0-9].png. 그런 다음 이들을 제외하려면 Foo3.png별도로 Foo7.png테스트하십시오.

for name in Foo[0-9].png; do
    case $name in (*[37].png) continue; esac

    # process "$name" here
done

또는 bash구문을 사용하여

for name in Foo[0-9].png; do
    [[ $name == *[37].png ]] && continue

    # process "$name" here
done

Stéphane Chazelas가 아래 설명에서 언급했듯이 및 bash이외의 숫자를 테스트하기 위해 확장된 globbing 패턴을 사용할 수 있습니다 . 를 사용하여 확장된 globbing 패턴을 활성화한 다음 패턴을 사용하십시오.37shopt -s extglob

Foo!(!([0-9])|[37]).png

Foo[01245689].png그러나 이 표현식이 올바른 일을 하고 있다고 믿기 전에 개인적으로 이 답변의 전반부(또는 해당 문제에 사용)와 같이 스크립트를 작성하고 실행하고 완료하는 것이 더 빠릅니다. 하다).

관련 정보