上書きせずにcronjobを介してリモートサーバーからRPiにmp3ファイルを転送する

上書きせずにcronjobを介してリモートサーバーからRPiにmp3ファイルを転送する

FTP経由でフォルダ内のすべてのファイルをリモートサーバーからRaspberry Piに正常に転送しましたが、新しいファイルのみを転送したいと思います。以下は私の作業スクリプトです。

#!/bin/bash -vx
ftp -in IP_SERVER<<END_SCRIPT
quote USER rem_user
quote PASS rem_pass
bin
prompt:off
cd /path_to_server_files
lcd /path_to_local_files
mget *.mp3
bye
END_SCRIPT

他の会社にバックグラウンドミュージックを提供する会社があります。私のアプローチは、クライアントに応じて各システムを年中無休で24時間実行するか、他の特定のcronタスクを実行させることです。 Raspberry Piは、コンピュータの代わりにこれを行うのに最適な方法です。私が知っているのは、フォルダごとに1つのクローン操作です。各フォルダには音楽ジャンルがあります。だから時々、サーバーに別の音楽を置き、クローン操作を介して週に一度、これらのファイルを転送します。そのフォルダ内のすべてのmp3ファイルをRPiに転送するように設定されています。問題は、すでに存在するファイルを含むすべてのファイルをそこに転送することです。たとえば、そこに150の音楽ファイルを入れると、RPi ARMはそれほど強力ではないため、すべてのフォルダが完了したことは言うまでもなく、そのファイルを転送するのに長い時間がかかります。回避策は、既存のファイルを上書きするのではなく、新しいファイルを上書きすることです。その後、しばらくすると、他のcronジョブは*日より古いすべてのファイルを削除します。

検索してみましたが、ftpにはまだそのようなオプションがないようです。そのため、上書きせずに転送できるwgetコマンドを見つけましたが、複数のファイルを転送することはできません。私はwgetコマンドを使用して上記のスクリプトを変換しようとしましたが、成功しませんでした。この分野で経験のある人が助けることができますか? httpの問題かもしれません。よろしくお願いします。

wgetコマンドを使ってみました。

* * * * * wget -r -l1 -N -A.mp3 'ftp://serverUser:Password@serverIP/path_to_server_files' /var/www/rd/musica/teste/ftp11.log 2>&1

間違い:

ftp://serverUser:Password@serverIP/path_to_server_files: Bad Port Number

/var/www/rd/musica/teste: Scheme Missing

rsyncに対する私の試みは次のとおりです。

rsyncd.conf:(すべての資格情報が正しいかどうかわからないので、変更できるように各ファイルをここに配置します。)

lock file = /var/run/rsync.lock
lock file = /var/log/rsyncd.log
pid file = /var/run/rsync.pid

[documents]
  path = /var/www/rd/musica/teste
  comment = The documents folder of localusername
  uid = localusername
  gid = localusername
  read only = no
  list = yes
  auth users = serverusername
  secrets file =/etc/rsync.secrets
  hosts allow = serverIP/255.255.255.0

rsyncd.secrets

localuser:password
serveruser:password

rsync コマンドを実行します。

rsync -rtv serverusername@serverIP::documents/path_to_server_files/*.mp3 /path_to_local_destination_folder

次のエラーを返します。

rsync: failed to connect to serverIP (serverIP): Connection refused (111)
rsync error: error in socket IO (code 10) at clientserver.c(122) [Receiver=3.0.9]

答え1

見たことがありますか?同期?あなたの質問を私が解釈した方法で見ると、これはあなたが望むものと正確に一致するはずです。する方法の説明ですrsyncデーモンの設定SSH接続は必要ありません。

答え2

あなたはソースFTPに「古い」ファイルをアーカイブしていませんか?この場合、ローカルディレクトリを更新/同期するための完全なツールには、次のコマンドがlftpあります。mirror

lftp -e 'mirror remoteDir localDir;exit' -u 'remoteUser:remotePassword' remoteHost

ingの前に同期するには、実行()コマンドを使用remoteHostして接続します。remoteUserremotePassword-emirrorremoteDirlocalDirexit

マニュアルページ:http://lftp.yar.ru/lftp-man.html

lftpは、すべてのRPiディストリビューションのパッケージストアで利用可能である必要があります。以前はArchLinuxを実行しているRPiで直接使用したことがあります。

答え3

解決策 - このスクリプトが機能するようにしました。すべてのサポートに感謝します。この問題を把握するのに十分な時間がある場合は、引き続き別のオプションを試してみてください。

#!/usr/bin/python
import os
from ftplib import FTP

local_path='/path_to_local_files/'
os.chdir(local_path)
ftp = FTP(host='server_name_or_IP',user='username', passwd='password')
ftp.cwd('/path_to_local_files/')
f_list = ftp.nlst()
for f in f_list:
if not f.endswith("mp3"):
  continue
new_f_name = local_path + f
if os.path.exists(new_f_name):
  continue
print("Copying remote file <{0}>to local file <{1}>".format(f,new_f_name))
ftp.retrbinary('RETR '+ f, open(new_f_name,'wb').write)

スクリプトが機能するには、それをインストールする必要があります。

sudo apt-get install python-dev

関連情報