web-dev-qa-db-ja.com

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

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

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

77
r00fus

次のようなことができます:

find . -type d >dirs.txt

ディレクトリのリストを作成するには、

xargs mkdir -p <dirs.txt

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

135
Greg Hewgill
cd /path/to/directories &&
find . -type d -exec mkdir -p -- /path/to/backup/{} \;
67
amphetamachine

Rsyncを使用した簡単なソリューションを次に示します。

rsync -av -f"+ */" -f"- *" "$source" "$target"
  • 一行
  • スペースには問題ありません
  • 許可を保持する

私はそこにこの解決策を見つけました

23
Gildas

Linuxでソリューションを探しているなら、私は知らない。もしそうなら、あなたはこれを試すことができます:

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

これにより、ディレクトリとファイルの属性がコピーされますが、ファイルのデータはコピーされません。

cp -R --attributes-only SOURCE DEST

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

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

これは動作します:

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

SOURCE_DIRとDEST_DIRを置き換えるだけです。

2
mijhael3000

これにより、空白に関する問題も解決されます。

オリジナル/ソースディレクトリ内:

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

次に、新しく作成したディレクトリに再作成します。

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

代替target_dirおよびsource_dir適切な値:

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

OSX + Ubuntuでテスト済み。

1
luissquall

次のソリューションは、さまざまな環境でうまく機能しました。

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

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

別のアプローチは、treeを使用することです。これは非常に便利で、強力なオプションに基づいてディレクトリツリーをナビゲートします。ディレクトリのみのオプション、空のディレクトリの除外、パターン付きの名前の除外、パターン付きの名前のみの組み込みなどのオプションがあります。チェックアウトman tree

Advantage:リストを編集または確認できます。または、多くのスクリプトを作成し、空のディレクトリのバッチを頻繁に作成する場合

アプローチtreeを使用してディレクトリのリストを作成し、そのリストをmkdirへの引数入力として使用します

tree -dfi --noreport > some_dir_file.txt

-dfiはディレクトリのみをリストし、各名前のフルパスを印刷し、ツリーがインデント行を印刷しないようにします。

--noreport出力ファイルに綿毛が含まれないようにするために、ツリーリストの最後にあるファイルとディレクトリのレポートの印刷を省略します。

その後、空のディレクトリが必要な場所に移動して実行します

xargs mkdir < some_dir_file.txt
0
brother-bilo

A python 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

ご参考までに:

0

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

0
Christopher K.