フォルダー構造(ファイルなし)をある場所から別の場所にコピーする


94

マルチテラバイトのファイルサーバーの構造のクローンを作成します。私はcp --parentsがファイルとその親構造を移動できることを知っていますが、ディレクトリ構造をそのままコピーする方法はありますか?

Linuxシステムにコピーしたいのですが、ファイルサーバーにCIFSがマウントされています。



上記のコメント投稿からのrsyncソリューションは、よりきれいに見えます。
YE、

回答:


158

あなたは次のようなことをすることができます:

find . -type d > dirs.txt

ディレクトリのリストを作成し、次に

xargs mkdir -p < dirs.txt

宛先にディレクトリを作成します。


8
ディレクトリ名にスペースが含まれている場合、このソリューションは機能しません。
Jealie、2015年

29
@Jealieコマンドをfind . -type d -print0 >dirs.txtおよびに変更しますxargs -0 mkdir -p <dirs.txt。これにより、両方のコマンドで空白の代わりにnullがセパレーターとして使用されます。
user1207177 2015

3
xargs数百または数千の注文を処理し始めると、システムの最大コマンド長を超える可能性があるため、注意して使用してください。(でコマンドの長さ制限を見つけますgetconf ARG_MAX。)多くのディレクトリでは、代わりに出力をループするスクリプトを作成する必要がある場合があります。
palswim 2015年

1
そして、パーミッションと属性はどうなりますか?
Ashish Karpe

3
@TrevorBoydSmith:コメントありがとうございます。元の質問では、アクセス許可、所有権、または属性を保持する必要性については何も触れられていませんでした。そうすることは、あなたが言及するように別の解決策を必要とするでしょうが、上記は提起された質問に答えるのに十分です。
グレッグ・ヒューギル

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

3
検索で私からの最良の回答。それ以外の場合はrsyncこのSOの質問
Mat 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"
シルヴァン

1
このソリューションの問題は次のとおりです。私のフォルダーには数千のファイルが含まれており、rsyncは数十のフォルダーを同期するだけでかなり時間がかかります。
クリストファーK.

6

Linuxでの解決策を探しているなら、私には分からない。もしそうなら、あなたはこれを試すことができます:

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

cpioは、少なくとも指定したパラメーターでは機能しないようです。
r00fus 2010年

@ r00fus -のcpioのマニュアルを読んだり、参照してくださいgnu.org/software/cpio
zerodin

6

これはディレクトリとファイルの属性をコピーしますが、ファイルのデータはコピーしません:

cp -R --attributes-only SOURCE DEST

次に、興味がない場合は、ファイル属性を削除できます。

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

1
優れたものになるでしょうが、所有権、タイムスタンプ、権限の保存について言及するのを忘れていました。そのため、Win7 / cygwinで混乱を引き起こしました-NULL_SIDユーザー、誤った許可順序、許可の編集などができず、作成されたファイル構造にアクセスできません。
WebComer 2018

1
私は、Windowsを実際の作業に使用しようとする人に責任があると考えるべきです。
tripleee

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_dirsource_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 2010年

ありがとう、rsyncメソッドは私にとって完璧に機能しました。ディレクトリ名のスペースにも対応しています。
グルタニメート

-1

これがphpの解決策です:

  • ディレクトリをコピーします(再帰的ではなく、1レベルのみ)
  • 権限を保持します
  • 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は特定の言語でのソリューションが必要かどうかを指定していません。Webの80%がPHPを使用しているため(w3techs.com/technologies/details/pl- php / all / all)。
Christopher K.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.