ls
bash를 사용하여 간단한 명령으로 다음을 달성할 수 있습니까 ? 두 글자로 시작하고 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|)
와도 작동함 ).ksh
bash
또 다른 비결은 다음과 같은 사실을 활용하는 것입니다."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 {} +
(파일 목록은 정렬되지 않으며 유효한 문자를 구성하지 않는 바이트가 포함된 파일 이름은 제외됩니다. 파일 이름에도 접두사가 붙습니다 ./
.)