通过 cronjob 将 mp3 文件从远程服务器传输到 RPi 而不覆盖

通过 cronjob 将 mp3 文件从远程服务器传输到 RPi 而不覆盖

我成功通过 ftp 将文件夹中的所有文件从远程服务器传输到树莓派,但我只想传输新文件。下面是我的工作脚本。

#!/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/7 或执行其他特定的 cron 作业,具体取决于客户端。树莓派是代替计算机实现这一点的好方法。我知道有效的方法是每个文件夹一个 cron 作业。每个文件夹都有一种音乐类型。因此,我会不时在服务器中放入不同的音乐,并且 cron 作业将每周传输一次这些文件。它被设置为将该文件夹中的每个 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

这将连接到remoteHostas remoteUserusing remotePassword,然后执行 ( -e) 命令mirror以同步remoteDirlocalDirbefore exiting。

手册页: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

相关内容