예를 들어, 깊이 1의 패턴과 일치하는 파일 수를 계산하고 숫자와 비교하여 그러한 파일이 3개 이상 있는지 확인하고 싶습니다. 그러나 if/then 구문을 사용하지 않고 이 작업을 수행하고 싶습니다.
그것은 다음과 같습니다:
ls -1q -d *patternX* | wc -l | [ -ge 3]
if/then 구문을 사용하여 이스케이프할 수 있는 방법이 있는지 알려주시면 매우 감사하겠습니다. 감사해요!
답변1
일치하는 이름의 수를 세고 *patternX*
3보다 크거나 같은지 테스트하려는 것 같습니다.
이렇게 하는 것이 더 좋습니다:
shopt -s nullglob
set -- *patternX*
if [ "$#" -ge 3 ]; then
echo 'More than 2 names match the pattern'
fi
그러면 위치 매개변수가 패턴과 일치하는 이름으로 설정됩니다. 일치하는 이름의 개수가 에 저장됩니다 $#
. 이 nullglob
옵션은 이름이 일치하지 않으면 패턴이 확장되지 않은 상태로 남아 있지 않고 완전히 제거되도록 설정됩니다.
명명된 배열을 사용하여 일치하는 이름을 저장할 수도 있습니다.
shopt -s nullglob
names=(*patternX*)
if [ "${#names[@]}" -ge 3 ]; then
echo 'More than 2 names match the pattern'
fi
당신은 또한 볼 수 있습니다왜 `ls`를 구문 분석하지 *않나요*(그리고 어떻게 수행합니까)?
단어 없이 if
및 then
:
shopt -s nullglob
set -- *patternX*
[ "$#" -ge 3 ] && echo 'More than 2 names match the pattern'
비슷한 접근 방식이 사용됩니다 awk
.
shopt -s nullglob
awk 'BEGIN { if (ARGC > 3) print "more than 2" }' *patternX*
ARGC
in 은 awk
명령 이름( $0
셸의 이름)을 의미하기도 합니다.
답변2
의 경우 zsh
일반적으로 다음과 같은 익명 함수를 사용합니다.
()(( $# >= 3 )) *patternX*(N)
본문이 (( $# >= 3 ))
(반환되는) 익명 함수를 호출합니다.진짜인수 개수가 3개 이상인 경우) *patternX*(N)
glob의 확장이 인수로 사용됩니다.
(N)
nullglob
일치하는 파일이 없는 경우 오류를 보고하는 대신 glob이 비어 있도록 확장되도록 이 glob을 활성화하는 옵션입니다 .
귀하가 요청한 질문에 대한 보다 직접적인 대답은 다음과 같습니다.
ls -1q -d -- *patternX* | wc -l | xargs -IN test N -ge 3
(모든 쉘에서, 그러나 패턴이 어떤 파일과도 일치하지 않을 때 다른 쉘은 다르게 작동합니다.)
또는:
[ "$(( $(ls -1q -d -- *patternX* | wc -l) ))" -ge 3 ]
(POSIX 또는 Korn과 유사한 쉘에서)
답변3
이것이 실제 문제라고 믿기는 어렵지만 해결책은 다음과 같습니다.
ls -1q -d *patternX* | wc -l | egrep '^[3-9][0-9]*|[0-9][0-9]+' && echo JA