4

リモートのタイムスタンプがローカルと異なる場合にのみ、FTP サイトからファイルをプルする bash スクリプトに取り組んでいます。ファイルを配置した後、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は、残念ながらgetまたはputコマンドでタイムスタンプを保持する方法はありません。必要な場合は、別のツール ( scp -prsync -t...)を使用する必要があります。

于 2014-08-27T13:33:40.760 に答える