回答:
これを見つけました:
rsync -a -f"+ */" -f"- *" source/ destination/
http://psung.blogspot.com/2008/05/copying-directory-trees-with-rsync.html
find some/dir -type d -print0 | rsync --files-from=/dev/stdin -0 ...
別のアプローチは、findとmkdirを使用することです:
find SOURCE -type d -exec mkdir TARGET/{} \;
TARGETが既に存在することを確認するか、mkdirの-pオプションを使用します。
同様に、(GNU)tarを使用すると:
find some/dir -type d -print |
tar --no-recursion -T- -c -p -f- |
(cd another/dir && tar -x -p -f-)
改行文字を含むファイル名がない限り-print0
、findコマンドラインまたは-0
rsyncコマンドラインで実際に必要はありません(可能ですが、ほとんどありません)。Tar(およびrsync、およびcpio)は、ファイル名を1行ずつ読み取ります。NULLターミネータを使用するとxargs
、通常、空白で区切られたファイル名を読み取ります(したがって、名前にスペースが含まれていないファイル/ディレクトリは処理されません-0
)。
(cd /home/user/source/; find -type d -print0) | xargs -0 mkdir -p
cp -al
ハードリンクを含むすべてのファイルをコピーします。同じ構造、同じ権限。(注:ハードリンクなので、ストレージは失われません。)
rsync -a --include='*/' --exclude='*' ${source} ${destination}
。