有趣的是,Linux 命令行工具在很多方面都比 Windows 命令行工具优越得多,但有一件事我还没有找到与之相当的:机器人复制。Robocopy 比 更加通用cp
,我不知道如何使用 Linux 工具来做我想做的事情。
一个特定的用例是,我有两个目录,其中的文件大多相似,但其中一个目录有较新的源文件,另一个目录有另一个目录没有的内容文件,并且可能还有较新的源文件(用于网站)。我想将后一个目录中的文件复制到前一个目录中,添加新的内容文件等,但不覆盖目标目录中的较新文件。
我花了大约半个小时尝试弄清楚如何在 Linux 中执行此操作,决定我可能必须学习 bash 脚本或其他东西才能完成我想要的操作,然后我意识到我可以使用 robocopy。我还有一些其他要求。我基本上是将 Python(Django)网站从 SVN 存储库转换为 Git 存储库,我想确保 SVN 中没有未提交的更改。但是,我想有条件地排除目录.svn
和.pyc
已编译的 Python 文件。以下 robocopy 命令正是我想要的:
robocopy source destination /XO /E /XD .svn /XF *.pyc
Linux 中是否有与 Robocopy 相当的东西?我简单研究了rsync
一下,但似乎我必须在尝试同步文件夹之前设置一个 rsync 服务器。
答案1
听起来 rsync 肯定是你想要的。你不需要设置“rsync 服务器”来将文件从一台机器复制到另一台机器。Rsync 支持通过 SFTP(SSH 文件传输)复制文件,大多数 Linux 机器已经启用了该功能(如果没有手动禁用)。
参见 Lifehacker 的使用 rsync 跨系统镜像文件更多细节:
无论您想备份数据、安全地分发文件还是通过互联网将工作文档从办公室镜像到家中、在本地网络上的计算机之间或从计算机镜像到 Web 服务器,rsync 都能完成这项工作。今天,我们将使用 rsync 通过命令行上的安全连接在 Mac 和 PC 之间镜像文件夹。
Rsync 是免费的(正如其名称所示)并且跨平台,这意味着它可以在操作系统(Windows/Cygwin、Mac OS、Linux)之间同步文件;它通过 ssh 工作,因此它是加密的并且是安全的;与 FTP 不同,它增加的,因此只有部分的已更改文件已传输,不是整个文件,这使得它像 Speedy Gonzalez 一样运行;而且它的命令行使得它可以编写脚本并轻松实现自动化。
答案2
rsync 会像 robocopy 一样将文件从一个目录复制到同一台机器上的另一个目录。以下是与 robocopy 命令等效的 rsync 命令:
rsync -auv --exclude '.svn' --exclude '*.pyc' source destination
这将递归地将源复制到目标并排除旧文件以及“ .svn”和“* .pyc”目录/文件。
答案3
如果您可以不排除.svn
目录和.pyc
文件,并且如果您的文件和目录名称都不包含空格,那么您可以cp
在 GNU/Linux 命令提示符下使用:
cp -uaT source destination
其中source
和destination
是目录。
- 该
-u
选项可确保只有 中的较新版本source
才会替换 中的现有文件destination
。请参阅https://superuser.com/a/341296。 - 该
-a
选项,又名“存档”,递归复制目录,source
同时保留时间戳和权限等。 - 该
-T
选项确保我们复制内容进入,而不是目录source
本身。directory
source
使用GNU 版本非常重要cp
,因为其中一些选项可能在其他 UNIX 版本(例如 macOS)中不同或不可用。
如果您的文件或目录名称中有空格,那么您可以rsync
像其他人提到的那样使用,或者使用 管道find
连接-print0
到xargs
with -0
,您可以查看,但超出了本答案的范围。 这两种可能性都允许排除。