从一个位置复制文件夹结构(不包括文件)到另一个位置

143

我想创建一个我们多 TB 文件服务器的结构克隆。我知道 cp --parents 命令可以移动一个文件及其父目录,但有没有办法完整复制目录结构?

我想要复制到一个 Linux 系统,而我们的文件服务器是通过 CIFS 挂载在那里的。


3
可能是Rsync如何包含目录但不包含文件?的重复问题。 - Trevor Boyd Smith
上面评论中提到的rsync解决方案看起来更整洁。 - Y. E.
18个回答

231

你可以这样做:

find . -type d > dirs.txt
创建目录列表,然后。
xargs mkdir -p < dirs.txt
在目标位置创建目录。

15
如果您的目录名称中有空格,则这些解决方案将无法工作。 - Jealie
47
将命令更改为“find . -type d -print0 >dirs.txt”和“xargs -0 mkdir -p <dirs.txt”。这将使两个命令都使用空字符作为分隔符,而不是空格。 - user1207177
6
当你处理数百或数千条命令时,xargs 可能会超出系统的最大命令长度,因此使用时应谨慎。(可以使用 getconf ARG_MAX 命令查找命令长度限制) 如果有许多目录,则可能需要编写脚本来循环处理输出。 - palswim
3
权限和属性会被保留吗? - Ashish Karpe
4
谢谢您的评论。原问题没有提及需要保留权限、所有权或属性。如果需要这样做,就需要像您所提到的那样使用不同的解决方案,但以上内容已足以回答所提出的问题。 - Greg Hewgill
显示剩余6条评论

101
cd /path/to/directories &&
find . -type d -exec mkdir -p -- /path/to/backup/{} \;

4
我给出的是最佳答案。否则,您可以尝试 Chen Levy 在此 SO 问题中提供的 rsync 解决方案。 - Mat M
3
-- mkdir 的选项是什么意思? - Bruce_Warrior
12
--是GNU标准工具选项终止符,意思是“嘿,mkdir,在这之后的任何参数都不是标志,所以把它们当作文件参数处理,即使它以 '-' 字符开头。” - amphetamachine
5
这个答案也没有保留目录的权限和属性。使用rsync可以保留权限和属性 - Trevor Boyd Smith

62

20
使用rsync命令将源目录的内容同步到目标目录,保持两个目录结构一致,并忽略源目录中的所有文件,只同步子目录。命令如下:rsync -a --include '*/' --exclude '*' "$source" "$target" - Sylvain
3
这个解决方案存在的问题是:我的文件夹包含成千上万的文件,rsync 同步几十个文件夹就需要很长时间。 - Christopher K.
1
很好!我在使用时递归地用了-r选项。根据我的经验,rsync在不涉及网络文件系统时速度很快。在那种情况下最好使用它的内置ssh功能。 - Hauke

14

1行解决方案:

find . -type d -exec mkdir -p /path/to/copy/directory/tree/{} \;

2
这个很好用,而且很聪明。有一个细节需要注意,你必须在 $source 目录下运行,以确保你的新目录相对于 $target 目录。但这不再是一行命令了。使用:pushd $source; find . -type d -exec mkdir -p "$target"/{} \; popd - will

10

我不知道你是否正在寻找Linux解决方案。如果是的话,你可以尝试这个:

$ mkdir destdir
$ cd sourcedir
$ find . -type d | cpio -pdvm destdir

cpio 对我似乎不起作用,至少使用你指定的参数无效。 - r00fus
@r00fus - 请阅读 cpio 的手册或参考 http://www.gnu.org/software/cpio/。 - zerodin
请问一下,-pdvm 参数是做什么用的?我尝试了 man cpio 命令但没有找到相关信息。 - Anuj Sharma

8

这将复制目录和文件的属性,但不包括文件数据:

cp -R --attributes-only SOURCE DEST

如果您不感兴趣,可以删除文件属性:

find DEST -type f -exec rm {} \;

1
这本来是个很好的东西,但你忘了提及保存所有权、时间戳和权限。因此在Win7/cygwin中会产生混乱——NULL_SID用户、错误的权限顺序、无法编辑权限等等,还无法访问生成的文件结构。 - WebComer
3
我认为责任完全落在试图使用Windows进行真正工作的人身上。 - tripleee
1
cp -R --attributes-only --preserve=all --parents -v SOURCE DEST - Gábor

3

这样做是有效的:

find ./<SOURCE_DIR>/ -type d | sed 's/\.\/<SOURCE_DIR>//g' | xargs -I {} mkdir -p <DEST_DIR>"/{}"

只需替换SOURCE_DIR和DEST_DIR即可。


2
以下解决方案在不同环境中对我非常有效:
sourceDir="some/directory"
targetDir="any/other/directory"

find "$sourceDir" -type d | sed -e "s?$sourceDir?$targetDir?" | xargs mkdir -p

2
这甚至可以解决空格的问题:
在原始/源目录中:
find . -type d -exec echo "'{}'" \; > dirs2.txt

然后在新创建的目录中重新创建它:

mkdir -p <../<SOURCEDIR>/dirs2.txt

1

请将target_dirsource_dir替换为相应的值:

cd target_dir && (cd source_dir; find . -type d ! -name .) | xargs -i mkdir -p "{}"

已在OSX和Ubuntu上进行测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接