![ファイルが圧縮されているかどうかを確認する](https://rvso.com/image/38697/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8C%E5%9C%A7%E7%B8%AE%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B%E3%81%A9%E3%81%86%E3%81%8B%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B.png)
スクリプトでファイルが圧縮されているかどうかを調べる必要があります。圧縮されている場合は、uncompress
として送信する必要がありますattachement
。私の検索コマンドの結果は2つのファイルで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
圧縮ファイルの処理も追加しました。
関連している:
複数のandステートメントの代わりにsh -c
使用するスクリプトの代替実装。case ... 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 {} +