我正在尝试将单个文件复制到树结构中的所有最深的子目录。想象一下它看起来像这样:
bar
dir1
| |
| +--dir2
| |
| +--dir3
| +--dir4
| |
| +--dir5
| +--dir6
| |
| +--dir7
我希望仅将“bar”复制到最深的子目录,如下所示:
bar
dir1
| +--dir2
| |
| +--dir3
| |
| +-- bar
| +--dir4
| |
| +--dir5
| |
| +-- bar
| +--dir6
| |
| +--dir7
| |
| +-- bar
我不知道如何解决这个问题,因为文件有时会出现在中间目录中,但我找不到一种方法来定位最深的子目录。
编辑:我尝试解决这个问题。由于某种原因,这会不一致地复制到所有目录,而不仅仅是最深层的目录。
find . -exec cp -r bar {} \; -type d -links 2
答案1
解决方案:在包含 的目录上bar
,
find . -type d -links 2 -exec cp bar {} \;
你最初的尝试
find . -exec cp -r bar {} \; -type d -links 2
不包含语法错误,但行为不符合您的预期。因为-exec
位于-type
和-links
过滤器之前,所以过滤器永远不会应用并exec
获取当前目录下(并包括)的所有内容,不仅是常规文件,还包括目录。如果您不相信,请检查输出
find . -exec echo X{}X \; -type d -links 2 -exec echo Y{}Y \;
您将看到两个文件之间列出了所有文件X
,但仅列出了dir{3,5,7}
两个文件之间的正确文件Y
。这就解释了为什么bar
也会出现在中间目录中。
此外,该-r
选项还会激活递归副本。由于复制的是常规文件 ( bar
),-r
因此不需要。
答案2
您可以使用:
find . -type d -links 2 -exec cp file {} \;
它会找到具有 2 个硬链接的目录,然后将文件复制到该特定目录。