Bash 에서는 Foo1.png
.Foo9.png
Foo[0-9].png
Foo5.png
Foo[1-46-9].png
Foo3.png
예를 들어 및 를 제외하려는 경우 을 Foo7.png
사용할 수 있지만 읽기 쉬운 패턴을 Foo[0-24-689]
찾을 수 있습니다 . Foo[^37].png
이것은 Vim 구문이므로 Bash는 이를 해석하지 않습니다( 3
및 제외) 7
. 하지만 Bash의 파일 이름 확장에 문자 제외 패턴이 있는지 알고 싶습니다.
적합한 솔루션이 있는 경우모두경우 에 따라 또는 이외의 3
단일 문자 7
도 도움이 될 수 있습니다(위의 설명은 지나치게 단순화되었지만 이 문제를 일으키는 특정 문자 등).
답변1
쉘은 bash
정규식과 유사한 Foo[^37].png
패턴과 표준 쉘 패턴을 이해하므로 제외해야 하는 유사하거나 유사한 이름을 가진 Foo[!37].png
다른 파일이 없는 한 문제 없이 사용할 수 있습니다 .Food.png
Fool.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
테스트 할 수 있습니다 . 다음 을 사용하여 확장된 와일드카드 모드를 활성화합니다.3
7
shopt -s extglob
Foo!(!([0-9])|[37]).png
하지만 개인적으로 Foo[01245689].png
저는 이 표현이 옳은 일을 하고 있다고 믿습니다.