ファイルが圧縮されているかどうかを確認する

ファイルが圧縮されているかどうかを確認する

スクリプトでファイルが圧縮されているかどうかを調べる必要があります。圧縮されている場合は、uncompressとして送信する必要がありますattachement。私の検索コマンドの結果は2つのファイルでsum12.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圧縮ファイルの処理も追加しました。

関連している:


複数のandステートメントの代わりにsh -c使用するスクリプトの代替実装。case ... esacifelif

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 {} +

関連情報