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

我想创建一个我们的数 TB 文件服务器结构的克隆。我知道父目录可以移动文件和它的父结构,但是有没有办法完整地复制目录结构呢?

我想复制到一个 linux 系统和我们的文件服务器是 CIFS 挂载在那里。

153389 次浏览

如果可以从 Windows 机器访问,那么可以使用 xcopy 和/T 和/E 复制文件夹结构(/E 包括空文件夹)

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

编辑

这个示例使用 rsync 重新创建目录结构,但不包含文件。 Http://psung.blogspot.com/2008/05/copying-directory-trees-with-rsync.html

实际上可能更好:)

你可以这样做:

find . -type d > dirs.txt

创建目录列表,则

xargs mkdir -p < dirs.txt

在目标上创建目录。

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

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

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

用适当的值代替 target_dirsource_dir:

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

在 OSX + U buntu 上测试。

下面的解决方案在各种环境中都很适合我:

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


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

这种方法是有效的:

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

只需替换 SOURCE _ DIR 和 DEST _ DIR。

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

cp -R --attributes-only SOURCE DEST

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

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

Sergiy Kolodyazhnyy 的巨蟒脚本 张贴于 只复制文件夹而不是文件?:

#!/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

仅供参考:

下面是一个使用 rsync 的简单解决方案:

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

我在那里找到了解决办法

这甚至解决了空格的问题:

在原文/源目录中:

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

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

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

下面是 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

另一种方法是使用非常方便的 tree,并根据其强选项导航目录树。有只包含目录的选项,排除空目录,排除带有模式的名称,只包含带有模式的名称,等等。看看 man tree

优势 : 您可以编辑或查看列表,或者如果经常编写大量脚本并创建一批空目录,也可以这样做

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

tree -dfi --noreport > some_dir_file.txt

-dfi只列出目录,打印每个名称的完整路径,使树不打印缩进行,

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

然后转到需要空目录的目标并执行

xargs mkdir < some_dir_file.txt
find source/ -type f  | rsync -a --exclude-from - source/ target/

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

一行解决方案:

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

简单的方法:

for i in `find . -type d`; do mkdir /home/exemplo/$i; done
cd oldlocation
find . -type d -print0 | xargs -0 -I{} mkdir -p newlocation/{}

您也可以只创建顶级目录:

cd oldlocation
find . -maxdepth 1 -type d -print0 | xargs -0 -I{} mkdir -p newlocation/{}