Определить, сжат ли файл или нет

Определить, сжат ли файл или нет

Мне нужно узнать, сжат ли файл в скрипте. Если он сжат, мне нужно uncompressи отправить как attachement. Моя команда find выдает два файла sum12.pdf.Zи sum23.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##*.}.

Однако в этом случае я бы рассмотрел возможность выполнения распаковки и uuencode-кодирования 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также не сохраняет несжатые файлы, а распаковывает их, uuencoded и отправляет за один раз.

Я также добавил обработку gzipсжатых файлов.

Связанный:


Альтернативная реализация скрипта sh -cс использованием case ... esacвместо него нескольких операторов ifand 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 {} +

Связанный контент