web-dev-qa-db-ja.com

cpスイッチを使用して特定の日付以降に変更されたファイルをコピーする

コマンドfind . -mtime -60を実行すると、過去60日以内に変更されたファイルのリストが表示されます。

find . -mtime -60 -exec cp {} /tmp/1 \;を実行すると、これらのファイルを新しいディレクトリにコピーして処理できます

ただし、タイムスタンプを保持したい場合、find . -mtime -60 -exec cp -LR --preserve=timestamps {} /tmp/2 \;を実行したときに必要なファイルだけをコピーできません

結局のところ、必要なファイルだけではなく、ソースディレクトリ内のすべてのファイルがコピーされます。

ここに解決策はありますか?

7
cyberjar09

ここで起こっていることは、-Rオプションをcpに使用し、引数としてディレクトリを指定すると、everythingそのディレクトリ内。さらに、下位のディレクトリにあるファイルは/tmp/2に直接コピーされるため、ディレクトリ構造は保持されません。これはあなたが望むことかもしれませんが(この方法を行う方法については X Tianの答え を参照)、同じ名前のファイルがある場合、宛先で一方が他方を上書きすることに注意してください。

ディレクトリ構造を維持するには、cpioを使用できます。

find . -mtime -60 -print0 | cpio -0mdp /tmp/2

-0(または同等の)オプションが使用できない場合は、これを実行できますが、ファイル名に改行が含まれていないことに注意してください。

find . -mtime -2 | cpio -mdp /tmp/2

cpio-Lオプションもサポートする必要がありますが、場合によっては無限ループが発生する可能性があるので注意してください。

11
Graeme

ディレクトリを除外する必要があります。最初のファイルであるprintsは.であり、コピーで再帰オプションを使用します。

したがって、以下は意図したものですが、Graemeが指摘するように、cpio -pdmは元のディレクトリ構造を保持し、cpは宛先ディレクトリにのみコピーします。

find . -mtime -60 -type f -exec cp -Lv --preserve=timestamps {} /tmp/2 \;

この答えは、Graemeとこのソリューションの違いを強調するために残しておきます。私はそれが元の質問に対する全体的な答えに何かを追加すると思うので。他の読者はこれを面白いと思うかもしれません。

2
X Tian

これにより、ディレクトリとファイル全体のタイムスタンプが保持されます。

find . -mtime -60 -type f -exec cp --parents -fuav {} /tmp/2 \;

CentOS 7.2を使用してテスト済み。

1
Reado