在另一个文件夹中创建相同的子文件夹


8

我有一个foo带有子目录的目录。我希望在另一个目录中创建相同的子目录名称,而不复制其内容。我该怎么做呢?

有没有办法将ls输出作为大括号扩展列表?

Answers:


11

尝试这个,

cd /source/dir/path
find . -type d -exec mkdir -p -- /destination/directory/{} \;
  • . -type d 以递归方式列出当前路径中的目录。
  • mkdir -p -- /destination/directory/{} 在目标位置创建目录。

这依赖于find支持{}在参数词中间扩展的a 。


6
如果顶级中的任何文件或文件夹名称都以破折号开头,则可能会中断。它还会省略以点开头的目录。最后,请注意,并非每种实现都find支持将插值{}到另一个字符串中。
roaima

1
而且它不是很可扩展-如果有数百万个目录,则将花费大量时间。
Arkadiusz Drabczyk

6
如果有很多东西/source/dir/path,那么这可能会失败,一个“参数列表太长”错误当shell试图调用find与扩张*。最好只是.在那里使用。而且,即使与另一个字符串连接在一起,大多数find实现也允许{}使用,但这不是通用的。
库沙兰南达

1
在这种情况下,可以使用.代替*。(将xarg用于性能和安全性可能需要外部脚本进行路径串联)
eckes

24

使用rsync

rsync -a --include='*/' --exclude='*' /some/path/dir/ dir

这将在不复制任何文件的情况下在当前目录中重新创建/some/path/diras 的目录结构dir

由于包含模式,在源路径中遇到的任何目录都将在目标位置创建,但其他任何内容都将被排除。作为使用-a--archive)的副作用,您将在目标中的所有子目录上获得与源中相同的时间戳。这也适用于从远程目录创建本地目录结构(反之亦然)。


答案几乎总是如此rsync
Arronical

8

您可以find用来遍历源结构并调用mkdir它遇到的每个目录。

此示例使用find,将目录结构从复制foo/tmp/another/

( cd foo && find -type d -exec sh -c 'for d do mkdir -p "/tmp/another/$d"; done' sh {} + )

exec环路建立了一套目录下foo,然后将其传递给mkdir。如果您没有该版本的find说明+,则可以\;以提高效率为代价来使用。替换mkdirecho mkdir,看看会发生什么,没有实际去做。


1
还是有明显的循环,... -exec sh -c 'for dirpath do mkdir -p "/some/path/$dirpath"; done' sh {} +
库萨兰南达

