.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
ファイルがない状況を処理する最初の問題は、nullglob
bashの機能を使用して解決できます。説明したように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