쉘 와일드 카드에서 OR 패턴 사용


52

내 디렉토리의 내용은

$ 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 개의 다른 partterns와 일치하는 다른 파일을 나열하는 방법이나 간단히 regex를 사용 하여 파일 이름 부분 을 사용할 lsOR있습니다.

원래 시나리오에서는 디렉토리에 많은 파일이 있으며 묻기 시간이 단축되었습니다.

답변:


65

원하는 것을하기 위해 확장 글 로빙을 활성화 할 필요조차 없습니다. 이것은 bash에서 작동합니다.

ls {day*,night*}

7
그렇지 않습니다 : touch day.txt; touch night.txt; ls {*day,night*}결과 :ls: *day: No such file or directory
Matteo

1
원본 포스터의 텍스트를 수정했습니다. 나는 그것이 분명하다고 생각했다. 한숨 . 텍스트가 업데이트되었습니다. 분명히 메커니즘이 작동 하는 것을 볼 수 있습니까?
itsbruce 2016 년

7
또는 *{day,night}*OP가 원하는 것에 더 가깝습니다.
derobert

25

ls파일 이름을 필터링하는 옵션은 없지만 대부분의 셸에는 globbing extension이 있습니다.man bash /Pattern Matching

ksh

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

zsh

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에서 파일이 day없거나 night파일이 없으면 마지막 두 명령이 실패합니다. 이를 피하려면 nonomatch또는 csh_null_glob옵션을 설정 하거나 (N)각 패턴 뒤에 추가 하십시오.


1
무엇에 대해 *{day,night}*. 편집했지만 어떤 쉘이이를 지원하는지 모르겠습니다.
Random832

@ Random832가 작동 bash, kshzsh(없음 필요가 globbing을 확장),하지만 sh- 그러나, 나우의 마지막 "모든 셸"예에서 작업을 수행합니다 sh.
Izkata

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.