"[:인수가 너무 많습니다"로 인해 Linux 명령이 실패합니다.

"[:인수가 너무 많습니다"로 인해 Linux 명령이 실패합니다.
DIR=/u01/app/tomcat/apache-tomcat-9.0.43/work
if [ $(ls -A $DIR) ]
then
        echo 'Folder is not empty'
else
        echo 'Folder is empty'
fi

잘 작동하고 출력은 다음과 같습니다.

폴더가 비어 있지 않습니다.

그러나 /temp를 시도하면 실패합니다. 오류 발생

DIR=/u01/app/tomcat/apache-tomcat-9.0.43/temp
if [ $(ls -A $DIR) ]
then
        echo 'Folder is not empty'
else
        echo 'Folder is empty'
fi

[: 매개변수가 너무 많아 폴더가 비어 있습니다.

/temp가 작동하지 않는 이유 ? [: 인수 폴더가 너무 많음 오류는 폴더가 비어 있지 않은 경우에만 발생합니다.

답변1

구문 분석하지 않는다는 의견이 ls정확합니다. 그러나 이 좁은 예에서는 참조에 문제가 있습니다.

이것은 작동합니다:

if [ "$(ls -A $DIR)" ]
then
        echo 'Folder is not empty'
else
        echo 'Folder is empty'
fi

그러나 이는 여러 가지 이유로 문제를 해결하기에는 정말 나쁜 방법입니다.

대안은 다음과 같습니다(물론 수많은 다른 대안도 존재합니다).

if find "${DIR}/" -maxdepth 1 -mindepth 1 | head -1 | grep -Eq "^.|^$"
then
        echo 'Folder is not empty'
else
        echo 'Folder is empty'
fi

여기서 이론은 head -1단일 항목을 찾는 즉시 파이프라인이 중지되므로 디렉터리에 항목이 많으면 시간이 절약된다는 것입니다.

방금 grep -q "^.|^$"확인했습니다무엇(또는 빈 줄) 이전 명령에서 반환되었습니다.

또는...

또 다른 방법은 디렉토리에 있는 "링크" 수를 살펴보는 것입니다. 빈 디렉토리에는 특별 항목 .과 항목 에 대해 각각 정확히 2개가 있습니다 ...

암소 비슷한 일종의 영양stat

if stat --printf %h "${DIR}/" | grep -qvFx 2
then
        echo 'Folder is not empty'
else
        echo 'Folder is empty'
fi

MacOS 네이티브stat

if stat -f %l "${DIR}/" | grep -qvFx 2
then
        echo 'Folder is not empty'
else
        echo 'Folder is empty'
fi

두 가지 모두 운영 체제나 파일 시스템이 디렉터리 하드 링크를 방지하고 비어 있을 때 두 링크를 모두 보고한다고 가정합니다. 둘 중 하나 이상이 그렇지 않은 경우 솔루션이 더 find나은 옵션이 될 것입니다.

관련 정보