从 BASH 中调用 cp 并使用 -u 选项

从 BASH 中调用 cp 并使用 -u 选项

有没有办法让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。如果您不在该目录中,则需要将命令更改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 能为你做这项工作吗?它有许多适合您的描述的选项,例如“不要覆盖较新的文件”等。您可以让它记录调查结果。我经常使用它进行远程和本地文件复制。

您也可以通过它获得非常细粒度的信息。

祝你好运。

相关内容