如何操作 find 命令来“查找”“找到”文件所在的目录?

use*_*352 5 files rsync find directory timestamp

所以我试图使用该find命令来查找我系统中的所有文件mtime -x。它会这样做,但它不会“找到”文件的目录。

find . -mtime -2 -exec rsync -av {} /destination/ \;

我想如果可以的话,我是否可以将所有目录都带入它们中,所以我尝试过:

rsync -a -f"+ */" -f"- *" source/ destination/

这对于引入目录树很有用,但是当我尝试将文件拉入其中时,它们不会进入单独的目录,它们只是溢出到我将它们复制到的主目录中。

有什么想法可以让我获得find查找目录的命令或解决此问题的另一种方法吗?

Dub*_*ubu 7

这个命令行有两个问题:

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),并为他们每个人:执行(-execrsync,复制与给定名称的文件({})到/destination/,保留大多数属性(-a)给出详细输出 ( -v) 并在目标 ( -R)处重现整个路径。