Я хочу посмотреть каталог на предмет изменений, если поступит новый файл и отправить письмо с именем файла - PullRequest
1 голос
/ 09 октября 2019

Я создал скрипт bash, чтобы проверить каталог на наличие новых изменений и отправить письмо получателю. Но я получаю сообщение об ошибке.

Я создал скрипт bash, но он выдает следующую ошибку.

script6.sh: строка 10: синтаксическая ошибка рядом с неожиданным токеном done' script6.sh: line 10: done '

Просто я хочу знать, где я не прав. неверный сценарий или есть небольшая ошибка. Нужна помощь в этом.

#!/bin/bash
targetDir="/somedir"
while true; do
 files=("$targetDir"/*)
sleep 1m ## wait 1 minute
files1=("$targetDir"/*)
if [[ ${#files[@]} != ${#files1[@]} ]]; then
 mailx -s "New files arrived:$files1" some@mail.com < "$files1"
fi
done

Мои задачи заключаются в следующем. 1. Записать каталог для входящих файлов. 2.При получении любого нового файла проверьте существующие файлы. 3.Если это новый файл, отправьте письмо получателю. Я хочу, чтобы все вышеперечисленное было достигнуто с помощью bash-скрипта.

Ответы [ 3 ]

0 голосов
/ 09 октября 2019

Просто чтобы дать вам представление о том, что вы также можете сделать:

#!/bin/bash
targetDir="22"
inotifywait -q -r -m -e create "$targetDir" |
while read -r path event filename; do
  mailx -s "New files arrived: $path$filename" some@mail.com < "$path$filename"
done

Вам нужно inotifywait в вашей системе, однако, установите, установив "inotify-tools".

0 голосов
/ 09 октября 2019

Вы можете использовать inotifywait, специально созданный для просмотра файлов

#!/bin/bash
targetDir="/somedir"
inotifywait -m $targetDir -e create -e moved_to |
    while read path action file; do
        mailx -s "Filers arrived:$files" some@mail.com < "$files"
        # do something with the file
    done
0 голосов
/ 09 октября 2019

Впервые мы можем сканировать каталог и архивировать результаты сканирования. после этого, если происходит обновление, удаление или создается новый файл или каталог.

Мы можем использовать эти архивные данные эталонного теста для сравнения, а затем мы можем определить, было ли обновлено содержимое текущего каталога.

мы можем использовать размер блока файла или md5 в зависимости от того, что вы хотите.

Вот простой способ сделать это, и вы также можете обновить его, чтобы использовать другие методы мониторинга.

if [ "$#" -ne 1 ]; then
    echo "Usage: `basename $0` directoryName"
    exit 1
fi 

firstTime=0
lastFile=last.txt
recentFile=recent.txt
currentDir=$1

if [ ! -e "$lastFile" ]; then
    firstTime=1
fi    

shopt -s extglob
cd $currentDir && du -bs !($lastFile|$recentFile) > recent.txt 2> /dev/null

if [ "$firstTime" -ne 1 ]; then
    changes=$(sed '1,/@@/d' <(diff -Naur recent.txt last.txt))
    if [ -n "$changes" ]; then
        echo "Change:"
        echo "$changes" | tee $$.tmp
        echo

        filename=$(awk '/^+/||/^-/{print $2}' $$.tmp | sort -u)
        count=0
        for f in $filename; do
            echo "changed filename: $f"
            let "count+=1"
        done
        echo -e "\nA total of $count filenames were changed."
    else
        echo "The Directory has no changes.."
    fi
else
    echo "[First run] Archiving.."
fi


cp $recentFile $lastFile

rm -rf $$.tmp 2> /dev/null
...