マルチテラバイトのファイルサーバーの構造のクローンを作成したいと思います。 cp --parentsはファイルとその親構造を移動できることを知っていますが、ディレクトリ構造をそのままコピーする方法はありますか?
Linuxシステムにコピーしたいのですが、ファイルサーバーにはCIFSがマウントされています。
次のようなことができます:
find . -type d >dirs.txt
ディレクトリのリストを作成するには、
xargs mkdir -p <dirs.txt
宛先にディレクトリを作成します。
cd /path/to/directories &&
find . -type d -exec mkdir -p -- /path/to/backup/{} \;
Rsyncを使用した簡単なソリューションを次に示します。
rsync -av -f"+ */" -f"- *" "$source" "$target"
Linuxでソリューションを探しているなら、私は知らない。もしそうなら、あなたはこれを試すことができます:
$ mkdir destdir
$ cd sourcedir
$ find . -type d | cpio -pdvm destdir
これにより、ディレクトリとファイルの属性がコピーされますが、ファイルのデータはコピーされません。
cp -R --attributes-only SOURCE DEST
興味がない場合は、ファイル属性を削除できます。
find DEST -type f -exec rm {} \;
これは動作します:
find ./<SOURCE_DIR>/ -type d | sed 's/\.\/<SOURCE_DIR>//g' | xargs -I {} mkdir -p <DEST_DIR>"/{}"
SOURCE_DIRとDEST_DIRを置き換えるだけです。
これにより、空白に関する問題も解決されます。
オリジナル/ソースディレクトリ内:
find . -type d -exec echo "'{}'" \; > dirs2.txt
次に、新しく作成したディレクトリに再作成します。
mkdir -p <../<SOURCEDIR>/dirs2.txt
代替target_dir
およびsource_dir
適切な値:
cd target_dir && (cd source_dir; find . -type d ! -name .) | xargs -i mkdir -p "{}"
OSX + Ubuntuでテスト済み。
次のソリューションは、さまざまな環境でうまく機能しました。
sourceDir="some/directory"
targetDir="any/other/directory"
find "$sourceDir" -type d | sed -e "s?$sourceDir?$targetDir?" | xargs mkdir -p
別のアプローチは、tree
を使用することです。これは非常に便利で、強力なオプションに基づいてディレクトリツリーをナビゲートします。ディレクトリのみのオプション、空のディレクトリの除外、パターン付きの名前の除外、パターン付きの名前のみの組み込みなどのオプションがあります。チェックアウトman tree
Advantage:リストを編集または確認できます。または、多くのスクリプトを作成し、空のディレクトリのバッチを頻繁に作成する場合
アプローチ:tree
を使用してディレクトリのリストを作成し、そのリストをmkdir
への引数入力として使用します
tree -dfi --noreport > some_dir_file.txt
-dfi
はディレクトリのみをリストし、各名前のフルパスを印刷し、ツリーがインデント行を印刷しないようにします。
--noreport
出力ファイルに綿毛が含まれないようにするために、ツリーリストの最後にあるファイルとディレクトリのレポートの印刷を省略します。
その後、空のディレクトリが必要な場所に移動して実行します
xargs mkdir < some_dir_file.txt
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
ご参考までに:
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