存在しない場合にファイルをcpしてディレクトリを作成する方法は?


15

ディレクトリ構造を維持しながら、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 -)

回答:


12

いくつかの簡単な考え:

  • mkdir -p $(dirname FILE)を追加します
  • タールパイプを使用してすべてを整理できますか?

編集

 tar -cf archive.tar  `svn status -q | awk '{print $2}'`

変更されたファイルのアーカイブを作成する必要があります。次に:

  tar -xf archive.tar -C /tmp/xen

あなたが望む場所に置くべきです。1つのステップで行う必要がある場合は、それも可能です。


4

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/

これは明らかなことですが、変更されたファイルだけでなく、すべてが同期されますよね?
CK。

おっと、それを見逃した
カイルブラント

2

参照用のワンライナーは次のとおりです。

svn status -q | awk '{print $2}' | xargs tar -c | tar -xC /tmp/xen

そして英語で:

  • 対象のファイルのリストを取得svn status -qします。
  • ファイルパスで列を抽出するawk: awk '{print $2}'
  • xargsは、ファイルのリストをtarに提供するために使用され、tarはファイルのtarballをstdoutに送信します。 xargs tar -c
  • すぐに-xターゲットディレクトリ(-C path)に再抽出されます():tar -xC /tmp/xen

1

「dirname」を使用してパス「mkdir -p」を抽出し、作成します。

xargs -d \\n -l '{}' mkdir -p \`dirname '{}'\` && cp '{}' /tmp/xen/

1

rsync -aは深さ1よりも深い新しいディレクトリを作成しないため、rsyncは部分的な解決策であり、たとえば私には適していません)

編集:つまり、ソースディレクトリがあります:/home/user/projects/homework/1/1.1/そして、それをリモートに再同期したい:/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 /


0

次のことをお勧めします。

  • すべてをコピーする
  • 変更されていないファイルを見つけて削除し、変更されたファイルをその場所に残します。

ところで、Rフラグを指定したcpは、ファイル/フォルダーを再帰的にコピーします。

cp -R

0
  • ディレクトリ構造/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 \;
    
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.