回答:
あなたは次のようなことをすることができます:
find . -type d > dirs.txt
ディレクトリのリストを作成し、次に
xargs mkdir -p < dirs.txt
宛先にディレクトリを作成します。
find . -type d -print0 >dirs.txt
およびに変更しますxargs -0 mkdir -p <dirs.txt
。これにより、両方のコマンドで空白の代わりにnullがセパレーターとして使用されます。
xargs
数百または数千の注文を処理し始めると、システムの最大コマンド長を超える可能性があるため、注意して使用してください。(でコマンドの長さ制限を見つけますgetconf ARG_MAX
。)多くのディレクトリでは、代わりに出力をループするスクリプトを作成する必要がある場合があります。
cd /path/to/directories &&
find . -type d -exec mkdir -p -- /path/to/backup/{} \;
--
標準のGNUユーティリティオプションターミネータです。これは、「mkdir、これ以降の引数はフラグではないので、「-」文字で始まっていてもファイル引数として扱う」という意味です。
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を置き換えるだけです。
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
ご参考までに:
別のアプローチはtree
、強力なオプションに基づいてかなり便利でナビゲートするディレクトリツリーを使用することです。ディレクトリのみ、空のディレクトリを除外、パターン付きの名前を除外、パターン付きの名前のみを含めるなどのオプションがあります。チェックアウトman tree
利点:リストを編集または確認できます。または、多くのスクリプトを作成し、空のディレクトリのバッチを頻繁に作成する場合
アプローチ:をtree
使用してディレクトリのリストを作成し、そのリストをへの引数入力として使用しますmkdir
tree -dfi --noreport > some_dir_file.txt
-dfi
ディレクトリのみを一覧表示し、名前ごとにフルパスを出力し、ツリーにインデント行を出力させません。
--noreport
ツリーリストの最後にあるファイルおよびディレクトリレポートの印刷を省略し、出力ファイルに綿毛が含まれないようにします。
次に、空のディレクトリが必要な場所に移動して実行します
xargs mkdir < some_dir_file.txt
Windowsマシンからアクセスできる場合は、xcopyを/ Tおよび/ Eとともに使用して、フォルダー構造のみをコピーできます(/ Eには空のフォルダーが含まれます)。
[編集!]
これはrsyncを使用してディレクトリ構造を再作成しますが、ファイルは作成しません。 http://psung.blogspot.com/2008/05/copying-directory-trees-with-rsync.html
実際に良いかもしれません:)
これが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