Bash Foo1.png
에서는 Foo9.png
.Foo[0-9].png
Foo5.png
사용을 피할 수 있습니다 Foo[1-46-9].png
. 소수점 이하 자릿수에 대해 일련의 제외를 지정하는 방법이 있습니까?
Foo3.png
예를 들어 and 를 제외하고 싶다면 을 Foo7.png
사용할 수 있지만 훨씬 읽기 쉬운 Foo[0-24-689]
패턴을 찾을 수 있습니다 . Foo[^37].png
이것이 Vim 구문이고 Bash는 3
and 를 제외하고 이를 해석하지 않습니다 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
이외의 숫자를 테스트하기 위해 확장된 globbing 패턴을 사용할 수 있습니다 . 를 사용하여 확장된 globbing 패턴을 활성화한 다음 패턴을 사용하십시오.3
7
shopt -s extglob
Foo!(!([0-9])|[37]).png
Foo[01245689].png
그러나 이 표현식이 올바른 일을 하고 있다고 믿기 전에 개인적으로 이 답변의 전반부(또는 해당 문제에 사용)와 같이 스크립트를 작성하고 실행하고 완료하는 것이 더 빠릅니다. 하다).