web-dev-qa-db-ja.com

cpコマンドでコピーされるファイルをテストするにはどうすればよいですか?

私は、DIRECTORYBに存在しないすべてのファイルをDIRECTORYAからコピーする簡単なスクリプトを作成しています。私はこれをcpコマンドを使用して実行しています。

cp -u DIRECTORYA/* DIRECTORYB

また、コピーしたファイルを一覧表示する電子メールを管理者に送信します。

したがって、理想的には、上記のコマンドを実行する前に、コピーされるファイルを取得して、後で電子メールメッセージを作成するときに使用できるように変数に保存します。

誰かが私を正しい方向に向けることができますか?私はgrepを使用して調べましたが、これはcpコマンドで実行できないと思いますか?

11
James

GNU cpは、動作せずに何が行われるかを確認したい場合に役立つ情報はないと思います。変更されたファイルをログに記録するには、 -vオプション:

cp -puv DIRECTORYA/* DIRECTORYB >copy.log

cpの代わりに rsync を使用できます。これははるかに強力であり、ローエンドの組み込みシステムを除くほぼすべての場所にインストールされます(そして、存在しない場所に簡単にインストールできます)デフォルト)。

rsync -aun DIRECTORYA/* DIRECTORYB >what-would-be-done.txt

または

rsync -auv DIRECTORYA/* DIRECTORYB >copy.log

manual page によれば、

-u--update
[〜#〜] source [〜#〜]ファイルがコピー先よりnewの場合にのみコピーファイルまたは宛先ファイルががない場合

これは2つのテストを組み合わせた機能です。1つはスクリプトに実装するのが簡単であり(missing)、もう1つは作業が必要です(newer )。 commdiffおよびtestを使用して、必要なものを報告するスクリプトを作成できます。

標準のcpユーティリティには、コピー操作をドライランする機能はありません。提案されているように、rsyncは、一般的に利用可能なユーティリティでこれを行う方法です。もちろん、rsyncは通常、newerまたはmissing(ファイルサイズ)よりも多くの基準に基づいてコピーするために使用されますとタイムスタンプも使用されます)。ただし、cp -uを実行するだけに減らすことができます。

非標準のユーティリティとして、1980年代後半に私が書いた(そしてもちろんまだ使用している)copyユーティリティがあります。私が追加した最初のオプションは-nだったので、おそらくmakeユーティリティに触発されました。

この例では、次のように使用されます。

$ copy -nvU DIRECTORYA/* DIRECTORYB
** copy DIRECTORYA/foo to DIRECTORYB/foo
** 1 file would be copied, 616 bytes

参考文献:

  • copy-ファイル/ディレクトリコピーユーティリティ

    -nは、ファイルの実際の作成または変更を無効にし、(詳細レベルに応じて)copyコマンドの場合。
    -uは、サイズまたは変更日が異なる場合にのみファイルをコピーし、リンクテキストが異なる場合にのみリンクします。
    -Uは、宛先よりも新しいファイル、または宛先に存在しないファイルのみをコピーします。

  • 1988年8月からのchangelogエントリ

    1988-08-16 
     * src/copy/src/copy.c:「-d」および「-n」オプションを追加。
    
3
Thomas Dickey

cp foo*bar whateverを実行したい場合は、代わりにecho foo*bar whateverを実行してください。

2
VaTo

Diffコマンドを使用できます。私は毎日いくつかのバックアップファイルをコピーする仕事をしています。すべてのファイルがコピーされたかどうかを確認する必要がある場合があります。構文は次のとおりです。

diff /file1/ /file2/

もちろん、それらをコピーしたい場合は、以下を使用します。

cp -u /file1/* /file2
0
poori

代わりにrsyncの使用を検討してください。 Rsyncはローカルコピーで完全に機能し、15兆に及ぶオプションを試してみると、確実に思い通りのことができます。

rsync -avun DIRECTORYA/ DIRECTORYB

行われるすべてを表示し、

rsync -avu DIRECTORYA/ DIRECTORYB

それを行います。

0
Edward Falk