havakok Asked: 2019-09-24 03:01:04 +0800 CST2019-09-24 03:01:04 +0800 CST 2019-09-24 03:01:04 +0800 CST 在另一个文件夹中创建相同的子文件夹 772 我有一个foo带有子目录的目录。我希望在另一个目录中创建相同的子目录名称而不复制它们的内容。我该怎么做呢? 有没有办法将ls输出作为大括号扩展列表? mkdir 5 个回答 Voted Kusalananda 2019-09-24T03:23:41+08:002019-09-24T03:23:41+08:00 使用rsync: rsync -a --include='*/' --exclude='*' /some/path/dir/ dir 这将在当前目录中重新创建/some/path/diras的目录结构dir,而无需复制任何文件。 由于包含模式,源路径中遇到的任何目录都将在目标中创建,但其他任何目录都将被排除。-a作为使用( )的副作用--archive,您将在目标中的所有子目录上获得与源中相同的时间戳。这也适用于从远程目录创建本地目录结构(反之亦然)。 Best Answer Siva 2019-09-24T03:15:58+08:002019-09-24T03:15:58+08:00 尝试这个, cd /source/dir/path find . -type d -exec mkdir -p -- /destination/directory/{} \; . -type d以递归方式列出当前路径中的目录。 mkdir -p -- /destination/directory/{}在目的地创建目录。 这依赖于find支持{}在参数词中间扩展的 a。 roaima 2019-09-24T03:16:33+08:002019-09-24T03:16:33+08:00 您可以使用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理解的版本,+则可以\;以效率为代价使用。替换mkdir以echo mkdir查看不实际执行会发生什么。 Jeff Schaller 2019-09-24T11:57:19+08:002019-09-24T11:57:19+08:00 使用 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直接作为大括号扩展列表输出。如果您尝试将**/扩展的输出按摩到支撑扩展中,则需要注意: 转义输出中的任何逗号 转义任何{或${序列 确保生成的字符串不超过可用的命令行参数空间 我不会推荐它。 Jim L. 2019-09-25T13:35:36+08:002019-09-25T13:35:36+08:00 问题是https://superuser.com/questions/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-tree. mtree但是,不会在新创建的目录上设置时间戳,因此生成的树如下所示: $ 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
使用
rsync
:这将在当前目录中重新创建
/some/path/dir
as的目录结构dir
,而无需复制任何文件。由于包含模式,源路径中遇到的任何目录都将在目标中创建,但其他任何目录都将被排除。
-a
作为使用( )的副作用--archive
,您将在目标中的所有子目录上获得与源中相同的时间戳。这也适用于从远程目录创建本地目录结构(反之亦然)。尝试这个,
. -type d
以递归方式列出当前路径中的目录。mkdir -p -- /destination/directory/{}
在目的地创建目录。这依赖于
find
支持{}
在参数词中间扩展的 a。您可以使用
find
它遍历源结构并调用mkdir
它遇到的每个目录。这个例子,使用
find
,将你的目录结构从复制foo
到/tmp/another/
循环在下面
exec
建立一组目录foo
,然后将其传递给mkdir
. 如果您没有find
理解的版本,+
则可以\;
以效率为代价使用。替换mkdir
以echo mkdir
查看不实际执行会发生什么。使用 bash shell,您可以使用以下选项要求它扩展每个目录
globstar
:然后循环复制目录:
...或者如果您认为它们都适合一次调用
mkdir
:那是 bash 数组语法,它说:“取出
$@
数组的每个元素并将每个元素的开头替换为/path/to/dest/
.我不知道有一种方法可以
ls
直接作为大括号扩展列表输出。如果您尝试将**/
扩展的输出按摩到支撑扩展中,则需要注意:{
或${
序列我不会推荐它。
问题是https://superuser.com/questions/1389580/copy-directory-structure-only-at-year-end的跨站点副本
这种任务是一个典型的用例
mtree
:上面创建了所有目录下
new-tree
存在的old-tree
.mtree
但是,不会在新创建的目录上设置时间戳,因此生成的树如下所示:如果您希望
new-tree
时间戳与 中的时间戳匹配old-tree
,只需mtree
再次运行即可。由于目录已经存在,mtree
将修改时间戳以匹配源规范: