"ls" 및 정규식을 사용하여 나열

"ls" 및 정규식을 사용하여 나열

파일 이름이 마지막 문자로 끝나고 .txt확장자가 있는 파일을 나열하는 방법은 무엇입니까?

나는 이것을 시도했지만 ls *+([[:digit:]]).txt이것은 abc12.txt둘 다 정확합니다 abc2.txt.

abc2.txt하지만 나는 단지 .

:digit:이를 수행할 수 있는 양식이 있나요 ?

답변1

어때요?

ls -d -- *[!0-9][0-9].txt

!그룹의 시작은 그 의미를 보완합니다.

주석에서 지적했듯이 이것이 bash가 수행하는 작업입니다. 예를 들어 다음과 같습니다.

printf "%s\n" *[!0-9][0-9].txt

답변2

질문은 정규 표현식을 요구합니다. Bash는 ls정규식을 지원하지 않으므로 정규식을 지원하지 않습니다. 지원하는 것은파일명 표현(와일드카드), 와일드카드의 한 형태입니다. 정규 표현식은 이보다 훨씬 더 강력합니다.

정말로 정규식을 사용하고 싶다면 find -regex다음과 같이 할 수 있습니다.

find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt'

기본적으로 조회는 재귀적이지만 ls그렇지 않습니다. 현재 디렉터리에 있는 파일만 찾으려면 -maxdepth 1.을 사용하여 경로의 파일 이름과 일치하는 항목을 찾을 수 있습니다. 따라서 ./find in을 실행하면 파일 이름이 .. \./애초에 이 문제를 해결하기 위해 정규 표현식이 만들어졌습니다 . 정규식에서 .특수 문자는 모든 문자와 일치하지만 여기서는 점이 필요하므로 백슬래시로 이스케이프 처리합니다. .txt정규 표현식도 일치하므로 점에 대해서도 동일한 작업을 수행합니다 Atxt. 숫자 범주는 문자 범주를 반전시키는 대신 문자 범주를 ^반대로 바꿔야 한다는 점을 제외하면 와일드카드와 동일합니다 .!

출력을 얻으려면 다음과 같이 사용할 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시스템이 지원하는 기능을 확인할 수 있습니다.

답변3

이미 사용하고 있는 ksh 확장 glob(또는 또는 )을 사용하면 bash -O extglob다음과 같습니다.zsh -o kshglob

ls -d -- ?(*[![:digit:]])[[:digit:]].txt

또는

ls -d -- !(*[[:digit:]])[[:digit:]].txt

어울리고 싶다면a1.txt 그리고2.txt그러나 a12.txt아니오, 아니오 12.txt.

그러나 ksh 및 bash에서( failglobzsh와 유사한 동작을 얻기 위한 옵션을 설정하지 않는 한) 패턴이 어떤 파일과도 일치하지 않으면 패턴은 문자 그대로 전달되고 ls(이상한 이름의) 파일이 존재하는 경우, ls패턴 자체와 일치하지 않더라도 나열됩니다.

를 포함하려면 에서 옵션을 .2.txt설정하거나 , 에서 glob 한정자를 추가 하거나, 로 설정 하세요 .dotglobbash(D)zshFIGNORE!(.|..)ksh93

관련 정보