我正在创建一个简单的脚本,用于复制 DIRECTORYA 中 DIRECTORYB 中不存在的所有文件。我通过使用 cp 命令来执行此操作:
cp -u DIRECTORYA/* DIRECTORYB
我还想做的是向管理员发送一封电子邮件,其中将列出已复制的文件。
因此,理想情况下,在运行上述命令之前,我希望获取将要复制的文件并将其存储在变量中,以便稍后在构建电子邮件时使用。
有人能指出我正确的方向吗?我研究过使用 grep 但我不认为这可以用 cp 命令来完成?
答案1
cp
如果你想看看 GNU 不采取行动会做什么,我认为 GNU对你没有任何帮助。如果您想记录已修改的文件,可以使用以下-v
选项:
cp -puv DIRECTORYA/* DIRECTORYB >copy.log
cp
您可以使用同步,它的功能要强大得多,除了低端嵌入式系统外几乎所有地方都可以安装(并且在默认情况下不存在的情况下也很容易安装)。
rsync -aunv DIRECTORYA/* DIRECTORYB >what-would-be-done.txt
或者
rsync -auv DIRECTORYA/* DIRECTORYB >copy.log
答案2
根据手册页,
-u
,--update
仅当复制来源文件是较新的比目标文件或当目标文件是丢失的
这是一项结合了两个测试的功能,其中一个在脚本中实现很简单(丢失的)和一个需要一些工作(较新的)。您可以制作一个脚本,使用comm
、diff
和来报告所需内容test
。
没有一个标准cp
实用程序提供空运行复制操作的功能。正如所建议的,rsync
这是使用常用实用程序来执行此操作的方法。当然,rsync
通常用于基于更多标准进行复制,而不仅仅是较新的或者丢失的(还使用文件大小和时间戳)。但它可以简化为只是做cp -u
。
对于非标准实用程序,有copy
我在 20 世纪 80 年代末编写的实用程序(当然现在仍在使用)。它可能是受到该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”选项。
答案3
如果你想跑cp foo*bar whatever
,那就跑吧echo foo*bar whatever
。
答案4
考虑使用 rsync 代替。 Rsync 在本地副本上运行得非常好,一旦您浏览了它拥有的 15 个无数选项,它肯定可以做您想做的事情。
rsync -avun DIRECTORYA/ DIRECTORYB
将向您展示将要完成的一切,并且
rsync -avu DIRECTORYA/ DIRECTORYB
会做的。