폴더에 파일이 있는지 확인하고 그에 따라 종료하는 방법(KSH)

폴더에 파일이 있는지 확인하고 그에 따라 종료하는 방법(KSH)

나는 KSH를 가지고 있습니다 (큰 타격은 아니다) 선점된 스크립트를 파일 개수로 확인하고 싶습니다. 파일이 없으면 "EMPTY"를 인쇄하고 종료하고 싶습니다. 그렇지 않으면 계속하십시오.

문제는 파일 개수를 계산할 때 파일이 비어 있다가 중단된다는 것입니다.

암호:

###################################################
# Test to see if files exist in Drop Folder
###################################################
CONTENTS=$(ls ${gp_path}ALLSTUFF*.zip)
if [[ ${#CONTENTS[@]} -eq 0 ]]; then
    print 'EMPTY'
    exit 0
else
    print 'NOT EMPTY'
fi

비어 있지 않으면 유효합니다.

비어 있으면 다음 오류가 발생하고 시스템이 충돌합니다. EMPTY를 보고하고 0으로 종료되기를 원합니다.

실수:

/nas/Opt/databox/folder/ALLSTUFF*.zip not found

내가 뭘 잘못했나요?

시도 #2

나도 이것을 시도했지만 같은 결과를 얻었습니다.

if [ "$(ls ${gp_path}ALLSTUFF*.zip)" ]; then
    print 'NOT EMPTY'
else
    print 'EMPTY'
    exit 0
fi

답변1

Kusalananda의 답변에 대한 Stéphane Chazelas의 의견에 대한 후속 조치:

$ ksh
$ echo ${.sh.version}
Version AJM 93u+ 2012-08-01
$ ls
TABLE1.csv  TABLE2.csv

파일을 저장하려면 배열을 사용하세요. 일부 파일과 일치하는 glob 표현식으로 시작합니다.

$ typeset -a files
$ files=( ~(N)*.csv )
$ echo "${#files[@]}"
2
$ typeset -p files
typeset -a files=(TABLE1.csv TABLE2.csv)

이제 일치하지 않는 "네이키드" glob은 일치하지 않는 glob이 glob 패턴에 의해 문자열로 대체됨을 보여줍니다.

$ files=( *.txt )
$ echo "${#files[@]}"
1
$ typeset -p files
typeset -a files=('*.txt')

이제 "null glob"이라는 접두사가 붙습니다.

$ files=( ~(N)*.txt )
$ echo "${#files[@]}"
0
$ typeset -p files
(empty output)
$

ksh 매뉴얼 페이지의 파일 이름 생성 섹션을 참조하십시오.


귀하의 질문에 구체적으로 답변하려면 다음을 수행하십시오.

typeset -a contents=( ~(N)"$gp_path"/ALLSTUFF*.zip )
if [[ ${#contents[@]} -eq 0 ]]; then
    print 'EMPTY'
    exit 0
else
    print 'NOT EMPTY'
fi

변수 이름을 모두 대문자로 사용하는 습관을 버려야 합니다.

또한보십시오:https://mywiki.wooledge.org/ParsingLs

답변2

2>/dev/null에서 오류 메시지를 만들 수 있습니다 ls.

$CONTENTS그러면 비어 있는지 확인할 수 있습니다.-z

CONTENTS=$(ls -d -- "${gp_path}ALLSTUFF"*.zip 2>/dev/null)
if [ -z "$CONTENTS" ]; then
    print 'EMPTY'
    exit 0
else
    print 'NOT EMPTY'
fi

답변3

파일 이름 패턴이 어떤 것으로 확장되는지 감지하려면 다음을 사용할 수 있습니다.

set -- "$gp_path"ALLSTUFF*.zip

if [ -e "$1" ]; then
    echo matched something
else
    echo did not match anything
    exit 1
fi

set명령은 패턴과 일치하는 파일 이름에 위치 인수를 설정하고, 첫 번째로 일치하는 파일 이름이 있으면 무엇인가와 일치합니다. 패턴이 일치하는 항목이 없으면 패턴은 확장되지 않은 상태로 유지됩니다.

ksh이는 , bash및 기타 sh유사한 셸 에서 사용할 수 있습니다 .

관련 정보