![Определить, сжат ли файл или нет](https://rvso.com/image/38697/%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B8%D1%82%D1%8C%2C%20%D1%81%D0%B6%D0%B0%D1%82%20%D0%BB%D0%B8%20%D1%84%D0%B0%D0%B9%D0%BB%20%D0%B8%D0%BB%D0%B8%20%D0%BD%D0%B5%D1%82.png)
Мне нужно узнать, сжат ли файл в скрипте. Если он сжат, мне нужно 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
сжатых файлов.
Связанный:
- Понимание опции -exec команды `find`
- Почему циклический просмотр вывода find является плохой практикой?
Альтернативная реализация скрипта sh -c
с использованием case ... esac
вместо него нескольких операторов if
and 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 {} +