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
- "Сохранить" текущую метку времени в новый пустой файл
- использование
wget --timestamping
скачивать файл только если он новее - Если файл новее, чем "сохранить", сделайте что-нибудь