【问题标题】:Is there a way to use the Locate database to perform a copy in Unix Shell?有没有办法使用 Locate 数据库在 Unix Shell 中执行复制?
【发布时间】:2021-01-08 00:40:48
【问题描述】:

来自 Unix shell。

我想找到一个专门使用locate <filename> 的文件,然后我想复制使用cp 定位的文件。我尝试过类似的方法:

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

【问题讨论】:

  • 腻子是无关紧要的。无论您如何连接,使用 shell 都是一样的。
  • 你需要把\;放在-exec参数的末尾。
  • locate 全部小写。很少有 Unix 命令的名称中包含大写字母。
  • 你的论点是针对find,而不是locate
  • find . -name "*.doc" -exec cp {} /path/to/copy/to \;

标签: bash shell unix locate


【解决方案1】:

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

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

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

解释:

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

最后注意locatefind之间的一些关键区别:

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

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

【讨论】:

  • 感谢您的回复和解释。我试过这个并收到以下错误
  • @yakshpatel 错误代码丢失。尽管您的系统可用的locatexargs 命令可能因选项而异,尤其是那些可用于MacOS 的选项。在阅读您的系统提供的 locatexargs 的手册页后,您可能需要调整我的答案。
猜你喜欢
  • 2013-08-12
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
  • 2019-04-14
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 2017-10-09
相关资源
最近更新 更多