Script para verificar se o arquivo existe e copiar

1

Muito novo no shell script, deseja gravar um script que verifique se existe algum arquivo .300 extension em /exports/files no servidor 10.xx.xx.xx. Se *.300 existir, mova o arquivo para /exports/files/arch e envie um email para [email protected] . Se *.300 não for encontrado, não faça nada.

Eu tentei abaixo da sugestão:

#! /bin/bash

    for FILE in 'ls /exports/files/*.300'
    do
       mv $FILE /exports/files/arch
       echo "$FILE moved" | mailx -s $FILE moved [email protected] 
    done

Quando não há arquivos, o erro é dizer ls: cannot access /exports/files/*.300: No such file or directory . Existe alguma maneira de suprimir isso ...

    
por Zaira banu 28.05.2015 / 18:48

3 respostas

2

[UPDATE]

#!/usr/bin/env bash
shopt -s nullglob #to make '("$src_dir"*.300)' works
src_dir="/exports/files/" #don't forget trailing slash /
dest_dir="/exports/files/arch/" #don't forget trailing slash /
err_f="/tmp/error.txt"
mv_f="/tmp/moved.log" #record moved file in case network down
email="[email protected]"
touch "$err_f" #bcoz we use >> apppend
touch "$mv_f" #bcoz we use tee -a append
if [ ! -d "$src_dir" ]; then echo|mailx -s "Error: directory $src_dir not exist" "$email" 2>>"$err_f"; exit 1; fi
if [ ! -d "$dest_dir" ]; then echo|mailx -s "Error: directory $dest_dir not exist" "$email" 2>>"$err_f"; exit 1; fi
{
f=("$src_dir"*.300)
for ((i=0; i < ${#f[@]}; i+=1)); do
        mv -f "${f[i]}" "$dest_dir"  2>>"$err_f"; #-f do not prompt
        if [ $? -eq 0 ]; then
                if [ "$i" -eq 0 ]; then echo "$(date +"%Y-%m-%d %H:%M:%S")"; echo "The following files has been moved from $src_dir to $dest_dir"; echo; fi
                echo "$((i+1))." "$(basename "${f[i]}")" 'moved'; echo;
        else
                 echo| mailx -s "Error:  $(<"$err_f")" "$email" 2>>"$err_f"; break
        fi
done
} | tee -a "$mv_f" | mailx -E -s "The following files has been moved" "$email" 2>>"$err_f"

Exemplo da caixa de entrada de email screeshoot:

E-mail recebido quando erro mv :

E-mailrecebidoquandomvdesucesso:

/tmp/moved.log para registrar os arquivos movidos e /tmp/error.txt para registrar todos os erros, ambos os arquivos usados para manter registros de log até rede para baixo :

Nota:

  1. Vocênãodeveanalisarasaídadels
  2. mailx-Eparaevitarocorpovazio,paraqueelenãosejaenviadosenenhumarquivoformovido
  3. mailxsomenteumsemvencontrarerro,usandobreakparaquebrarantes,emvezdeexit1,porqueaindaqueremossaberqualarquivofoimovidoantesqueoerroocorra.
  4. Avantagemdecmd;if[$?-eq0]compararcomimplicitamenteifcmdéquevocêpodemodificá-lofacilmenteparaalgumoutrocomandoquepossaexigirumcódigoderetornodiferente.
  5. Vocêdeveremovermanualmenteosarquivos/tmp/error.txte/tmp/moved.logqueserãoanexadosdetemposemtempos.

Referência:

  1. link
  2. link
  3. link

  4. link

por 29.05.2015 / 11:18
2

Alguma coisa assim deve fazer o truque. Se você precisar se conectar remotamente ao servidor, use os certificados ssh e execute este script usando ssh.

    #! /bin/bash

    for FILE in 'ls /exports/files/*.300'
    do
       mv $FILE /exports/files/arch
       echo "$FILE moved" | mailx -s $FILE moved [email protected] 
    done
    
por 28.05.2015 / 21:11
0

apenas por diversão

 #! /bin/bash

ls /exports/files/*.300 | while read FILE 
do
   if mv $FILE /exports/files/arch
   then echo "$FILE moved" 
fi
done | mailx -s files moved [email protected] 

fornecerá um único e-mail com todos os arquivos movidos e ignorará o erro.

com apenas 3 níveis de tubos.

Editar:

com alguns arquivos:

#! /bin/bash
if ls /exports/files/*.300 > /dev/null 2>&1
then 

   ls /exports/files/*.300 | awk '{printf "%s moved\n",$0 }' | mailx -s files moved [email protected]
   mv /exports/files/*.300 /exports/files/arch

 else 
   echo no .300 file found | mailx -s no .300 files moved [email protected]

fi

em caso de lista de argumentos muito longa

#! /bin/bash
if ls /exports/files/*.300 > /dev/null 2>&1
then 
   ls /exports/files/*.300 | while read FILE 
   do
      if mv $FILE /exports/files/arch
      then echo "$FILE moved" 
      fi
   done | mailx -s files moved [email protected] 
fi
    
por 29.05.2015 / 11:55