因此,我尝试使用命令find
来查找系统中所有文件mtime -x
。它确实执行了此操作,但并未“找到”文件的目录。
find . -mtime -2 -exec rsync -av {} /destination/ \;
我想如果我可以将所有目录都带过来,那么我会尝试:
rsync -a -f"+ */" -f"- *" source/ destination/
这对于带来目录树很有吸引力,但是当我尝试将文件拉入其中时,它们不会进入单独的目录,而是溢出到我将它们复制到的主目录中。
有什么想法我可以如何让命令find
找到目录或者用其他方法解决这个问题?
答案1
此命令行有两个问题:
find . -mtime -2 -exec rsync -av {} /destination/ \;`
传输路径名
首先,当给出(单个)文件名rsync
而不是简单的目录时,必须明确告知使用整个路径,而不仅仅是目标文件名。为此,请使用选项-R
。从 rsync(1) 手册页:
-R,--相对 使用相对路径。这意味着在 命令行被发送到服务器,而不仅仅是最后部分 文件名。这在您想要发送 多个不同的目录。例如,如果您 使用这个命令: rsync -av /foo/bar/baz.c 远程:/tmp/ ...这将在远程机器的 /tmp/ 中创建一个名为 baz.c 的文件。 如果你使用 rsync -avR /foo/bar/baz.c 远程:/tmp/ 然后会在远程创建一个名为 /tmp/foo/bar/baz.c 的文件 机器,保留其完整路径。这些额外的路径元素是 称为“隐含目录”(即“foo”和“foo/bar” 目录 (如上例所示)。 [...]
然后,手册页继续介绍如何操作路径,以便只有部分内容将出现在接收端,但这超出了这里的范围。
仅搜索文件,不搜索目录
其次,find
如上调用不仅会报告文件,还会报告目录。当将目录名称指定rsync
为源时,它会将整个目录同步到目标。可以使用附加测试-type f
(“类型必须为文件”)来防止这种find
情况。但请注意,这不仅会排除目录,还会排除套接字、命名管道、块和字符设备以及符号链接。对于符号链接,您可以改用参数-xtype
,它将检查符号链接目标的类型。
解决方案
因此,修改后的命令行将如下所示:
find . -type f -mtime -2 -exec rsync -av -R {} /destination/ \;
这将对当前路径 ( ) 中在过去两天内修改过的find
所有文件 ( ) 执行 ( ) ,并对每个文件执行以下任一操作:执行 ( ) 、将具有给定名称的文件复制到、保留大部分属性 ( )、提供详细输出 ( ) 并在目标位置重现整个路径 ( )。-type f
.
-mtime -2
-exec
rsync
{}
/destination/
-a
-v
-R