세부 사항

세부 사항

다음과 같은 디렉터리 트리가 있다고 가정해 보겠습니다.

.
├── 11
├── 111
├── 112
├── 1121
├── 113
├── 11a
├── 11a1
├── 1a1
├── 1a2
├── 1aa1.png
├── 2a1
├── a.
├── a1a
├── a1a.jpg
├── a2a
├── aa
├── -aa
├── aa.gif
├── aa.jpg
├── aa.png
├── aa.tiff
├── a.exe
├── a.gif
├── a.html
├── a.jpg
├── a.png
├── a.tiff
├── b2
├── b2a
├── ba.gif
├── ba.jpg
├── ba.png
├── ba.tiff
├── b.html
├── cb1.png
├── d.gif
└── sub1
    ├── d.gif
    └── sub2

따라서 .($PWD)이지만 확장자가 ".jpg"인 파일을 일치시키려면 다음을 수행합니다.

ls !(*.jpg)

그러나 다음과 같이 출력됩니다.

11   1121  11a1  1aa1.png  a1a  aa.gif   a.exe   a.png   b2a     ba.tiff  d.gif
111  113   1a1   2a1       a2a  aa.png   a.gif   a.tiff  ba.gif  b.html   .gif
112  11a   1a2   a.        aa   aa.tiff  a.html  b2      ba.png  cb1.png

sub1:
.  ..  d.gif  sub2

sub1과 그 내용(디렉토리 포함)을 모두 제외하고 싶습니다. 즉:

sub1:
.  ..  d.gif  sub2

다음을 사용하여 제외할 수 있습니다.

GLOBIGNORE='sub1'ls 앞에 있지만 이름이 다른 디렉토리가 더 있으면 어떻게 되나요?

이를 수행할 수 있는 방법이 있습니까?

답변1

쉘이어야 합니까 bash? ZSH 및 set을 사용하면 glob 표현식을 일반 파일로 제한 EXTENDED_GLOB할 수 있습니다 .(.)().

$ PS1='%% ' zsh -f
% setopt EXTENDED_GLOB
% mkdir foo && cd foo
% touch nope.jpg
% mkdir sub1
% touch asdf
% print ^*.jpg
asdf sub1
% print ^*.jpg(.)
asdf
% 

답변2

테이크아웃 솔루션:

ls -pd !(*.jpg) | grep -Ev /$

세부 사항

glob 패턴은 하위 디렉터리에 포함되지 않습니다. ls기능: 명령줄에 디렉터리를 전달하면 해당 디렉터리의 내용이 표시됩니다.

ls다음으로 교체 echo:

$ echo !(*.jpg)

또는 (거의) 동등한 해결책: ls디렉토리에 들어가지 말라고 지시합니다.

$ ls -d !(*.jpg)

주석의 질문에 답하려면 "ls 명령을 사용하여 폴더는 제외하고 파일만 나열하려면 어떻게 해야 합니까?"라는 질문에 답하려면 다음과 같이 하십시오.

디렉토리를 나열하는 간단한 방법은 다음과 같습니다.

echo */

따라서 디렉토리가 아닌 파일만 나열하는 대답은 다음을 사용하여 수행할 수 있습니다.grep -v

$ ls -p | grep -Ev /$

$ find . -maxdepth 1 ! -type d

find는 도트 파일(숨겨진 파일)을 나열합니다. 그리고 find . -type d(또한) 심볼릭 링크도 따르지 않습니다.

또는 실용적인 (posix) 루프:

$ for f in * ; do if [ -f "$f" ] ; then echo "$f" ; fi ; done

물론, 음의 확장에 대한 구체적인 해결책은 다음과 같아야 합니다:

$ ls -pd !(*.jpg) | grep -Ev /$
11
111
112
1121
113
11a
11a1
1a1
1a2
1aa1.png
2a1
a.
a1a
a2a
aa
aa.gif
aa.png
aa.tiff
a.exe
a.gif
a.html
a.png
a.tiff
b2
b2a
ba.gif
ba.png
ba.tiff
b.html
cb1.png
d.gif

노트:

옵션 -p는 grep과 함께 작동하여 디렉토리를 식별합니다. ls 매뉴얼 페이지를 참조하십시오.

-p, --filetype, --indicator-style=파일 유형

답변3

예를 들어 다음과 같이 출력을 필터 ls로 파이프할 수 있습니다.grep

ls * | grep -v "jpg"

문자열 "jpg"를 포함하지 않는 모든 일치 항목을 반환합니다. (이 grep -v플래그는 일치 항목을 반전시켜 지정된 문자열을 포함하지 않는 모든 줄을 반환합니다.)

답변4

ls 앞에 GLOBIGNORE='sub1'을 사용하여 제외할 수 있지만, 다른 이름을 가진 디렉토리가 더 있으면 어떻게 됩니까?

~에서배쉬 참조 매뉴얼, 글로비고어는 다음과 같습니다:

파일 이름 확장 시 무시할 파일 이름 집합을 정의하는 콜론으로 구분된 패턴 목록입니다. 파일 이름 확장자 패턴과 일치하는 파일 이름이 GLOBIGNORE의 패턴 중 하나와도 일치하는 경우 일치 목록에서 제거됩니다. 패턴 일치는 extglob 쉘 옵션의 설정을 따릅니다.

관련 정보