쉘 와일드카드와 함께 OR 패턴 사용

쉘 와일드카드와 함께 OR 패턴 사용

내 디렉토리의 내용은 다음과 같습니다

$ ls -lrt
total 0
-rw-r--r-- 1 user1 admin 19 Oct  8 12:31 night.txt
-rw-r--r-- 1 user1 admin 19 Oct  8 12:31 noon.txt
-rw-r--r-- 1 user1 admin 38 Oct  8 12:31 day.txt

파일 이름에 지정된 단어가 포함된 파일의 세부 정보를 나열하고 싶습니다.

예:

$ ls -lrt *day|night*
ls: *day: No such file or directory
bash: night.txt: command not found

예상 출력

-rw-r--r-- 1 user1 admin 19 Oct  8 12:31 night.txt
-rw-r--r-- 1 user1 admin 38 Oct  8 12:31 day.txt

2개의 서로 다른 패턴과 일치하는 서로 다른 파일을 나열하려면 어떻게 해야 합니까? 간단히 말해서 정규식과 함께 정규식을 사용하여 파일 이름 부분을 ls얻을 수 있는 방법 은 무엇입니까?OR

디렉터리에 많은 파일이 있는 원래 시나리오에서는 쿼리가 단축되었습니다.

답변1

원하는 작업을 수행하기 위해 확장된 와일드카드를 활성화할 필요조차 없습니다. 이것은 bash에서 작동합니다:

ls {day*,night*}

답변2

파일 이름을 필터링하는 옵션은 없지만 ls대부분의 셸에는 와일드카드 확장자가 있습니다.man bash /Pattern Matching

케시

ls -lrtd -- *@(day|night)*

다루기 힘든

setopt extendedglob
ls -lrtd -- *(day|night)*

또는:

setopt kshglob
ls -lrtd -- *@(day|night)*

세게 때리다

shopt -s extglob
ls -lrtd -- *@(day|night)*

이 세 가지 셸 중 하나에서 이 작업을 수행할 수 있지만, 이러한 경우 중 하나가 어떤 파일과도 일치하지 않으면 패턴은 확장되지 않은 상태로 유지됩니다(예: ; 파일 이름 *day* night1.txt othernight.txt이 없으면 day참조하거나 지정하세요 man bash /EXPANSION) /Brace Expansion.

ls -lrtd -- *{day,night}*

모든 셸에서 다음을 수행할 수 있습니다.

ls -lrtd -- *day* *night*

zsh에서는 dayor 파일이 없으면 night마지막 두 명령이 실패합니다 . nonomatchor csh_null_glob옵션을 설정하면 이를 방지하기 위해 각 모드 뒤에 or (N)가 추가됩니다.

답변3

쉘은 매개변수 확장을 위해 정규식을 사용하지 않습니다.

다음을 통해 확장된 패턴 일치를 활성화할 수 있습니다.

$ shopt -s extglob

그런 다음

$ ls @(day|night).txt
day.txt   night.txt

예를 들어Bash 참조 매뉴얼(패턴 일치)

답변4

다음 파이프라인을 ls사용할 수 있습니다.grep

aashutosh@ubuntu:/tmp$ ls -ltrh
total 0
-rw-rw-r-- 1 aashutsh user 0 May  9 02:55 noon.txt
-rw-rw-r-- 1 aashutsh user 0 May  9 02:55 night.txt
-rw-rw-r-- 1 aashutsh user 0 May  9 02:55 day.txt

aashutosh@ubuntu:/tmp$ ls -ltr | grep 'night\|day'
-rw-rw-r-- 1 aashutsh user 0 May  9 02:55 night.txt
-rw-rw-r-- 1 aashutsh user 0 May  9 02:55 day.txt

관련 정보