有没有办法在 Unix Shell 中使用 Locate 数据库执行复制?

Is there a way to use the Locate database to perform a copy in Unix Shell?

来自 Unix shell。

我想专门使用 locate <filename> 查找文件,然后我想复制使用 cp 找到的文件。我试过类似的东西:

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

如果您想对定位数据库找到的 files-path 执行操作,locate 命令没有 -exec 选项来对定位的文件执行命令(-exec 存在于 find 命令)。

如果使用定位数据库的 locate 命令:

  1. 您可能希望从基本名称而不是整个路径进行定位;所以使用 -b '*.doc'.
  2. 你想要单引号内的模式,这样它就不会被当前的 shell 解释器扩展,而只能被 locate 命令扩展。
  3. 您希望找到的文件实际存在,因此请使用 -e 开关。
  4. 你想要一个 null 分隔的条目列表,因此迭代路径是安全的,即使它包含 non-printable 特殊字符、空格、换行符、制表符…
  5. 由于 locate 没有直接执行带有参数的命令的方法,因此您可以将输出流通过管道传输到 xargs 来执行。
locate -0eb '*.doc' |
  xargs -0 \
    sh -c 'cp -- "$@" /path/to/copy/to/' _

解释:

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

最后请注意 locatefind 之间的一些主要区别:

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

如需进一步阅读,请参阅:SuperUser.com: What is the difference between 'locate' and 'find' in Linux?