이름이 3가지 다른 조건을 충족하는 파일 나열

이름이 3가지 다른 조건을 충족하는 파일 나열

lsbash를 사용하여 간단한 명령으로 다음을 달성할 수 있습니까 ? 두 글자로 시작하고 e이름에 포함되어 있으며 1하나 이상의 글자로 끝나는 모든 파일을 나열합니다. 그렇다면 명령은 무엇이며 확장 와일드카드를 활성화해야 합니까?

답변1

ls--include파일 이름과 일치하지 않습니다( /etc GNU 확장자를 고려하지 않는 한 --exclude). 일반적으로 이 목적으로 사용되는 것은 쉘 글로브입니다.

ls -ld [[:alpha:]][[:alpha:]]*e*[[:alpha:]]

이러한 요구 사항과 일치하는 파일을 찾을 수 있지만 ee예를 들어 누락됩니다. 다음을 수행할 수 있습니다.

다루기 힘든

사용설마/와는 별개로연산자( ~) 및아니요( ^):

setopt extendedglob
ls -ld [[:alpha:]](#c2)*~^*e*~^*[[:alpha:]]

또는 perl미리보기 정규식 연산자와 같은 것을 사용하십시오.

setopt rematchpcre
match() [[ $REPLY =~ '^(?=.*e)(?=.*[[:alpha:]]$)[[:alpha:]][[:alpha:]]' ]]
ls -ld *(+match)

크쉬 93

&내부적으로 사용 @(...):

ls -ld @([[:alpha:]][[:alpha:]]*&*e*&*[[:alpha:]])

와 동일향상시키다정규 표현식(enabled 사용 ~(X:...)):

ls -ld ~(X:[[:alpha:]][[:alpha:]].*&.*e.*&.*[[:alpha:]])

또는 Perl과 유사한 예측 연산자를 사용하십시오.

ls -ld ~(P:(?=.*e)(?=.*[[:alpha:]]$)[[:alpha:]][[:alpha:]])*

세게 때리다

bash아니요그리고연산자이지만 ksh해당 옵션이 활성화되면 연산자의 하위 집합을 지원하므로 다음을 수행할 수 있습니다.extglob

shopt -s extglob
ls -ld @([[:alpha:]]?([[:alpha:]]*)e?(*[[:alpha:]])|e[[:alpha:]]?(*[[:alpha:]]))

@(x|y)(예: zsh) (x|y)또는운영자. ?(x)선택 사항입니다 x( zsh' (x|); 와 마찬가지로 / @(x|)와도 작동함 ).kshbash

또 다른 비결은 다음과 같은 사실을 활용하는 것입니다."A와 B""아니요((A)도 아니고(B)도 아님)", 그리고 지원되는 ksh glob의 하위 집합에는 다음이 bash포함됩니다.아니요그리고또는연산자를 사용하면 다음을 수행할 수 있습니다.

ls -ld !(!([[:alpha:]][[:alpha:]]*)|!(*e*)|!(*[[:alpha:]]))

이러한 연산자는 해당 연산자가 원래 나온 곳 ksh(모든 변형, 없음)에서도 작동합니다.shopt

비전역적 접근 방식

그리고 find:

find . ! -name . -prune -name '[[:alpha:]][[:alpha:]]*' \
                        -name '*e*' \
                        -name '*[[:alpha:]]' -exec ls -ld {} +

(파일 목록은 정렬되지 않으며 유효한 문자를 구성하지 않는 바이트가 포함된 파일 이름은 제외됩니다. 파일 이름에도 접두사가 붙습니다 ./.)

관련 정보