新しいファイルをコピーしてメールを送信する

新しいファイルをコピーしてメールを送信する

.betaあるディレクトリから別のディレクトリに拡張子を持つすべてのファイルをコピーしたら、次の形式で電子メールを送信したいと思います。

The following files have been moved from directory A to Directory B: 
1. la.beta
2. pa.beta

そのファイルを見つけて正常に移動した場合にのみ電子メールを送信する必要があります。

これが私が今まで持っているものです。このスクリプトの問題は、ファイルが見つからないと次のエラーが発生することです。

mv: cannot stat `/home/zaree/*.beta': No such file or directory`  

そして、ファイルが移動されなかったとしても電子メールが届きます。

#!/usr/bin/env bash
FROM_DIR='/home/zaree'
TO_DIR='/home/zaree/test'

FILE_FOUND=0

BODY=$(printf "$(date)\n\n")
BODY+=$(printf "The following files have been moved from\n")
BODY+=$(printf "%s\nto\n%s\n\n" "$FROM_DIR" "$TO_DIR")

for FILE in /home/zaree/*.beta; do
                FILE_FOUND=1
        mv $FILE /home/zaree/test
        BODY+=$(printf "%s moved\n" "$FILE");
done

{
if (( $FILE_FOUND==1 )); then
        printf  "$BODY"
fi
} | mailx -s "Dev-Script" [email protected]

答え1

次の行を前に追加してくださいfor FILE in...

shopt -s nullglob

これにより、ファイルを見つけることなくループに一度入るのを防ぎます。あなたの場合、ループが入力され、*.betaコマンドmvはループを*.betaターゲットディレクトリに移動しようとします。

以下は、部品が行に最もよく追加され、1に等しい場合にのみ実行されることです。| mailx -s "Dev-Script" [email protected]printf $BODY$FILE_FOUND

答え2

ファイルがない状況を処理する最初の問題は、nullglobbashの機能を使用して解決できます。説明したようにman bash

空のボール

設定されている場合、bashは、どのファイルとも一致しないパターン(上記のパス名の拡張を参照)を、自分ではなく空の文字列に拡張することを許可します。

より良いアプローチは、ループをまったく使用しないことです。代わりに&&||オペレータ電子メールの送信タイミングを制御します。次のようにスクリプトを簡素化できます。

#!/usr/bin/env bash
FROM_DIR='/home/zaree'
TO_DIR='/home/zaree/test'

## Prepare the message. You can collect all the names
## here directly. The cat -n adds line numbers.
BODY=$(cat<<EOF
$(date)
The following files have been moved from
$FROM_DIR to $TO_DIR:
$(printf "%s\n" "$FROM_DIR"/*.beta | cat -n)
EOF
       )
mv "$FROM_DIR"/*.beta "$TO_DIR" 2>/dev/null && 
    printf "%s\n" "$BODY" | mailx -s "Dev-Script" [email protected] || 
    echo "No files found" >&2

関連情報