递归地将文件复制到所有最深的子目录

递归地将文件复制到所有最深的子目录

我正在尝试将单个文件复制到树结构中的所有最深的子目录。想象一下它看起来像这样:

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 个硬链接的目录,然后将文件复制到该特定目录。

相关内容