所以在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™.