파일이 압축되었는지 확인

파일이 압축되었는지 확인

파일이 압축되었는지 여부를 스크립트에서 찾아야 합니다. 압축된 경우 .my find 명령을 uncompress사용하여 두 개의 파일을 생성 해야 합니다. 내 스크립트는 다음과 같습니다.attachementsum12.pdf.Zsum23.pdf.Z

dir=/home/as1234/bills
cd $dir
for file in `find . -ctime -1 -type f -name "Sum*pdf*"`
do
if [ ${file: -1} == "Z" ]; then
echo "$file is Zipped"
uncompress $file
uuencode $file
fi
done
uuencode $file $file | mailx -s "subject" [email protected]

이 스크립트를 실행하면 다음과 같은 오류가 발생합니다.

 ${file: -1}: 0403-011 The specified substitution is not valid for this command.

을 사용하고 있습니다 ksh.

답변1

마지막 점 뒤의 파일 이름 접미사는 ${file##*.}.

하지만 이 경우에는 다음과 같이 직접 압축을 풀고 uuencoding하는 것을 고려해 보겠습니다 find -exec.

#!/bin/sh

dir=/home/as1234/bills

find "$dir" -type f -ctime -1 -name "Sum*.pdf*" -exec sh -c '
    for pathname do
        filename=$( basename "${pathname%.pdf*}.pdf" )
        if [ "${pathname##*.}" = "Z" ]; then
            uncompress -c "$pathname"
        elif [ "${pathname##*.}" = "gz" ]; then
            gzip -cd "$pathname"
        else
            cat "$pathname"
        fi |
        uuencode "$filename" |
        mailx -s "subject ($filename)" [email protected]
    done' sh {} +

이렇게 하면 공백이나 기타 문제가 되는 문자가 포함된 경로 이름을 지원할 수 있습니다. 또한 이 sh -c스크립트는 압축되지 않은 파일을 저장하지 않고 압축을 풀고 uuencode하여 한꺼번에 보냅니다.

gzip압축 파일 처리 도 추가했습니다 .

관련된:


sh -ccase ... esac다중 if및 명령문을 대체하는 스크립트를 사용하는 대체 구현입니다 elif.

find "$dir" -type f -ctime -1 -name "Sum*.pdf*" -exec sh -c '
    for pathname do
        filename=$( basename "${pathname%.pdf*}.pdf" )
        case $pathname in
            *.Z)  uncompress -c "$pathname" ;;
            *.gz) gzip -cd "$pathname" ;;
            *)    cat "$pathname"
        esac |
        uuencode "$filename" |
        mailx -s "subject ($filename)" [email protected]
    done' sh {} +

관련 정보