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

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

因此,我尝试使用命令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-execrsync{}/destination/-a-v-R

相关内容