与GNU find完全一样(4.7.0-git),这似乎不起作用:(尽管find: In ‘-exec ... {} +’ the ‘{}’ must appear by itself, but you specified ‘/tmp/another/{}’它确实适用-exec ... \;
ilkkachu19年

Kusalananda,即兴表演,谢谢
roaima

我确定我已经测试过Ilkkachu,/path/to/{}但是现在找不到能正常工作的任何版本,因此我调整了解决方案。谢谢
roaima

3

使用bash shell,您可以使用以下globstar选项要求它扩展每个目录:

shopt -s globstar

然后使用循环复制目录:

for dir in **/
do
  mkdir -p /path/to/dest/"$dir"
done

...或者如果您认为它们都适合于致电mkdir

set -- **/
mkdir -- "${@/#//path/to/dest/}"

这是bash数组的语法,它表示:“获取$@数组的每个元素,并用替换每个元素的开头/path/to/dest/

我不知道一种ls直接输出为大括号扩展列表的方法。如果尝试将**/扩展的输出压缩为大括号扩展,则需要注意以下几点:

  • 转义输出中的任何逗号
  • 转义任何{${序列
  • 确保结果字符串未超出可用的命令行参数空间

我不推荐它。


2

问题是/superuser/1389580/copy-directory-structure-only-at-year-end的跨站点副本

这种任务是以下情况的经典用例mtree

$ mkdir new-tree
$ mtree -cp old-tree | mtree -tdUp new-tree
.:      modification time (Tue Sep 24 14:27:07 2019, Tue Sep 24 16:34:57 2019, modified)
./bar missing (created)
./bar/bar2 missing (created)
./bar/bar2/bar3 missing (created)
./bar/bar2/bar3/bar4 missing (created)
./foo missing (created)
./foo/foo2 missing (created)
./foo/foo2/foo3 missing (created)

上面创建的目录下new-tree存在的所有目录old-treemtree但是,不会在新创建的目录上设置时间戳,因此生成的树如下所示:

$ find old-tree new-tree -ls
 20147  1 drwx--x---   4 jim   jim   5 Sep 24 14:27 old-tree
 20048  1 drwx--x---   3 jim   jim   4 Sep 24 14:27 old-tree/foo
 20363  1 -rw-------   1 jim   jim   0 Sep 24 14:27 old-tree/foo/file
 20073  1 drwx--x---   3 jim   jim   4 Sep 24 14:27 old-tree/foo/foo2
 20074  1 drwx--x---   2 jim   jim   3 Sep 24 14:27 old-tree/foo/foo2/foo3
 20365  1 -rw-------   1 jim   jim   0 Sep 24 14:27 old-tree/foo/foo2/foo3/file
 20364  1 -rw-------   1 jim   jim   0 Sep 24 14:27 old-tree/foo/foo2/file
 20051  1 drwx--x---   3 jim   jim   4 Sep 24 14:27 old-tree/bar
 20077  1 drwx--x---   3 jim   jim   4 Sep 24 14:27 old-tree/bar/bar2
 20368  1 -rw-------   1 jim   jim   0 Sep 24 14:27 old-tree/bar/bar2/file
 20078  1 drwx--x---   3 jim   jim   4 Sep 24 14:27 old-tree/bar/bar2/bar3
 20369  1 -rw-------   1 jim   jim   0 Sep 24 14:27 old-tree/bar/bar2/bar3/file
 20079  1 drwx--x---   2 jim   jim   3 Sep 24 14:27 old-tree/bar/bar2/bar3/bar4
 20370  1 -rw-------   1 jim   jim   0 Sep 24 14:27 old-tree/bar/bar2/bar3/bar4/file
 20366  1 -rw-------   1 jim   jim   0 Sep 24 14:27 old-tree/bar/file
 20362  1 -rw-------   1 jim   jim   0 Sep 24 14:27 old-tree/file
134489  1 drwx--x---   4 jim   jim   4 Sep 24 16:34 new-tree
134490  1 drwx--x---   3 jim   jim   3 Sep 24 16:34 new-tree/bar
134491  1 drwx--x---   3 jim   jim   3 Sep 24 16:34 new-tree/bar/bar2
134492  1 drwx--x---   3 jim   jim   3 Sep 24 16:34 new-tree/bar/bar2/bar3
134493  1 drwx--x---   2 jim   jim   2 Sep 24 16:34 new-tree/bar/bar2/bar3/bar4
134494  1 drwx--x---   3 jim   jim   3 Sep 24 16:34 new-tree/foo
134495  1 drwx--x---   3 jim   jim   3 Sep 24 16:34 new-tree/foo/foo2
134496  1 drwx--x---   2 jim   jim   2 Sep 24 16:34 new-tree/foo/foo2/foo3

如果您希望new-tree时间戳与中的时间戳匹配old-tree,则只需mtree再次运行即可。由于目录已经存在,mtree将修改时间戳以匹配源规范:

$ mtree -cp old-tree | mtree -tdUp new-tree
.:      modification time (Tue Sep 24 14:27:07 2019, Tue Sep 24 16:34:57 2019, modified)
bar:    modification time (Tue Sep 24 14:27:07 2019, Tue Sep 24 16:34:57 2019, modified)
bar/bar2: 
        modification time (Tue Sep 24 14:27:07 2019, Tue Sep 24 16:34:57 2019, modified)
bar/bar2/bar3: 
        modification time (Tue Sep 24 14:27:07 2019, Tue Sep 24 16:34:57 2019, modified)
bar/bar2/bar3/bar4: 
        modification time (Tue Sep 24 14:27:07 2019, Tue Sep 24 16:34:57 2019, modified)
foo:    modification time (Tue Sep 24 14:27:07 2019, Tue Sep 24 16:34:57 2019, modified)
foo/foo2: 
        modification time (Tue Sep 24 14:27:07 2019, Tue Sep 24 16:34:57 2019, modified)
foo/foo2/foo3: 
        modification time (Tue Sep 24 14:27:07 2019, Tue Sep 24 16:34:57 2019, modified)
$ find old-tree new-tree -ls
 20147  1 drwx--x---   4 jim   jim   5 Sep 24 14:27 old-tree
 20048  1 drwx--x---   3 jim   jim   4 Sep 24 14:27 old-tree/foo
 20363  1 -rw-------   1 jim   jim   0 Sep 24 14:27 old-tree/foo/file
 20073  1 drwx--x---   3 jim   jim   4 Sep 24 14:27 old-tree/foo/foo2
 20074  1 drwx--x---   2 jim   jim   3 Sep 24 14:27 old-tree/foo/foo2/foo3
 20365  1 -rw-------   1 jim   jim   0 Sep 24 14:27 old-tree/foo/foo2/foo3/file
 20364  1 -rw-------   1 jim   jim   0 Sep 24 14:27 old-tree/foo/foo2/file
 20051  1 drwx--x---   3 jim   jim   4 Sep 24 14:27 old-tree/bar
 20077  1 drwx--x---   3 jim   jim   4 Sep 24 14:27 old-tree/bar/bar2
 20368  1 -rw-------   1 jim   jim   0 Sep 24 14:27 old-tree/bar/bar2/file
 20078  1 drwx--x---   3 jim   jim   4 Sep 24 14:27 old-tree/bar/bar2/bar3
 20369  1 -rw-------   1 jim   jim   0 Sep 24 14:27 old-tree/bar/bar2/bar3/file
 20079  1 drwx--x---   2 jim   jim   3 Sep 24 14:27 old-tree/bar/bar2/bar3/bar4
 20370  1 -rw-------   1 jim   jim   0 Sep 24 14:27 old-tree/bar/bar2/bar3/bar4/file
 20366  1 -rw-------   1 jim   jim   0 Sep 24 14:27 old-tree/bar/file
 20362  1 -rw-------   1 jim   jim   0 Sep 24 14:27 old-tree/file
134489  1 drwx--x---   4 jim   jim   4 Sep 24 14:27 new-tree
134490  1 drwx--x---   3 jim   jim   3 Sep 24 14:27 new-tree/bar
134491  1 drwx--x---   3 jim   jim   3 Sep 24 14:27 new-tree/bar/bar2
134492  1 drwx--x---   3 jim   jim   3 Sep 24 14:27 new-tree/bar/bar2/bar3
134493  1 drwx--x---   2 jim   jim   2 Sep 24 14:27 new-tree/bar/bar2/bar3/bar4
134494  1 drwx--x---   3 jim   jim   3 Sep 24 14:27 new-tree/foo
134495  1 drwx--x---   3 jim   jim   3 Sep 24 14:27 new-tree/foo/foo2
134496  1 drwx--x---   2 jim   jim   2 Sep 24 14:27 new-tree/foo/foo2/foo3
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.