내 디렉토리의 내용은 다음과 같습니다
$ 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에서는 day
or 파일이 없으면 night
마지막 두 명령이 실패합니다 . nonomatch
or 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