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

hav*_*kok 10 mkdir

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

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

Kus*_*nda 24

使用rsync

rsync -a --include='*/' --exclude='*' /some/path/dir/ dir
Run Code Online (Sandbox Code Playgroud)

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

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


Siv*_*iva 13

尝试这个,

cd /source/dir/path
find . -type d -exec mkdir -p -- /destination/directory/{} \;
Run Code Online (Sandbox Code Playgroud)
  • . -type d 递归列出当前路径中的目录。
  • mkdir -p -- /destination/directory/{} 在目的地创建目录。

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

  • 如果顶级中的任何文件或文件夹名称以破折号开头,这可能会中断。它还省略了以点开头的目录。最后,请注意,并非所有 `find` 的实现都支持将 `{}` 插入到另一个字符串中。 (6认同)
  • 如果 `/source/dir/path` 中有很多 _things_,那么当 shell 尝试调用带有 `*` 扩展的 `find` 时,这可能会失败并出现“参数列表太长”错误。最好只在那里使用`.`。此外,即使在与另一个字符串连接时,大多数 `find` 实现也允许使用 `{}`,但它不是通用的。 (6认同)

roa*_*ima 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 {} + )
Run Code Online (Sandbox Code Playgroud)

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