问题描述
在Unix shell中。
我想使用locate <filename>
查找一个文件,然后我想复制使用cp
找到的文件。我尝试过类似的事情:
Locate -name "*.doc" -exec cp {} /path/to/copy/to
解决方法
如果要对由locate数据库找到的文件路径执行操作,则locate
命令没有-exec
选项可以对已定位的文件执行命令(对于{ -exec
命令。
如果使用“定位”数据库的find
命令:
- 您可能想从基本名称而不是整个路径中查找;因此请使用
locate
。 - 您希望模式包含在单引号中,这样它就不会被当前的shell解释器扩展,而只能由
-b '*.doc'
命令扩展。 - 您希望找到的文件实际存在,因此请使用
locate
开关。 - 您需要一个
-e
分隔的条目列表,因此即使路径中包含不可打印的特殊字符,空格,换行符,制表符等,也可以安全地迭代路径。 - 由于
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?