
有沒有辦法讓cp
's--update
選項列印由於來源目錄包含該檔案的較新版本而未複製的檔案?
答案1
用。cp -ur
rsync -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
。如果您不在該目錄中,則需要將命令變更find
為find dirWhereFileExists
「find .
如果您不從單一目錄複製,則可以使用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 能為你做這項工作嗎?它有許多適合您的描述的選項,例如“不要覆蓋較新的文件”等。您可以讓它記錄調查結果。我經常使用它進行遠端和本地文件複製。
您也可以透過它獲得非常細粒度的資訊。
祝你好運。