bash - wget -N, если еще проверить значение

Я работаю над сценарием bash, который извлекает файл с FTP-сайта, только если отметка времени на удаленном компьютере отличается от локальной. После того, как он помещает файл, он копирует файл на 3 других компьютера через samba (smbclient).

Все работает, но файл копируется, даже если wget -N ftp://insertsitehere.com возвращает значение, на котором находится файл. пульт был не новее. Как лучше всего проверить вывод скрипта, чтобы копирование происходило только в том случае, если с FTP была извлечена новая версия?

В идеале я хотел бы, чтобы копия на компьютеры сохраняла метку времени, как это делает команда wget -N.

Вот пример того, что у меня есть:

#!/bin/bash

OUTDIR=/cats/dogs

cd $OUTDIR
wget -N ftp://user:[email protected]/filename

if [ $? -eq 0 ]; then
   HOSTS="server1 server2 server3"
   for i in $HOSTS; do
      echo "Uploading to $i..."
      smbclient -A /root/.smbclient.authfile //$i/path -c "lcd /cats/dogs; put fiilename.txt"
      if [ $? -eq 0 ]; then
        echo "Upload to $i successful..."
      else
        echo "There was an issue uploading to host $i..."
      fi
   done
else
   echo "There was an issue with the FTP Download...."
   exit 1
fi

person jdeen    schedule 26.06.2014    source источник
comment
Выделите весь свой код с помощью мыши, затем щелкните инструмент {} (формат) в верхнем левом углу поля редактирования, чтобы сделать ваш код читабельным. На основе справочной страницы wget кажется, что это должно работать. Для отладки я бы ssh [email protected] '/bin/ls -l filename' раньше и подтвердил, что дата действительно старше текущей. Возможны ли проблемы с часовыми поясами? Вам нужно добавить X-часовое смещение между временными метками из разных систем? Хороший первый вопрос. Продолжайте публиковать и удачи.   -  person shellter    schedule 26.06.2014
comment
Временная метка работает из wget pull, но вторая часть скрипта для ее копирования на server1, server2 и serve3 происходит независимо от того, был ли файл загружен снова или нет. Это проблема. Кроме того, при копировании на каждый сервер не сохраняется отметка времени, правильная с помощью команды wget -N.   -  person jdeen    schedule 26.06.2014
comment
Извините, я должен был лечь спать несколько часов назад. Вы имеете в виду, что тест if [ $? -eq 0 ] возвращает true, хотя не должен? Это единственный способ вызвать smbclient, так что это должно быть правдой. Возможно, -eq 0 неправильный оператор, я использую if wget .... ; then для устранения таких проблем. У меня нет доступа к smbclient. Надеемся, просмотрев man smbclient, вы найдете вариант, подобный scp -p (сохранить права доступа к файлам (и временные метки). Удачи!   -  person shellter    schedule 26.06.2014
comment
Спасибо! Я буду смотреть дальше в этом. И да, если я повторю $? я получаю возвращаемое значение 0 несмотря ни на что. Похоже, он говорит об успехе, если файл загружается или нет (потому что он подчиняется переключателю -N). Я могу протестировать обновление до if then, но иметь какую-то проверку, чтобы сказать, не был ли файл загружен, а затем не копировать, если файл был загружен (потому что файл был новее), приступайте к копированию. (и сохранить временные метки)   -  person jdeen    schedule 26.06.2014
comment
Что ж, самым простым (не таким элегантным, как правильное значение в $?) может быть cd /tmp/working; wget ...; if [[ -f newFileVer ]] ; then smbclient ... ; etc ; и избавиться от файла в /tmp/working (или как вам нравится управлять рабочими файлами). Удачи.   -  person shellter    schedule 26.06.2014


Ответы (2)


Возвращаемое значение wget отличается от 0 только в случае ошибки. Если используется -N, а удаленный файл старше локального файла, он все равно будет иметь возвращаемое значение 0, поэтому вы не можете использовать его для проверки того, был ли файл изменен.

Вы можете проверить mtime файла, чтобы увидеть, изменился ли он или содержимое. Например, вы можете использовать что-то вроде:

md5_old=$( md5sum filename.txt 2>/dev/null )
wget -N ftp://user:[email protected]/filename.txt
md5_new=$( md5sum filename.txt )

if [ "$md5_old" != "$md5_new" ]; then
    # Copy filename.txt to SMB servers
fi

Что касается smbclient, к сожалению, нет возможности сохранить временные метки ни в командах get, ни в put. Если вам это нужно, вы должны использовать другой инструмент (scp -p, rsync -t...)

person Juan Cespedes    schedule 27.08.2014

touch -r foo.txt foo.old
wget -N example.com/foo.txt
if [ foo.txt -nt foo.old ]
then
  echo 'Uploading to server1...'
fi
  1. «Сохранить» текущую метку времени в новый пустой файл
  2. Используйте wget --timestamping для загрузки файла, только если он новее
  3. Если файл новее, чем файл «сохранить», сделайте что-нибудь
person Steven Penny    schedule 30.12.2014