有没有办法让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 能为你做这项工作吗?它有许多适合您的描述的选项,例如“不要覆盖较新的文件”等。您可以让它记录调查结果。我经常使用它进行远程和本地文件复制。
您也可以通过它获得非常细粒度的信息。
祝你好运。