-uオプションを使用してBASHからcpを呼び出します。

-uオプションを使用してBASHからcpを呼び出します。

ソースディレクトリに最新バージョンのファイルが含まれており、コピーされていないファイルをcpのオプションで印刷する方法はありますか?--update

答え1

cp -ur使用。 。 。交換rsync -urvv

2つの「v」はタイプミスではありません。スキップされたファイルを表示するための詳細情報を追加するためのものです。

スキップされたファイルは次のとおりです。スキップされたファイルのリストをthe_filename is newer取得するには、次のコード行を使用できます。

rsync -urvv source/ target | grep ' is newer$' | sed -e 's/ is newer$//'

あるいは、このフラグを対話的に使用したい場合に--progress便利です。

答え2

これを直接行う方法はありませんが、cp基本的に同じことを行う必要があります。

cp -vu file destination | awk '{ gsub("[`\x27]", "", $1); print $1 } END { if (NR == 0) print "NOFILES" }' | xargs -I{} find . ! -name {} -maxdepth 1

この小さな専門用語にはいくつかの制限があります。

1)これは、「NOFILES」というファイルが存在しないという事実に依存します。awk必要に応じてコマンドでこの文字列を変更できます。

2)既存のディレクトリになければなりませんfile。そのディレクトリにない場合は、コマンドを「単一のディレクトリからコピーしない場合は使用できます」findに変更する必要があります。find dirWhereFileExistsfind .find dir1 dir2...

3)何らかの理由でファイル名にバックティックまたは一重引用符を含めると機能しません。

ご存知のように、これは最も強力なソリューションではありませんが、ワンタイム作業に適している必要があります。

編集する

今朝起きて、上記の解決策がゴミであることに気づきました。複数のファイルをコピーしようとすると、ファイル数だけ検索しますが、毎回1つのファイルのみを除外します。ただし、次の回避策が機能します。

cp -vu file destination | awk '{ gsub("[`\x27]", "", $1); regex = $1 "|" regex } END { if (NR == 0) { regex = "NOFILES|" } print ".*/("substr(regex, 0, length(regex))")" }' | xargs -I{} find . -regextype posix-extended ! -regex {} -maxdepth 1

正規表現を作成して渡しますfind。上記と同じ制限が適用されます。

前はバカみたいに転がしてすみません。今StackOverflowを起動するには遅すぎると思います。

答え3

rsyncはあなたのために働くことができますか? 「新しいファイルを上書きしない」など、説明に合わせてさまざまなオプションがあります。結果を記録することができます。リモートおよびローカルファイルのコピーによく使用されます。

これにより、非常にきめ細かな情報を得ることもできます。

頑張ってください。

関連情報