【问题标题】:I am trying to use mlocate and for loops in bash to search for a multitude of files我正在尝试在 bash 中使用 mlocate 和 for 循环来搜索大量文件
【发布时间】:2020-07-31 00:20:52
【问题描述】:

所以在 bash 中,如果我愿意,我可以简单地做(其中 foo 是文件的路径列表):

for i in `cat foo`; do ls -lah $i; done

我有一个需要搜索的文件列表。我的想法是;为什么不使用 mlocate 通过 for 循环运行它们?我可以这样做:

for i in `cat foo`; do locate $i; done

...但这是做我想做的最好的方法吗?

当有数百万个文件和目录时,Find 很慢并且需要很长时间,而 mlocate 非常快。

【问题讨论】:

    标签: linux bash loops find locate


    【解决方案1】:

    如果 files.txt 包含带有 换行符绝对路径列表,您可以这样做以确保它们全部存在:

    set -o errexit
    mapfile -t < files.txt
    for path in "${MAPFILE[@]}"
    do
        [[ -e "$path" ]]
    done
    

    如果您想对现有/不存在的文件执行某些操作,则可以对此进行扩展:

    if [[ -e "$path" ]]
    then
        …
    else
        …
    fi
    

    如果 files.txt 太大以至于列表无法放入内存中,您可以使用慢得多 while read 循环:

    while read -r -u 9 path
    do
        [[ -e "$path" ]]
    done 9< files.txt
    

    如果速度真的很重要,您可能希望使用其他语言来执行此操作,例如 Java 或 Rust。

    在技术方面,mlocate 速度很快,因为它会查询系统上预先生成的文件列表,但它的数据库不会自动与实际文件系统内容保持同步。相反,您需要运行 updatedb 以使用当前文件系统内容填充数据库。这通常由根 cron 作业每天完成。

    就样式而言,$(COMMAND)Use More Quotes™ 已弃用反引号。

    【讨论】:

    • 是的,我知道我可以使用其他东西,但希望继续使用 mlocate。如果我想确保搜索真正是最新的,我知道需要运行 updatedb 并且我们每晚都有一个 cron 工作来做这件事。即使手动运行它,处理大量文件也只需要大约 30 秒,所以这并不难。
    猜你喜欢
    • 1970-01-01
    • 2022-06-22
    • 2014-02-23
    • 1970-01-01
    • 2022-10-16
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 2018-12-06
    相关资源
    最近更新 更多