Copiando novo arquivo e enviando um email

2

Eu quero copiar todos os arquivos com a extensão .beta de um diretório para outro e, em seguida, enviar um e-mail com o seguinte formato.

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

O email só deve ser enviado se esses arquivos forem encontrados e movidos com sucesso.

Isso é o que eu tenho até agora. O problema com este script é que ele comete erros se nenhum arquivo for encontrado:

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

Além disso, recebo um email mesmo que o arquivo não seja movido.

#!/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]
    
por Zaria Sofia 03.06.2015 / 20:00

2 respostas

3

Adicione a seguinte linha antes do seu for FILE in... :

shopt -s nullglob

Isso evita que o loop seja inserido uma vez, se não houver arquivos encontrados. No seu caso, o loop é inserido com *.beta e o comando mv está tentando mover o *.beta para seu diretório de destino

A próxima coisa é que sua parte | mailx -s "Dev-Script" [email protected] é melhor anexada à linha printf $BODY , portanto, ela só é executada quando $FILE_FOUND é igual a 1.

    
por 03.06.2015 / 21:37
0

O primeiro problema, lidando com casos em que não há arquivos, pode ser feito usando o recurso nullglob do bash. Conforme explicado em man bash :

nullglob

If set, bash allows patterns which match no files (see Pathname Expansion above) to expand to a null string, rather than themselves.

A melhor maneira seria não usar um loop. Em vez disso, use os operadores && e || para controlar quando o email é enviado. Você pode simplificar seu script para:

#!/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
    
por 03.06.2015 / 22:09