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:password@sitegoeshere.com/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

2 ответа

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

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

md5_old=$( md5sum filename.txt 2>/dev/null )
wget -N ftp://user:password@sitegoeshere.com/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...)

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. Если файл новее, чем "сохранить", сделайте что-нибудь
Другие вопросы по тегам