有没有办法在 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
命令:
- 您可能希望从基本名称而不是整个路径进行定位;所以使用
-b '*.doc'
.
- 你想要单引号内的模式,这样它就不会被当前的 shell 解释器扩展,而只能被
locate
命令扩展。
- 您希望找到的文件实际存在,因此请使用
-e
开关。
- 你想要一个
null
分隔的条目列表,因此迭代路径是安全的,即使它包含 non-printable 特殊字符、空格、换行符、制表符…
- 由于
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 脚本
最后请注意 locate
和 find
之间的一些主要区别:
locate
使用数据库来引用系统内的文件。有一个编程的 cron
作业,用于更新定位数据库(通常每天一次,例如调用 /etc/cron.daily/mlocate
脚本)。 locate
因此速度很快,但它在更新数据库之前也无法找到最近的文件。
find
直接访问文件系统。它递归遍历目录并识别 files/paths 端点类型。它还具有更多选项和功能,例如将路径作为参数传递和执行命令。
如需进一步阅读,请参阅:SuperUser.com: What is the difference between 'locate' and 'find' in Linux?
来自 Unix shell。
我想专门使用 locate <filename>
查找文件,然后我想复制使用 cp
找到的文件。我试过类似的东西:
Locate -name "*.doc" -exec cp {} /path/to/copy/to
如果您想对定位数据库找到的 files-path 执行操作,locate
命令没有 -exec
选项来对定位的文件执行命令(-exec
存在于 find
命令)。
如果使用定位数据库的 locate
命令:
- 您可能希望从基本名称而不是整个路径进行定位;所以使用
-b '*.doc'
. - 你想要单引号内的模式,这样它就不会被当前的 shell 解释器扩展,而只能被
locate
命令扩展。 - 您希望找到的文件实际存在,因此请使用
-e
开关。 - 你想要一个
null
分隔的条目列表,因此迭代路径是安全的,即使它包含 non-printable 特殊字符、空格、换行符、制表符… - 由于
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 脚本
最后请注意 locate
和 find
之间的一些主要区别:
locate
使用数据库来引用系统内的文件。有一个编程的cron
作业,用于更新定位数据库(通常每天一次,例如调用/etc/cron.daily/mlocate
脚本)。locate
因此速度很快,但它在更新数据库之前也无法找到最近的文件。find
直接访问文件系统。它递归遍历目录并识别 files/paths 端点类型。它还具有更多选项和功能,例如将路径作为参数传递和执行命令。
如需进一步阅读,请参阅:SuperUser.com: What is the difference between 'locate' and 'find' in Linux?