답변:
어때요?
ls *[!0-9][0-9].txt
!
그룹의 시작은 그 의미를 보완합니다.
의견에서 언급했듯이 이것은 bash 가하는 일입니다. 예를 들어보십시오.
printf "%s\n" *[!0-9][0-9].txt
ls
)는 여기서 정규 표현식을 지원하지 않습니다. 이것들은 파일 이름 표현식입니다 (Globbing) . 예제에서 이미 차이점을 볼 수 있습니다. 여기, *
와일드 카드는 정규식에는 없지만 와일드 카드를 사용 .*
하는 데 사용 됩니다. 정규식은 globbing보다 훨씬 강력합니다.
질문은 정규식을 요구했습니다. Bash ls
는 여기서 정규 표현식을 지원하지 않습니다. 지원하는 것은 파일 이름 표현식 ( Globbing ), 와일드 카드 형식입니다. 정규식은 그보다 훨씬 강력합니다.
정규식을 실제로 사용하려면 다음 find -regex
과 같이 사용할 수 있습니다 .
find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt'
찾기는 기본적으로 재귀 적이지만 ls
그렇지 않습니다. 현재 디렉토리에서 파일 만 찾으려면을 사용하여 재귀를 비활성화 할 수 있습니다 -maxdepth 1
. 경로가있는 파일 이름과 일치하는 항목을 찾으십시오. 그래서 ./
find in을 실행하면 파일 이름이 시작 됩니다 .
. 정규식은 그에 \./
대처하기 시작 합니다. 정규 표현식에서 .
모든 문자와 일치하는 특수 문자이지만 여기서는 점을 원하므로 백 슬래시로 이스케이프 처리해야합니다. 우리는 점에서 똑같이합니다. .txt
왜냐하면 정규 표현식도 그렇지 않기 때문 Atxt
입니다. 숫자 클래스는 globbing과 동일하지만 문자 클래스를 반전시키는 ^
대신에 필요 합니다 !
.
의 출력을 얻으려면 ls
다음 -exec ls
과 같이 사용할 수 있습니다 .
find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt' -exec ls -lah {} \;
find
몇 가지 다른 정규식 맛을 지원합니다. -regextype
예를 들어을 지정할 수 있습니다 .
find . -maxdepth 1 -regextype egrep -regex '\./.*[^0-9][0-9]\.txt'
나에게 가능한 유형은 'findutils-default', 'awk', 'egrep', 'ed', 'emacs', 'gnu-awk', 'grep', 'posix-awk', 'posix-basic'입니다. , 'posix-egrep', 'posix-extended', 'posix-minimal-basic', 'sed' find -regextype help
시스템에서 지원되는 항목을 찾기 위해 실행할 수 있습니다 .
이미 사용중인 ksh 확장 글로브 (또는 bash -O extglob
또는 zsh -o kshglob
)를 사용하면 다음과 같습니다.
ls -d -- ?(*[![:digit:]])[[:digit:]].txt
또는
ls -d -- !(*[[:digit:]])[[:digit:]].txt
일치 a1.txt
하고2.txt
싶지만 a12.txt
nor 12.txt
.
그러나 ksh 및 bash에서 ( failglob
zsh와 비슷한 동작을 수행 하도록 옵션을 설정하지 않는 한 ) 해당 패턴이 파일과 일치하지 않으면 패턴이 문자 그대로로 전달 ls
되고 해당 파일이 (이상하게 명명 된) 경우 존재하는 ls
경우 패턴 자체와 일치하지 않더라도 나열 됩니다.
포함하려면 .2.txt
의 설정 dotglob
에서 옵션을 bash
추가, (D)
글로브의의 규정 zsh
또는 설정을 FIGNORE
에 !(.|..)
에를 ksh93
.
shopt -s extglob
.