AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 543195
Accepted
havakok
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 5 个回答
  • 3726 Views

5 个回答

  • Voted
  1. 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,您将在目标中的所有子目录上获得与源中相同的时间戳。这也适用于从远程目录创建本地目录结构(反之亦然)。

    • 24
  2. 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。

    • 13
  3. 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查看不实际执行会发生什么。

    • 8
  4. 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直接作为大括号扩展列表输出。如果您尝试将**/扩展的输出按摩到支撑扩展中,则需要注意:

    • 转义输出中的任何逗号
    • 转义任何{或${序列
    • 确保生成的字符串不超过可用的命令行参数空间

    我不会推荐它。

    • 4
  5. 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
    
    • 2

相关问题

  • 如何在 Ranger 中创建多个目录?

  • 在不存在的子目录中创建文件 (../new_folder/new_folder/new_file.ext)

  • 单个“mkdir”命令创建一个新目录并同时更改到该目录?[复制]

  • 使用 mktemp -d 或 mkdir 创建的目录之间是否存在编程差异?

  • 如何将文件夹移动到自身中?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve