我正在创建一个简单的脚本,用于复制 DIRECTORYA 中不存在于 DIRECTORYB 中的所有文件。我是通过使用 cp 命令来做到这一点的:
cp -u DIRECTORYA/* DIRECTORYB
Run Code Online (Sandbox Code Playgroud)
我还想做的是向管理员发送一封电子邮件,其中将列出已复制的文件。
所以理想情况下,在我运行上述命令之前,我想获取将被复制的文件并将它们存储在一个变量中,以便以后在构建我的电子邮件时使用。
有人能指出我正确的方向吗?我已经研究过使用 grep 但我认为这不能用 cp 命令来完成?
cp
如果你想看看它不采取行动会做什么,我认为 GNU对你没有任何帮助。如果要记录被修改的文件,可以使用以下-v
选项:
cp -puv DIRECTORYA/* DIRECTORYB >copy.log
Run Code Online (Sandbox Code Playgroud)
代替cp
,您可以使用rsync,它功能更强大,几乎可以安装在除低端嵌入式系统之外的任何地方(并且易于安装在默认情况下不存在的地方)。
rsync -aunv DIRECTORYA/* DIRECTORYB >what-would-be-done.txt
Run Code Online (Sandbox Code Playgroud)
或者
rsync -auv DIRECTORYA/* DIRECTORYB >copy.log
Run Code Online (Sandbox Code Playgroud)
根据手册页,
-u
, 复制只有当源文件更新比目标文件或当目标文件丢失--update
这是一个结合了两个测试的功能,一个在脚本中很容易实现(缺少),另一个需要一些工作(更新)。您可以使用comm
,diff
和制作一个报告所需内容的脚本test
。
标准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
Run Code Online (Sandbox Code Playgroud)
进一步阅读:
-n
禁用文件的实际创建或修改,并且(取决于详细程度)显示copy
命令将具有的效果 。
-u
仅当文件大小或修改日期不同时才复制文件,仅当链接文本不同时才链接。
-U
仅复制比目标新的文件或目标中不存在的文件。
1988 年 8 月的变更日志条目:
1988-08-16 * src/copy/src/copy.c:添加了“-d”和“-n”选项。
归档时间: |
|
查看次数: |
18452 次 |
最近记录: |