如何测试使用cp命令复制哪些文件?


11

我正在创建一个简单的脚本,该脚本从DIRECTORYA复制DIRECTORYB中不存在的所有文件。我正在通过使用cp命令来做到这一点:

cp -u DIRECTORYA/* DIRECTORYB

我还想向管理员发送一封电子邮件,其中将列出已复制的文件。

因此,理想情况下,在运行上述命令之前,我想获取将要复制的文件并将其存储在变量中,以供以后构建电子邮件时使用。

有人能指出我正确的方向吗?我已经研究过使用grep,但是我不认为这可以通过cp命令来完成吗?


1
也许我误解了您的问题,但是您不能使用该-v标志在复制文件名时打印它们吗?将其重定向到文件或直接在变量中,然后使用它来构建您的消息。
ThibautRenaux'3

另外,该cp命令具有--attributes-only允许不复制文件数据,而仅复制目录和文件结构的选项。
Costas 2015年

抱歉,我刚开始编写脚本。如果使用-v标志,如何输出到变量而不是文件?
詹姆斯

1
假设您正在使用bash,则variable=$(cp -v ...)捕获cp的标准输出。参见gnu.org/software/bash/manual/html_node/Command-Substitution.htm
Gowtham,2015年

Answers:


4

cp如果您想看看不采取行动会怎样,GNU不会为您提供任何帮助。如果要记录已修改的文件,可以使用以下-v选项:

cp -puv DIRECTORYA/* DIRECTORYB >copy.log

cp可以使用rsync代替它,它具有更强大的功能,并且几乎可以安装在除低端嵌入式系统之外的所有位置(并且易于安装,默认情况下不存在)。

rsync -aun DIRECTORYA/* DIRECTORYB >what-would-be-done.txt

要么

rsync -auv DIRECTORYA/* DIRECTORYB >copy.log

2

如果要运行cp foo*bar whatever,请echo foo*bar whatever改为运行。


但是OP希望运行cp -u,他正在为cp寻找一个类似空运行的选项。
Arkadiusz Drabczyk 2015年

2

根据手册页

-u, 复制只有当文件更新比目标文件或当目标文件丢失--update

这是一项结合了两项测试的功能,其中一项很容易在脚本中实现(缺少),而一项则需要一些工作(较新)。你可以做一个脚本,报告所需要的使用commdifftest

没有标准cp实用程序提供干运行复制操作的功能。如建议的那样,rsync是使用常用实用程序执行此操作的方法。当然,rsync通常用于基于更多条件的复制,而不仅仅是更新丢失(也使用文件大小和时间戳)。但是它可以简化为公正cp -u

对于非标准实用程序,有copy我在1980年代后期编写(当然仍然使用)的实用程序。它可能是受该make实用程序启发的,因为我添加的第一个选项是-n

对于给定的示例,它将像这样使用:

$ copy -nvU DIRECTORYA/* DIRECTORYB
** copy DIRECTORYA/foo to DIRECTORYB/foo
** 1 file would be copied, 616 bytes

进一步阅读:

  • 复制-文件/目录复制实用程序

    -n 禁用文件的实际创建或修改,并且(取决于详细程度)显示该copy 命令将产生的效果 。
    -u 仅在文件大小或修改日期不同时才复制文件,仅在链接文本不同时才复制链接。
    -U 仅复制比目标更新或目标中不存在的文件。

  • 1988年8月以来的变更日志条目:

    1988-08-16    
            * src / copy / src / copy.c:添加了“ -d”和“ -n”选项。
    

0

您可以使用diff命令。我有一份每天复制一些备份文件的工作。一段时间我需要检查是否所有文件都被复制,这是语法:

diff /file1/ /file2/

当然,如果要复制它们,请使用:

cp -u /file1/* /file2

0

考虑改用rsync。Rsync在本地副本上运行良好,一旦您浏览了它的十五个专长选项,它肯定可以做您想要的。

rsync -avun DIRECTORYA/ DIRECTORYB

将向您展示将要完成的一切,并且

rsync -avu DIRECTORYA/ DIRECTORYB

会做的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.