我想创建一个我们的数 TB 文件服务器结构的克隆。我知道父目录可以移动文件和它的父结构,但是有没有办法完整地复制目录结构呢?
我想复制到一个 linux 系统和我们的文件服务器是 CIFS 挂载在那里。
如果可以从 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_dir和 source_dir:
target_dir
source_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 的一个解决方案:
创建一个类似 syncDirs.php的文件,包含以下内容:
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
man tree
优势 : 您可以编辑或查看列表,或者如果经常编写大量脚本并创建一批空目录,也可以这样做
方法 : 使用 tree创建一个目录列表,将该列表作为输入到 mkdir的参数
mkdir
tree -dfi --noreport > some_dir_file.txt
-dfi只列出目录,打印每个名称的完整路径,使树不打印缩进行,
-dfi
--noreport在树列表的末尾省略了打印文件和目录报告,只是为了使输出文件不包含任何绒毛
--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/{}