我想创建一个包含多TB文件服务器结构的克隆。我知道cp - parent可以移动文件和它的父结构,但有没有办法复制目录结构完整?
我想复制到linux系统,我们的文件服务器安装在那里CIFS。
答案 0 :(得分:132)
您可以执行以下操作:
find . -type d >dirs.txt
创建目录列表,然后
xargs mkdir -p <dirs.txt
在目的地上创建目录。
答案 1 :(得分:66)
cd /path/to/directories &&
find . -type d -exec mkdir -p -- /path/to/backup/{} \;
答案 2 :(得分:21)
这是一个使用rsync的简单解决方案:
CFLAGS=-Wall -ggdb -I../../lib -I../../lib/cpp
LDFLAGS=-L../../lib ../../lib/cpp/libmosquittopp.so.1 ../../lib/libmosquitto.so.1
.PHONY: all clean
all : mqtt_temperature_conversion
mqtt_temperature_conversion : main.o temperature_conversion.o
${CXX} $^ -o $@ ${LDFLAGS}
main.o : main.cpp
${CXX} -c $^ -o $@ ${CFLAGS}
temperature_conversion.o : temperature_conversion.cpp
${CXX} -c $^ -o $@ ${CFLAGS}
clean :
-rm -f *.o mqtt_temperature_conversion
答案 3 :(得分:6)
如果您正在寻找Linux上的解决方案,我不知道。如果是这样,你可以试试这个:
$ mkdir destdir
$ cd sourcedir
$ find . -type d | cpio -pdvm destdir
答案 4 :(得分:4)
复制目录和文件属性,但不复制文件数据:
cp -R --attributes-only SOURCE DEST
如果您对文件属性不感兴趣,可以删除文件属性:
find DEST -type f -exec rm {} \;
答案 5 :(得分:2)
这有效:
find ./<SOURCE_DIR>/ -type d | sed 's/\.\/<SOURCE_DIR>//g' | xargs -I {} mkdir -p <DEST_DIR>"/{}"
只需替换SOURCE_DIR和DEST_DIR。
答案 6 :(得分:1)
用适当的值替换target_dir
和source_dir
:
cd target_dir && (cd source_dir; find . -type d ! -name .) | xargs -i mkdir -p "{}"
在OSX + Ubuntu上测试。
答案 7 :(得分:1)
以下解决方案适用于各种环境:
sourceDir="some/directory"
targetDir="any/other/directory"
find "$sourceDir" -type d | sed -e "s?$sourceDir?$targetDir?" | xargs mkdir -p
答案 8 :(得分:1)
这解决了空白的问题:
在原始/源目录中:
find . -type d -exec echo "'{}'" \; > dirs2.txt
然后在新创建的目录中重新创建它:
mkdir -p <../<SOURCEDIR>/dirs2.txt
答案 9 :(得分:0)
来自Sergiy Kolodyazhnyy的python脚本 发布在Copy only folders not files?:
#!/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))
或来自shell:
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
供参考:
答案 10 :(得分:0)
以下是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
答案 11 :(得分:0)
另一种方法是使用tree
,它非常方便,并基于其强大的选项来导航目录树。有仅目录的选项,排除空目录,排除具有模式的名称,仅包含具有模式的名称等。签出man tree
优点:您可以编辑或查看列表,或者如果您进行大量脚本编写并经常创建一批空目录
方法:使用tree
创建目录列表,将该列表用作输入到mkdir
的参数
tree -dfi --noreport > some_dir_file.txt
-dfi
仅列出目录,为每个名称打印完整路径,使树不打印缩进线,
--noreport
省略了在树形列表的末尾打印文件和目录报告,只是使输出文件不包含任何绒毛
然后转到您想要空目录并执行的目的地
xargs mkdir < some_dir_file.txt
答案 12 :(得分:0)
find source/ -type f | rsync -a --exclude-from - source/ target/
仅复制具有相关权限和所有权的目录
答案 13 :(得分:0)
1行解决方案:
find . -type d -exec mkdir -p /path/to/copy/directory/tree/{} \;
答案 14 :(得分:0)
简单的方法:
for i in `find . -type d`; do mkdir /home/exemplo/$i; done
答案 15 :(得分:-1)
如果您可以从Windows计算机进行访问,则可以使用带有/ T和/ E的xcopy来复制文件夹结构(/ E包含空文件夹)
[EDIT!]
这个使用rsync重新创建目录结构但没有文件。 http://psung.blogspot.com/2008/05/copying-directory-trees-with-rsync.html
实际上可能会更好:)