파일 이름을 일치시키는 방법은 무엇입니까 abc_NNN.xyz
? 디렉토리 내용입니다
[root@ tmp]# ls -ltr
total 0
-rw-r--r--. 1 root root 0 Jan 3 00:42 abc_123.xyz
-rw-r--r--. 1 root root 0 Jan 3 00:42 abc_234.xyz
-rw-r--r--. 1 root root 0 Jan 3 00:42 abc_345.xyz
-rw-r--r--. 1 root root 0 Jan 3 00:43 abc_def_123.xyz
-rw-r--r--. 1 root root 0 Jan 3 00:44 abc_def_234.xyz
-rw-r--r--. 1 root root 0 Jan 3 00:44 abc_def_345.xyz
-rw-r--r--. 1 root root 0 Jan 3 01:57 abc_123_123.xyz
-rw-r--r--. 1 root root 0 Jan 3 01:57 abc_234_234.xyz
-rw-r--r--. 1 root root 0 Jan 3 01:57 abc_345_345.xyz
이것은 나에게 효과적입니다
[root@ tmp]# ls -ltr abc_[0-9][0-9][0-9].xyz
-rw-r--r--. 1 root root 0 Jan 3 00:42 abc_123.xyz
-rw-r--r--. 1 root root 0 Jan 3 00:42 abc_234.xyz
-rw-r--r--. 1 root root 0 Jan 3 00:42 abc_345.xyz
문제는 실제 시나리오에서는 일치해야 하므로 abc_NNNNNNNNN.xyz
표현이 너무 크다는 것입니다. 나는 비슷한 것을 찾고 있습니다 abc_[0-9]{3}.xyz
. abc_[0-9]+3.xyz
(분명히 이것은 작동하지 않습니다)
답변1
나열한 원래의 더 간단한 예의 경우 abc_[0-9]*.xyz
작동합니다. 분명히 이것은 숫자 이외의 것과 일치하지만 def
나열된 파일은 제외됩니다. 이 경우 첫 번째 밑줄은 숫자 다음의 첫 번째 문자가 아니기 때문입니다.
더 복잡한 예의 경우 find
실제로 정규식을 사용할 수 있도록 배포해야 할 때입니다.
$ ls
abc_123_123.xyz abc_123.xyz abc_234_234.xyz abc_234.xyz abc_345_345.xyz abc_345.xyz abc_def_123.xyz abc_def_234.xyz abc_def_345.xyz
$ find . -regex '\./abc_[0-9]+\.xyz'
./abc_345.xyz
./abc_234.xyz
./abc_123.xyz
이는 GNU의 경우이며 find
다른 변형은 약간 다를 수 있습니다.
답변2
다음을 사용하면 bash
확장된 와일드카드 기능을 활용할 수도 있습니다 .
shopt -s extglob
ls abc_+([0-9]).xyz
예제 출력:
abc_123456.xyz
abc_123.xyz
abc_1.xyz
abc_3456.xyz
abc_345.xyz
abc_56789.xyz
abc_567.xyz
이 +([0-9])
표현식은 모든 숫자의 하나 이상의 인스턴스와 일치합니다. 이는 모든 길이의 "NNNN" 패턴과 일치합니다.
답변3
에서 언급했듯이POSIX glob — 하나 이상의 [:digit:]를 일치시키는 방법쉘 글로빙은 정규식과 동일하지 않습니다. 당신은 출력을 처리하는 데 가장 능숙할 수 있으며 ls
, grep
이 경우 abc_[0-9]{3}.xyz
원래 언급한 패턴이 작동할 것입니다.
다음 두 가지를 결합할 수 있습니다.
[root@ tmp]# ls -ltr abc_[0-9]+.xyz | grep abc_[0-9]{3}.xyz