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

时间:2010-11-01 23:30:59

标签: linux file copy directory

我想创建一个包含多TB文件服务器结构的克隆。我知道cp - parent可以移动文件和它的父结构,但有没有办法复制目录结构完整?

我想复制到linux系统,我们的文件服务器安装在那里CIFS。

16 个答案:

答案 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
  • 一行
  • 没有空格问题
  • 保留权限

I found this solution there

答案 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_dirsource_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中的解决方案:

  • 复制目录(不是递归复制,只有一个级别)
  • 保留权限
  • 与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

答案 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包含空文件夹)

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

[EDIT!]

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

实际上可能会更好:)