나는 원해요찾다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은 -prune
GNU 표준과 동일합니다 -maxdepth
. 여기서는 를 find
제외한 어떤 디렉토리에도 들어가지 말라고 지시합니다 .
.
! -name .
GNU 표준과 동일하게 선택에서도 제외됩니다 . GNU의 경우 ..
! -name . -prune
-mindepth 1 -maxdepth 1
-mindepth 1
find . \( -name . -o -prune \)
을 사용하면 zsh
다음을 수행할 수도 있습니다.
set -o extendedglob
print -rC1 -- *.(ext1|ext2)~(name1|name2).*(ND)
~
AND NOT 연산자이며 (D)
도트 파일을 포함합니다.
답변2
현재 디렉토리에서 ls
with를 사용할 수 있습니다 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) )