4

我正在研究一个 bash 脚本,该脚本仅在远程时间戳与本地时间戳不同时才从 FTP 站点提取文件。放置文件后,它通过 samba (smbclient) 将文件复制到其他 3 台计算机。

一切正常,但即使 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
4

2 回答 2

3

的返回值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,不幸的是,没有办法在getput命令中保留时间戳。如果你需要它,你必须使用一些不同的工具(scp -prsync -t...)

于 2014-08-27T13:33:40.760 回答
1
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. 如果文件比“保存”文件新,做一些事情
于 2014-12-30T05:47:01.057 回答