有没有一种方法可以使用Locate数据库在Unix Shell中执行复制?

问题描述

在Unix shell中。

我想使用locate <filename>查找一个文件,然后我想复制使用cp找到的文件。我尝试过类似的事情:

Locate -name "*.doc" -exec cp {} /path/to/copy/to

解决方法

如果要对由locate数据库找到的文件路径执行操作,则locate命令没有-exec选项可以对已定位的文件执行命令(对于{ -exec命令。

如果使用“定位”数据库的find命令:

  1. 您可能想从基本名称而不是整个路径中查找;因此请使用locate
  2. 您希望模式包含在单引号中,这样它就不会被当前的shell解释器扩展,而只能由-b '*.doc'命令扩展。
  3. 您希望找到的文件实际存在,因此请使用locate开关。
  4. 您需要一个-e分隔的条目列表,因此即使路径中包含不可打印的特殊字符,空格,换行符,制表符等,也可以安全地迭代路径。
  5. 由于null不能直接执行带有参数的命令,因此您可以将输出流通过管道传输到locate中来代替。
xargs

说明:

  • locate -0eb '*.doc' | xargs -0 \ sh -c 'cp -- "$@" /path/to/copy/to/' _ :使用定位数据库;找出现在仍然存在且其基本名称与locate -0eb '*.doc'模式匹配的文件,并将该列表输出为*.doc分隔的路径列表。
  • null:将| xargs -0的路径分隔列表传递到null,以将条目作为参数传递给以下命令。
  • xargs:执行随后的内联shell脚本。
  • sh -c:内联shell脚本,它将所有接收的路径作为参数数组cp -- "$@" /path/to/copy/to/'复制到$@中。

最后请注意/path/to/copy/to/locate之间的一些关键区别:

  • find使用数据库来引用系统中的文件。有一个已编程的locate作业,用于更新“定位”数据库(通常每天一次,例如,调用cron脚本)。 /etc/cron.daily/mlocate很快,但它也无法找到最近的文件,除非它更新了其数据库。
  • locate直接访问文件系统。它递归地遍历目录并标识文件/路径端点类型。它还具有更多选项和功能,例如将路径作为参数传递并执行命令。

有关更多信息,请参见:SuperUser.com: What is the difference between 'locate' and 'find' in Linux?