현재 디렉터리에서 특정 이름만 제외하면서 특정 확장자를 가진 파일을 어떻게 찾을 수 있나요?

현재 디렉터리에서 특정 이름만 제외하면서 특정 확장자를 가진 파일을 어떻게 찾을 수 있나요?

나는 원해요찾다GNU가 아닌 환경의 일부 파일

  • 현재 디렉토리에서만
  • 확장 기능 포함*.ext1그리고*.ext2,
  • 하지만이름1.*또는이름2.*

다음 명령은 작동하지만 쉘이 확장 ./*되고찾다광범위한 파일 및 디렉토리 목록을 얻을 수 있습니다.

find ./* -prune \( -name '*ext1' -o -name '*ext2' \) -a ! \( -name 'name1*' -o -name 'name2*' \)

고쳐 쓰다:

나는 AIX에서 일하고 있는데-최대 깊이옵션.

답변1

그리고 find:

find . ! -name . -prune \
    \( -name '*.ext1' -o -name '*.ext2' \) \
  ! \( -name 'name1.*' -o -name 'name2.*' \)

using은 -pruneGNU 표준과 동일합니다 -maxdepth. 여기서는 를 find제외한 어떤 디렉토리에도 들어가지 말라고 지시합니다 ..

! -name .GNU 표준과 동일하게 선택에서도 제외됩니다 . GNU의 경우 ..! -name . -prune-mindepth 1 -maxdepth 1-mindepth 1find . \( -name . -o -prune \)

을 사용하면 zsh다음을 수행할 수도 있습니다.

set -o extendedglob
print -rC1 -- *.(ext1|ext2)~(name1|name2).*(ND)

~AND NOT 연산자이며 (D)도트 파일을 포함합니다.

답변2

현재 디렉토리에서 lswith를 사용할 수 있습니다 grep(파일 이름에 개행 문자가 포함되어 있지 않다고 가정).

ls -a | grep -E '\.ext(1|2)$' | grep -vE '^name(1|2)\.'

답변3

"현재 디렉토리에만" 파일이 필요하지 않고 find간단히 나열할 수 있습니다(재미있는 문자가 포함된 이상한 파일 이름이 발생할 가능성에 대한 일반적인 주의 사항).

ls -d *.ext1 *.ext2 2>/dev/null | grep -v '^\(name1\|name2\)\.'

답변4

이제 bash를 사용할 수 있으므로 다음을 사용할 수 있습니다.확장된 패턴 일치:

shopt -s extglob
files=( !(name1|name2).@(ext1|ext2) )

이는 현재 디렉토리의 모든 파일을 의미합니다.아니요"name1" 또는 "name2"로 시작하고 마침표가 옵니다.누구나"ext1" 또는 "ext2".

예를 들어 다음을 실행합니다.

$ touch name1.ext1 name1.ext2 name2.ext1 name2.ext2 name3.ext1 name3.ext2 name3.ext3
$ files=( !(name1|name2).@(ext1|ext2) )
$ declare -p files
declare -a files='([0]="name3.ext1" [1]="name3.ext2")'

"name3.ext2"와 같은 간단한 파일 이름이 있는 경우 패턴 일치 마침표를 넣을 위치("name3" 중 하나)를 선택해야 합니다.또는".ext2"에서 ​​"name3.intermediate.ext2"와 같이 파일 이름이 더 긴 경우 중간에 점과 전역 기호를 사용할 수 있습니다.

$ files=( !(name1|name2).*.@(ext1|ext2) )

관련 정보