ディレクトリ構造を維持したまま、svnリポジトリ内の変更されたファイルを別のディレクトリにコピーしたい。
Awkとxargsのマンページを読んだ後、次のように変更されたファイル名を取得する方法を見つけました。
$ svn status -q | awk '{ print $2 }' | xargs -d \\n -I '{}' cp '{}' /tmp/xen/
しかし問題は、このようにディレクトリ構造が保持されないことです。このようにファイルをコピーしたいのです。
./common/superp.c -> /tmp/xen/common/superp.c
./common/m2mgr.c -> /tmp/xen/common/m2mgr.c
./common/page_alloc.c -> /tmp/xen/common/page_alloc.c
./Arch/x86/mm.c -> /tmp/xen/Arch/x86/mm.c
./Arch/x86/mm/shadow/private.h -> /tmp/xen/Arch/x86/mm/shadow/private.h
Cpコマンドをcp '{}'/tmp/xen/'{}'に変更しようとしましたが、そのようなファイルやディレクトリはありませんでした。必要に応じて、cpコピーファイルを作成してディレクトリを作成する方法はありますか?このコマンドチェーンを簡略化できるかどうかを指摘してください。 :-)
返信ありがとうございます。ディレクトリが少し大きいので、cp -Rまたはrsyncを使用してディレクトリ全体をコピーしたくありません。タールパイプを使用するというCKの提案は非常に役立ちます。
svn status -q | awk '{ print $2 }' | xargs tar cf - | (cd /tmp/xen/; tar xvf -)
いくつかの簡単な考え:
編集
tar -cf archive.tar `svn status -q | awk '{print $2}'`
変更されたファイルのアーカイブを作成する必要があります。次に:
tar -xf archive.tar -C /tmp/xen
あなたが望む場所にそれを置くべきです。 1つのステップで行う必要がある場合は、それも可能です。
rsyncを使用すると、ディレクトリ構造全体をコピーするために一般的に使用するツールである非常にシンプルなものになります。
rsync -av /home/source/svn/repo /home/dest/svn/
これにより、repoディレクトリとそのすべてのコンテンツが/ home/dest/svnディレクトリに作成されるため、/ home/dest/svn/repo/...
だからあなたの例:
rsync -rv ./ /tmp/xen/
-aは、タイムスタンプを保持し、とりわけ 'man rsync'のように再帰的になります。
質問を間違って読んだことに気付いた後の更新:
ディレクトリ構造を模倣するには(tar代替):
rsync -av --include='*/' --exclude='*' source destination
そして、20分前にファイルをコピーするには:
find . -type f -mmin -20 -print0 | xargs -0 cp --target-directory /mydestdir/
参考までに、その1行です。
svn status -q | awk '{print $2}' | xargs tar -c | tar -xC /tmp/xen
そして英語で:
svn status -q
で関心のあるファイルのリストを取得します。awk '{print $2}'
xargs tar -c
-x
)にすぐに再抽出されます(-C path
):tar -xC /tmp/xen
rsync -aは深さ1よりも深い新しいディレクトリを作成しないので、rsyncは部分的な解決策にすぎず、たとえば私には適していません(途中でいくつかのディレクトリが欠落しているときに、リモート階層にディレクトリをrsyncする方法の答えを見つけました)
編集:つまり、ソースディレクトリ:/home/user/projects/homework/1/1.1/があり、それをリモートにrsyncしたい:/home/user/projects/homework/1/1.1/ ...しかし宛先まだディレクトリ/ home/user/projects/homeworkを持っていません...そして/ home/user/projects /にあるソースマシンの他のサブディレクトリを転送したくありません
Edit2:rsync --relativeオプションで方法を見つけました:上記の例は次のようになります:
cd/home/projects /; rsync -aR homework/1/1.1 user @ remote:/ home/user/projects /
「dirname」を使用してパス「mkdir -p」を抽出し、作成します。
xargs -d \\n -l '{}' mkdir -p \`dirname '{}'\` && cp '{}' /tmp/xen/
/tmp/f2
内のファイルのディレクトリ構造を/tmp/f
に構築します
$ cd /tmp/f/
$ find . -type f -exec dirname {} \; | uniq | xargs -I {} mkdir /tmp/f2/{} -p
ファイルを新しい宛先にコピー/tmp/f2/
$ cd /tmp/f
$ find . -type f -exec cp {} /tmp/f2/{} -aPv \;
次のことをお勧めします。
ちなみに、Rフラグ付きのcpはファイル/フォルダーを再帰的にコピーします。
cp -R