如何在多个子目录中查找多个文件?

如何在多个子目录中查找多个文件?

我需要在多个子目录中查找文件列表,并将每个文件的路径保存在 txt 文件中。我在 的列表中列出了所有文件名filenames.txt。我正在尝试这样做:

while read -r fname; do
    find . -name "$fname" > paths.txt
done < filenames.txt

它是否正确?尽管我知道我有很多子目录(200k)需要搜索,但似乎花费的时间比我预期的要多得多。有更好的方法吗?谢谢

答案1

您运行 find 多次,对 filenames.txt 中的每一行运行一次 - 这可能是瓶颈。

您可以尝试相反的过程 - 首先找到所有文件,然后将其与列表中的文件进行比较。就像是

find * > allfiles.txt
grep -f filenames.txt allfiles.txt

答案2

你可以这样做:

find . -print0 | gawk -F/ '
   ARGIND == 1 {selected[$0]; next}
   $NF in selected' filenames.txt RS='\0' -

也就是说,有find报告全部gawk文件,但使用根据 . 的内容构建的哈希表进行过滤filenames.txt

这样,您find只需运行一次并以更有效的方式进行匹配。

假设filenames.txt是包含文字文件名列表,而不是通配符模式列表(find's-name需要通配符模式,而不是文字文件名)。

相关内容