使用Bash将文件夹中的新文件和已修改文件上载到服务器

时间:2016-01-12 16:24:05

标签: bash shell ssh ftp scp

我有一堆文件夹和文件:

file1.txt
file2.db
file3.csv
Images/AA/BB/ABCDEFEFERFERGE/img_201553.jpg
Images/DD/CC/DFGDGDSGSFGDSGD/img_345213.jpg
Images/FF/EE/DFGSGGDSFGERERW/img_342311.jpg

大约有3个文件(+ -1)会变得更长或更小,因为它们经常被修改。然后有一个Images文件夹,其中包含许多包含图像的子文件夹。这些图像将被删除并添加。它们不需要保存在单个文件夹中,我们可以将它们全部放在一个文件夹中。

每小时,我想运行一个cron作业,它将使用bash脚本将所有这些复制到我的FTP服务器。如果有新图像,请发送。如果2-4个文件发生变化,请发送它们并重命名它们(可能是按日期时间)。

我们可以使用FTP / SSH / SCP / SFTP。我没有偏好。

1 个答案:

答案 0 :(得分:0)

假设您的本地主机上有一个名为MyLocalFolder的文件夹,并且在远程服务器上有一个名为MyRemoteFolder的副本,那么您已更新MyLocalFolder,并且您需要保留{的内容{1}}与MyRemoteFolder保持同步。我认为在这种情况下最好的选择是使用MyLocalFolder并选择更新(修改或新文件)

rsync

有关更多信息,请查看rsync -avu /path/to/MyLocalFolder/. -e 'ssh -p ssh_port' user@remote_server_ip:/path/to/MyRemoteFolder命令

的手册页

编辑:如果您需要更新远程文件夹而不删除从本地删除的文件,您可以按照此示例(并首先尝试以确保其按预期工作)

MyLocalFolder包含: file1 file2 file3 file4 file5 file7 file8

MyRemoteFolder包含: file1 file2 file3 file4 file5 file6

为了在不删除file6的情况下使用新更改更新MyRemoteFolder:

  • 第一个列表使用以下命令生成MyRemoteFolder上存在的文件列表,而不是MylocalFolder中的文件列表:

rsync

这会给你以下输出 diff MyLocalFolder MyRemoteFolder - 让我们生成一个包含仅在 Only in MyLocalFolder: file7 Only in MyLocalFolder: file8 Only in MyRemoteFolder: file6

中的文件的列表

MyRemoteFolder

  • 将该列表传递给rsync,使其忽略已删除的文件:

diff MyLocalFolder MyRemoteFolder | grep 'MyRemoteFolder' | awk '{print $4}' > dont-remove-these-files.txt

上述命令仅传输已修改的文件和新文件,并忽略任何删除文件。

我只在本地计算机上测试了这些步骤并且它正常工作。但我没有机会尝试使用远程服务器。以下网址有关于How to use diff through ssh的问题,然后将所有必要步骤添加到bash脚本并使用cron运行。

如果您需要备份。您可以再次使用该列表从远程文件夹备份已删除的文件,也可以将它们移动到另一个文件夹或其他内容。

我希望这个答案足以满足您的需求。