3

初めてシェルスクリプトを書いているのですが、最新の作成ファイルをFTPからダウンロードしたいです。特定のフォルダの最新ファイルをダウンロードしたい。以下はそのための私のコードです。ただし、最新のファイルではなく、フォルダーのすべてのファイルをダウンロードしています。

ftp -in ftp.abc.com << SCRIPTEND
user xyz xyz
binary
cd Rpts/
mget ls -t -r | tail -n 1
quit
SCRIPTEND

これで私を助けてください。

4

3 に答える 3

1

代わりに wget または lftp ユーティリティを使用してみてください。ファイルの時刻/日付を比較し、AFAIR の目的は ftp スクリプトです。可能であれば ssh/rsync に切り替えてください。ここで rsync の代わりに lftp について少し読むことができます。

https://serverfault.com/questions/24622/how-to-use-rsync-over-ftp

おそらく最も簡単な方法は、サーバー側の最後のバージョンを「現在」にリンクし、常にファイルを指すようにすることです。サーバーの管理者でない場合は、すべてのファイルを日付/時刻で一覧表示し、情報を取得して解析し、どれが最新かを判断する必要があります。その間にサーバーの状態が変化する可能性があり、さらに多くのことがわかります。価値があるよりも複雑なソリューション。

ポイントは、「ls」は何らかの方法で出力をソートし、時間はデフォルトではない可能性があるということです。たとえば、変更時間に基づいて並べ替えるスイッチがありますが、サーバーが ls -t で OK で応答した場合でも、並べ替えが本当にサポートされているかどうかはわかりません。すべてのスイッチを無視して、常に同じリストを返すことができます。そのためです。管理者は通常、「現在の」リンク (ln -s) を使用します。「現在」がない場合は、正しいファイルがあることを確認するために、とにかくリストを解析する必要があります( ls -al )。

http://www.catb.org/esr/writings/unix-koans/shell-tools.html

于 2012-09-18T09:27:36.590 に答える
1

私の解決策はこれです:

curl 'ftp://server.de/dir/'$(curl 'ftp://server.de/dir/' 2>/dev/null | tail -1 | awk '{print $(NF)}')
于 2014-10-10T07:34:13.353 に答える
1

コードを見ると、行

mget ls -t -r | tail -n 1

あなたが思うようにはしません。実際には のすべての出力を取得してから、 の出力をls -t処理tailしますmget。この行を次のように置き換えることができます

mget $(ls -t -r | tail -n 1)

しかし、ftpそのような呼び出しをサポートするかどうかはわかりません...

以外の FTP クライアントを使用してみてくださいftp。たとえば、curlftpfs.sourceforge.netcurlftpfsで入手できるのは、ローカル フォルダーであるかのように FTP をディレクトリにマウントし、そこにあるファイルに対してさまざまなコマンド (find、grep などを含む) を実行できるため、適切な候補です。 . この記事を見てください

このように、出力はローカル コマンドから取得されるためls -t、適切に並べ替えられたリストが返されることがより確実になります。

ところで、使用するのは少し複雑ではありませls -t | head -1ls -t -r | tail -1。それらは同じ結果を生成しますが、頭だけをつかむことができるのに、なぜ逆にして尻尾からつかむのですか:)

curlftpfs を使用する場合、スクリプトは次のようになります (サーバー ftp.abc.com とユーザー xyz とパスワード xyz を想定)。

mkdir /tmp/ftpsession
curlftpfs ftp://xyz:xyz@ftp.abc.com /tmp/ftpsession
cd /tmp/ftpsession/Rpts
cp -Rpf $(ls -t | head -1) /your/destination/folder/or/file
cd -
umount /tmp/ftpsession
于 2012-09-18T11:17:17.957 に答える