Muttを使用してフォルダ内の特定のファイルを送信しようとしています。毎秒写真を撮って30秒分の写真が入っている「イメージキャッシュ」というフォルダがあります。 Muttを使って15秒の写真をメールに添付して送りたいです。画像あたり約30KiBなので、メールに15KiBを入れることは問題になりません。
これまで、私はこの記事のほとんどのコードを使用してきました。ここ私のファイルシステムと一致するようにいくつかの変更を適用しました。
これは私が使用するコードです:
#!/bin/bash
DATE=$(date +%F)
MESSAGE="IMAGES"
FILES=$(find /path/to/directory -not -newermt '-15 seconds' | sed 's/ /\\ /g' | grep ".jpg")
if [ -z "$FILES" ]; then
MBODY="No images were found that match search criteria."
echo "$MBODY" | mutt -s "Data files for $TODAY" $EMAILS
fi
echo $MESSAGE | mutt -s "Images taken on $DATE" -a "$FILES" -- [email protected]
このエラーを吐き出します。
Can't stat /My/Directory/Image1.jpg
/My/Directory/Image2.jpg: No such file or directory
/My/Directory/Image3.jpg: unable to attach file.
どんな助けにも感謝します:)。事前にありがとう
答え1
引用したので、"$FILES"
単一の文字列を-a
オプションに渡しています。そこに単一のファイルを渡す必要があります。
あなたがしなければならないことは、ファイルを配列に保存することです。これは、スペースを含む複数の文字列を処理するための最良の方法です。あなたのファイル名に改行文字が含まれていないとします。
# read the output of `find` into an array, one element per line
mapfile -t files < <(find /path/to/directory -name '*.jpg' -not -newermt '-15 seconds')
# ...
echo "$message" | mutt -s "Images taken on $date" -a "${files[@]}" -- [email protected]
# ...................................................^^^^^^^^^^^^^
引数拡張の正確な形式のため、各配列要素はコマンド内の別々の単語になります。
ALLCAPSVARNAMESを使用する習慣を捨ててください。いつかこれを使ってPATH=...
、なぜスクリプトが破損しているのか疑問に思うでしょう。