전체 이름이 없는 여러 파일을 처리해야 합니다. 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
.