我需要在脚本中查找文件是否被压缩。如果它被压缩,我需要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##*.}
.
但在这种情况下,我会考虑直接像这样进行解压缩和 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 -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 {} +