재귀 ls에서 음수 extglob 패턴과 일치하는 모든 항목을 무시합니다.

재귀 ls에서 음수 extglob 패턴과 일치하는 모든 항목을 무시합니다.

주어진 입력 패턴과 일치하는 디렉터리의 모든 파일을 반복적으로 나열하고 싶습니다.ls를 사용하세요. (아, 이것은 Bash에 있습니다).

ls로 이 작업을 수행할 수 있다고 생각할 수 있는 유일한 방법은 확장된 glob 부정 모드와 함께 옵션을 shopt -s extglob사용하는 것 입니다 . 무시 시 부정하기에는 약간 우회적인 것처럼 보이지만 그렇지 않으면 와일드카드가 반복되지 않습니다.ls --ignore=pattern!( pattern-list )

찾을 디렉토리 dir와 일치시킬 패턴이 이미 있다고 가정하면 file이것이 현재 시도입니다.

ls -AR --ignore='!('"${file}"')' ${dir}

그러나 이는 원하는 효과를 얻지 못하는 것 같습니다. 예를 들어 테스트 케이스에서 디렉토리 구조는 다음과 같은 출력을 제공합니다 ls -AR.

    .:
    a  a.c  b  b.c  c  c.h  s

    ./s:
    a  a.c  b  b.c  c  c.h

file = *.c( dir = sfull command : ) 를 사용한 내 명령은 ls -AR --ignore=!(*.c) s다음과 같은 출력을 제공합니다.

    ./s:
    a  a.c  b  b.c  c  c.h

나는 이것을 grep에 쉽게 입력하고 다음과 같은 작업을 수행하여 ls -AR s | grep -v '.*.c'다음과 같은 출력을 얻을 수 있다는 것을 알고 있습니다.

    s:
    a
    b
    c
    c.h

그러나 나는 이것을 할 수 있는 방법을 찾고 있습니다 ls.

완전히 불분명하다면 죄송합니다. StackExchange 사이트를 처음 방문했습니다.

미리 감사드립니다!

답변1

globstar디렉토리 내용을 자동으로 나열하지 않도록 쉘 옵션과 -d플래그를 추가하는 것은 ls어떻습니까 ?

shopt -s extglob
shopt -s globstar
ls -d  **/!(*.c)

답변2

GNU 옵션은 확장 파일 이름 패턴 이 아닌 ls --ignore표준 파일 이름 패턴을 사용 합니다 .kshbashbashlsextglob

그래서 당신은 이것을 할 수 있습니다 :

ls -AR --ignore='*.[ch]' --ignore='*.cpp'

하지만 다음과 같은 경우에는 다음을 수행할 수 없습니다.

ls -AR --ignore='!(*.[ch]|*.cpp)'

이것은 이름이 다음과 같은 파일만 무시합니다: !(foo.c|bar.cpp).

에서는 ls -AR --ignore=!(*.c)스키마가 참조되지 않으므로 bash에 전달하기 전에 스키마를 확장하려고 시도합니다 ls. 따라서 현재 디렉터리에서 이름이 .로 시작 "--ignore="하고 끝나지 않는 파일을 찾습니다 ".c". 예를 들어, 두 개의 파일(하나는 이름이 지정 --ignore=foo되고 다른 하나는 이름이 지정됨) 이 있는 경우 , , , 4 개의 매개변수를 사용하여 실행 --ignore=bar됩니다 .ls"ls""-AR""--ignore=bar""--ignore=foo"

당신은 그것을 할 수 있습니다(GNU find를 사용하여).

find . -regextype posix-extended -regex '.*\.([ch]|cpp)' -ls

또는 POSIX를 사용하십시오 find.

find . \( -name '*.[ch]' -o -name '*.cpp' \) -exec ls -ld {} +

또는 디렉토리에 대한 심볼릭 링크가 없다고 가정합니다.

shopt -s extglob globstar dotglob failglob
ls -ld -- **/*.@([ch]|cpp)

이번에는 bash와일드카드 패턴이 실제로 확장되고 파일 목록이 ls.

관련 정보