web-dev-qa-db-ja.com

存在しない場合にファイルをcpしてディレクトリを作成するにはどうすればよいですか?

ディレクトリ構造を維持したまま、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 -)
15
ZelluX

いくつかの簡単な考え:

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

編集

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

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

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

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

12
CK.

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/
4
Kyle Brandt

参考までに、その1行です。

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

そして英語で:

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

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 /

1
zimon

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

xargs -d \\n -l '{}' mkdir -p \`dirname '{}'\` && cp '{}' /tmp/xen/
1
wazoox
  • /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 \;
    
0
ren8zhu

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

  • すべてをコピー
  • 検索未変更ファイルおよびそれらを削除し、変更されたファイルを元の場所に残します。

ちなみに、Rフラグ付きのcpはファイル/フォルダーを再帰的にコピーします。

 cp -R 
0
Karolis T.