접두사, 몇 개의 숫자 및 접미사 정규식을 사용하여 파일 이름을 일치시킵니다.

접두사, 몇 개의 숫자 및 접미사 정규식을 사용하여 파일 이름을 일치시킵니다.

파일 이름을 일치시키는 방법은 무엇입니까 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

관련 정보