從 BASH 呼叫 cp 並使用 -u 選項

從 BASH 呼叫 cp 並使用 -u 選項

有沒有辦法讓cp's--update選項列印由於來源目錄包含該檔案的較新版本而未複製的檔案?

答案1

用。cp -urrsync -urvv

那裡的兩個“v”-s 沒有拼寫錯誤:它們的存在是為了增加冗長性,以顯示被跳過的文件。

跳過的文件看起來像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。如果您不在該目錄中,則需要將命令變更findfind dirWhereFileExistsfind . 如果您不從單一目錄複製,則可以使用find dir1 dir2...」。

3) 如果您出於某種原因在檔案名稱中包含反引號或單引號,它將不起作用。

如您所知,這不是最強大的解決方案,但它應該適合一次性操作。

編輯

今天早上我醒來,意識到上面的解決方案是垃圾。如果您嘗試複製多個文件,它會搜尋與您擁有文件一樣多的次數,但每次都會排除一個文件。但是,以下解決方案應該有效:

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 能為你做這項工作嗎?它有許多適合您的描述的選項,例如“不要覆蓋較新的文件”等。您可以讓它記錄調查結果。我經常使用它進行遠端和本地文件複製。

您也可以透過它獲得非常細粒度的資訊。

祝你好運。

相關內容