주어진 입력 패턴과 일치하는 디렉터리의 모든 파일을 반복적으로 나열하고 싶습니다.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 = s
full 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
표준 파일 이름 패턴을 사용 합니다 .ksh
bash
bash
ls
extglob
그래서 당신은 이것을 할 수 있습니다 :
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
.