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

Upload new and modified files in folder to server with Bash

我有一堆文件夹和文件:

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 文件夹,其中包含许多包含图像的子文件夹。这些图像将被删除和添加。它们不需要单独保存在一个文件夹中,我们可以将它们全部放入 1 个文件夹中。

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

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

假设您在本地主机上有一个名为 MyLocalFolder 的文件夹,并且在远程服务器上有一个名为 MyRemoteFolder 的副本,然后您更新了 MyLocalFolder 并且您需要保留内容MyRemoteFolder up-to-date 和 MyLocalFolder。我认为在这种情况下最好的选择是使用 rsync 和更新选项(修改或新文件)

rsync -avu /path/to/MyLocalFolder/. -e 'ssh -p ssh_port' user@remote_server_ip:/path/to/MyRemoteFolder

有关详细信息,请查看 rsync 命令的手册页

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

MyLocalFolder 包含: 文件1 文件2 文件3 文件4 文件5 文件7 文件8

MyRemoteFolder 包含: 文件 1 文件 2 文件 3 文件 4 文件 5 文件 6

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

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

diff MyLocalFolder MyRemoteFolder

这将为您提供以下输出 Only in MyLocalFolder: file7 Only in MyLocalFolder: file8 Only in MyRemoteFolder: file6 - 让我们生成一个列表,其中包含仅在 MyRemoteFolder

中的文件

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

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

rsync -avu --delete --exclude-from 'dont-remove-these-files.txt' MyLocalFolder/. MyRemoteFolder

以上命令将只传输修改过的文件和新文件,忽略任何删除的文件。

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

以备不时之需。您可以再次使用该列表来备份远程文件夹中已删除的文件,方法是将它们移动到另一个文件夹或其他内容。

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