我需要在多个子目录中查找文件列表,并将每个文件的路径保存在 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
需要通配符模式,而不是文字文件名)。