我尝试在bash中使用mlocate和for循环来搜索大量文件



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

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

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

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

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

当有数百万个文件和目录时,查找速度很慢,而且需要很长时间,而mlocate则非常快。

如果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的backtick™.

最新更新