if 문을 사용하여 와일드카드를 사용하여 파일이 폴더에 있는지 확인하세요.

if 문을 사용하여 와일드카드를 사용하여 파일이 폴더에 있는지 확인하세요.

전체 이름이 없는 여러 파일을 처리해야 합니다. if 문을 실행하기 위해 와일드카드를 사용하고 있습니다. 예를 들어...

if [ "ESGSN_*.SMS.EDR" ]; then
    echo "There are files to process in this run"
    for F in ESGSN_*.SMS.EDR; do
        gzip < "$F" > "$F.gz"
    done
fi

여러 파일 또는 단일 파일이 있고 압축하는 경우 작동합니다. 그러나 파일이 없으면 직접 종료되지 않고 zip이 계속 실행됩니다. 완료하고 계속할 수 있는 방법이 있는지 궁금합니다.

파일 이름 앞의 괄호 안에 "-f" 및 "-a" 연산자를 사용해 보았지만 "이진 연산자가 필요합니다"라는 오류가 발생합니다.

어떤 이유로 파일 이름의 별표가 메시지 아래에 표시되지 않습니다. 따라서 파일 이름은 "ESGSN_"*".SMS.EDR"이며 큰따옴표는 별표입니다.

답변1

if ! gzip ESGSN_*.SMS.EDR 2>/dev/null; then
    printf 'No files to process (gzip exit code: %d)\n' "$?"
fi

문자열이 ESGSN_*.SMS.EDR비어 있지 않으므로 테스트는 항상 true입니다. glob을 큰따옴표로 묶으면 *처리되지 않습니다.

또한 대부분의 쉘은 패턴이 아무것도 일치하지 않는 경우 기본적으로 패턴을 확장되지 않은 상태로 둡니다. 이는 귀하의 경우 코드가 빈 파일을 생성하게 되고 ESGSN_*.SMS.EDR.gz패턴이 파일 이름과 일치하지 않으면 를 호출한다는 의미입니다.

위의 코드는 단순히 패턴과 일치하는 모든 파일을 압축하려고 시도하고 실패할 경우 메시지를 인쇄합니다.

답변2

이 질문에 대답하는 방법에는 두 가지가 있습니다. 현재 스크립트를 수정하거나 더 빠르고 정확한 대안을 찾는 것입니다. 두 가지 방법을 모두 시도해보겠습니다 :)

첫째, 스크립트의 한 가지 문제점은 [ "ESGN_*.SMS.EDR" ]항상 true로 평가된다는 것입니다. 이 [ "<string>" ]구성은 단순히 문자열이 비어 있지 않은지 여부를 테스트합니다. 파일이 없더라도 제공한 문자열은 비어 있지 않으므로 테스트는 아무 작업도 수행하지 않습니다.

이 문제를 해결하려면 모든 파일을 반복하여 패턴과 일치하는지 테스트해야 합니다. 다음은 나에게 효과적이었습니다.

for F in *; do
    if [[ "$F" =~ ESGSN_.*\.SMS\.EDR ]]; then
        printf "Processing '%s'\n" "$F"
        gzip < "$F" > "$F.gz"
    fi
done

그러나 내가 이 문제를 내 자신의 용도로 해결하고 싶다면 그렇게 하지 않을 것입니다. 대신 GNU 를 사용하는 것이 더 빠르고 자연스럽습니다 find. 이를 통해 쉬운 패턴 일치가 가능합니다.

find ./ -type f -regex ".*/ESGSN_.*\.SMS\.EDR" -exec bash -c "gzip < {} > {}.gz" \;

find명령은 매우 강력하므로 Linux를 많이 사용한다면 익숙해지고 싶을 것입니다. 자세히 살펴보는 것이 좋습니다 man find.

답변3

모두 감사합니다. 나는 다음으로부터 필요한 것을 얻을 수 있었습니다:

if ls -lrt ESGSN_*.SMS.EDR ; then

답변4

그래서 나는 당신을 위해 그것을 조금 단순화했습니다.

#!/bin/bash

shopt -s nullglob
files=(yourdir/*)

if [[ ${#files[@]} == 0 ]]  # If array is equal to 0
  then echo "No files there" >&2
  exit 1
else
  gzip "${files[@]}" # gzip all elements within the array.
fi
shopt -u nullglob 

스크립트의 기능을 설명하세요.

설정 nullglob방법shopt -s nullglob

nullglob은 패턴과 일치하는 파일 수를 계산하는 데 사용됩니다. nullglob이 없으면 glob *는 리터럴 *로 확장됩니다. 즉, 빈 디렉터리에서는 개수가 항상 1보다 커서 잘못된 개수가 발생합니다.

nullglob다음을 통해 설정 해제shopt -u nullglob

이 줄 뒤에 잠재적으로 영향을 받을 가능성이 있는 코드가 더 있는 경우 이는 중요합니다 nullglob.

관련 정보