将文件夹结构(无文件)从一个位置复制到另一位置


94

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

我想复制到Linux系统,并且文件服务器已安装在CIFS上。



上面评论文章中的rsync解决方案看起来更整洁。

Answers:


158

您可以执行以下操作:

find . -type d > dirs.txt

创建目录列表,然后

xargs mkdir -p < dirs.txt

在目标上创建目录。


8
如果目录名称中有空格,则此解决方案将不起作用。
Jealie 2015年

29
@Jealie将命令更改为find . -type d -print0 >dirs.txtxargs -0 mkdir -p <dirs.txt。这将导致两个命令都将空值用作分隔符,而不是空格。
user1207177'3

3
xargs当您开始处理成百上千的订单时,它可能会超过系统的最大命令长度,因此请谨慎使用。(使用来查找命令长度限制getconf ARG_MAX。)对于许多目录,您可能必须编写脚本以遍历输出。
palswim 2015年

1
权限和属性又将如何保留?
Ashish Karpe

3
@TrevorBoydSmith:感谢您的评论。最初的问题没有提及需要保留权限,所有权或属性的任何内容。正如您提到的那样,这样做将需要不同的解决方案,但是以上内容足以回答所提出的问题。
Greg Hewgill '17

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

3
找到我最好的答案。否则,你可以尝试rsync从陈利维回答解决这个问题的SO
板M

3
-mkdir的选项是什么?
Bruce_Warrior '16

9
--是标准的GNU实用程序选项终止符。它的意思是“嘿mkdir,此后的任何参数,它都不是标志,因此即使它以'-'字符开头,也应将其视为文件参数。”
amphetamachine

4
此答案也不会保留目录权限和属性使用rynsc保留权限和属性
Trevor Boyd Smith,

35

这是使用rsync的简单解决方案:

rsync -av -f"+ */" -f"- *" "$source" "$target"
  • 一条线
  • 空间没有问题
  • 保留权限

我在那里找到了这个解决方案


10
相同但可读性更高rsync -a --include '*/' --exclude '*' "$source" "$target"
Sylvain

1
该解决方案的问题是:我的文件夹包含成千上万个文件,而rsync花费了很长时间才能同步多个文件夹。
Christopher K.

6

如果您正在Linux上寻找解决方案,我不知道。如果是这样,您可以尝试以下操作:

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

cpio似乎不适用于我,至少对于您指定的参数而言。
r00fus

@ r00fus-请阅读cpio手册或参考gnu.org/software/cpio
zerodin 2010年

6

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

cp -R --attributes-only SOURCE DEST

然后,如果您对文件属性不感兴趣,则可以删除它们:

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

1
会很棒,但是您忘了提到保存所有权,时间戳和权限。因此,它在Win7 / cygwin中产生了混乱-NULL_SID用户,错误的权限顺序,无法编辑权限等,并且无法访问生成的文件结构。
WebComer '18

1
我应该认为应该将责任完全归于那些试图使用Windows进行实际工作的人。
三点

CP -R --attributes-仅--preserve =所有--parents -v SOURCE DEST
伽柏

2

以下解决方案在各种环境下对我来说都很有效:

sourceDir="some/directory"
targetDir="any/other/directory"

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

2

这有效:

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

只需替换SOURCE_DIR和DEST_DIR。


2

这甚至可以解决空格问题:

在原始/源目录中:

find . -type d -exec echo "'{}'" \; > dirs2.txt

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

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

1

替换target_dir,并source_dir用适当的值:

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

在OSX + Ubuntu上测试。


0

来自Sergiy Kolodyazhnyy的python脚本发布在仅复制文件夹而不是文件上?

#!/usr/bin/env python
import os,sys
dirs=[ r for r,s,f in os.walk(".") if r != "."]
for i in dirs:
    os.makedirs(os.path.join(sys.argv[1],i)) 

或从外壳:

python -c 'import os,sys;dirs=[ r for r,s,f in os.walk(".") if r != "."];[os.makedirs(os.path.join(sys.argv[1],i)) for i in dirs]' ~/new_destination

仅供参考:


0

另一种方法是使用,tree它非常方便,并基于其强大的选项导航目录树。有仅目录的选项,排除空目录,排除具有模式的名称,仅包含具有模式的名称等。签出man tree

优点:您可以编辑或查看列表,或者执行大量脚本编写并经常创建一批空目录

方法:使用创建目录列表tree,使用该列表作为输入的参数mkdir

tree -dfi --noreport > some_dir_file.txt

-dfi 仅列出目录,为每个名称打印完整路径,使树不打印缩进线,

--noreport 省略在树形列表的末尾打印文件和目录报告,只是使输出文件不包含任何绒毛

然后转到您想要空目录的位置并执行

xargs mkdir < some_dir_file.txt

0
find source/ -type f  | rsync -a --exclude-from - source/ target/

仅复制具有相关权限和所有权的目录


0

1线解决方案:

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

-1

如果可以从Windows计算机获得访问权限,则可以将xcopy与/ T和/ E一起使用以仅复制文件夹结构(/ E包括空文件夹)

http://ss64.com/nt/xcopy.html

[编辑!]

这个使用rsync重新创建目录结构,但是没有文件。 http://psung.blogspot.com/2008/05/copying-directory-trees-with-rsync.html

可能会更好:)


1
不幸的是,我们的CIFS服务文件服务器未运行Windows,因此对win命令无法执行。
r00fus

谢谢,rsync方法对我来说工作得很好。它也与目录名称中的空格兼容。
谷氨酰胺

-1

这是php中的解决方案:

  • 复制目录(不是递归的,只有一个级别)
  • 保留权限
  • 与rsync解决方案不同,即使包含数千个文件的目录也可以快速访问,因为它甚至不进入文件夹
  • 空间没有问题
  • 应该易于阅读和调整

创建syncDirs.php具有以下内容的文件:

<?php
foreach (new DirectoryIterator($argv[1]) as $f) {
    if($f->isDot() || !$f->isDir()) continue;
        mkdir($argv[2].'/'.$f->getFilename(), $f->getPerms());
        chown($argv[2].'/'.$f->getFilename(), $f->getOwner());
        chgrp($argv[2].'/'.$f->getFilename(), $f->getGroup());
}

以具有足够权限的用户身份运行它:

sudo php syncDirs.php /var/source /var/destination


您不必喜欢PHP,也不必使用它。但是OP并未指定他是否需要任何特定语言的解决方案,并且无论是否喜欢,PHP 都已在许多Linux系统上安装,因为80%的网络使用PHP(w3techs.com/technologies/details/pl- php / all / all)。
Christopher K.19年
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.