
ソースディレクトリに最新バージョンのファイルが含まれており、コピーされていないファイルを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 dirWhereFileExists
find .
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はあなたのために働くことができますか? 「新しいファイルを上書きしない」など、説明に合わせてさまざまなオプションがあります。結果を記録することができます。リモートおよびローカルファイルのコピーによく使用されます。
これにより、非常にきめ細かな情報を得ることもできます。
頑張ってください。