Bash скрипт для автоматической отправки по электронной почте переменной имени файла и соответствующей измененной отметки даты и времени - PullRequest
4 голосов
/ 02 марта 2020

Короче говоря, я пытаюсь найти дубликаты файлов (которые были загружены с FTP-сайта, это другой файл скрипта) и отправить по электронной почте компании обо всех дубликатах файлов и соответствующих датах их изменения.

Файл /path/test_mail.txt содержит одно имя файла на строку (в данном случае два имени файла), например

abc.xlsx
def.xlsx

В приведенном ниже коде я пытаюсь найти модифицированную метку даты-времени для первое имя файла и передайте его с соответствующим именем файла и отправьте электронное письмо, аналогично l oop работает для второго.

Это использует stat

for val in '/path/test_mail.txt'; do
        { stat path/$val | grep 'Modify: ' | cut -d' ' -f2,3,4 | awk -F"." '{print $1}' ; } |

        $val

done |


mail -s "Duplicate file found ${DATE}" abc@xyz.com

Я также пробовал в другой способ использования ls -ltr

for val in '/path/tj_mail.txt'; do
            { ls -ltr /path/$val | cut -d' ' -f6,7,8 | find $val / -path

$val

    done |


    mail -s "Duplicate file found ${DATE}" abc@xyz.com

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

Дубликат имени файла - xyz.xlsx Время загрузки - 2020-02-17 11: 18:10

Дубликат имени файла - ab c .xlsx Время загрузки - 2020-02-17 11: 18: 10

Следующий вопрос не является обязательным, но это будет отлично, если вы можете мне помочь!

Также я использую другой скрипт для поиска дубликатов имен файлов в каталоге. это прекрасно работает. Но мне интересно, смогу ли я втиснуть тот же код выше в один файл скрипта, чтобы он был четким и простым!

{
DATE=`date +"%Y-%m-%d"`
dirname=/path
tempfile=myTempfileName
find $dirname -type f  > $tempfile
cat $tempfile | sed 's_.*/__' | sort |  uniq -d|
while read fileName
do
 grep "$fileName" $tempfile
done
} | tee '/path/tj_var.txt' | awk -F"/" '{print $NF}'  | tee '/path/tj_var.txt' | sort -u | tee '/path/tj_mail.txt' | mail -s "Duplicate file found ${DATE}" abc@xyz.com

Это мой настоящий код

path = /marketsource/SrcFiles/Target_Shellscript_Autodownload/Airtime_Activation
printf "%s" "$(</marketsource/scripts/tj_mail.txt)" | while IFS= read -r filename; do
   mtime=$(stat -c %y "/path/$filename")
   printf 'Duplicate Filename - %s Uploaded time - %s\n' "$filename" "$mtime"
done | mail -s "Duplicate file found ${DATE}" tipalli@allegisgroup.com

 mtime=$(stat -c %y "/path/$filename" 2>/dev/null || echo "unknown (stat failed)")

это ошибка!

. / Tj_mail1.k sh: строка 1: путь: команда не найдена stat: невозможно stat `/ path / AirTimeActs_2020-02- 08.xlsx ': Нет такого файла или каталога

Немного больше !!

Моя цель - найти дубликаты файлов, если нет дубликатов файлов. и команда find пуста, затем выполните условие if, выполните команду mv и полностью выйдите из сценария, если они являются дублирующимися файлами, затем выйдите из условия if и передайте дубликаты файлов и выполните операцию печати по почте и дате.

    {
DATE=`date +"%Y-%m-%d"`
dirname=/marketsource/SrcFiles/Target_Shellscript_Autodownload/Airtime_Activation
tempfile=myTempfileName
find $dirname -type f  > $tempfile
cat $tempfile | sed 's_.*/__' | sort |  uniq -d|
while read fileName
do
 grep "$fileName" $tempfile
done
}
if ["$fileName" == ""]; then
         mv /marketsource/SrcFiles/Target_Shellscript_Autodownload/Airtime_Activation/*.xlsx /marketsource/SrcFiles/Target_Shellscript_Autodownload/Airtime_Activation/Archive

         mv /marketsource/SrcFiles/Target_Shellscript_Autodownload/Airtime_Activation/*.csv /marketsource/SrcFiles/Target_Shellscript_Autodownload/Airtime_Activation/Archive
        exit 1

fi | tee '/marketsource/scripts/tj_var.txt' | awk -F"/" '{print $NF}'  | tee '/marketsource/scripts/tj_var.txt' | sort -u | tee '/marketsource/scripts/tj_mail.txt'



DATE=`date +"%Y-%m-%d"`
printf "%s\n" "$(</marketsource/scripts/tj_mail.txt)" | while IFS= read -r filename; do
   mtime=$(stat -c %y "/marketsource/SrcFiles/Target_Shellscript_Autodownload/Airtime_Activation/$filename")
   printf  'Duplicate Filename - %s Uploaded time - %s\n\n' "$filename" "$mtime"
done | mail -s "Duplicate file found ${DATE}" ti@allegisgroup.com

1 Ответ

3 голосов
/ 02 марта 2020

Я предполагаю, что файл /path/test_mail.txt был подготовлен другим сценарием (в виде списка дубликатов файлов), и задача состоит в том, чтобы добавить время модификации файлов, перечисленных в /path/test_mail.txt, и отформатировать вывод, как показано на вопрос.

while IFS= read -r filename; do
   mtime=$(stat -c %y "/path/$filename") 
   printf 'Duplicate Filename - %s Uploaded time - %s\n' "$filename" "$mtime"
done < "/path/test_mail.txt"

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

somehow_print_duplicate_file_names | while IFS= read -r filename; do
   mtime=$(stat -c %y "/path/$filename") 
   printf 'Duplicate Filename - %s Uploaded time - %s\n' "$filename" "$mtime"
done | somehow_send_mail

Вы можете добавить некоторую обработку ошибок в случае сбоя stat .

   mtime=$(stat -c %y "/path/$filename" 2>/dev/null || echo "unknown (stat failed)")

или используйте сообщение об ошибке stat

   mtime=$(stat -c %y "/path/$filename" 2>&1)
...