파일 이름이 마지막 문자로 끝나고 .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에서( failglob
zsh와 유사한 동작을 얻기 위한 옵션을 설정하지 않는 한) 패턴이 어떤 파일과도 일치하지 않으면 패턴은 문자 그대로 전달되고 ls
(이상한 이름의) 파일이 존재하는 경우, ls
패턴 자체와 일치하지 않더라도 나열됩니다.
를 포함하려면 에서 옵션을 .2.txt
설정하거나 , 에서 glob 한정자를 추가 하거나, 로 설정 하세요 .dotglob
bash
(D)
zsh
FIGNORE
!(.|..)
ksh93