使用 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 运行 它。
以备不时之需。您可以再次使用该列表来备份远程文件夹中已删除的文件,方法是将它们移动到另一个文件夹或其他内容。
我希望这个答案足以满足您的需求。
我有一堆文件夹和文件:
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 运行 它。
以备不时之需。您可以再次使用该列表来备份远程文件夹中已删除的文件,方法是将它们移动到另一个文件夹或其他内容。
我希望这个答案足以满足您的需求。