1

我有一个很大的文件列表,我需要检查它们是否在我的 linux 服务器上的某个地方。其中有些可能是,有些可能不是。

是否有命令行工具来执行此操作?

或者我必须求助于在 shell 脚本中循环查找?

4

3 回答 3

1

我假设您有一个没有路径的文件名列表(都是唯一的)。我建议使用定位

假设你有文件名:files.txt

cat files.txt | xargs -n1 -I@ locate -b '\@' | xargs -n1 -I@ basename @ | uniq > found.txt

然后只是区分文件。

diff files.txt found.txt

哦,一个澄清。这将告诉您文件是否存在于您的计算机中,而不是在哪里:)

如果您想知道简单的运行位置:

cat files.txt | xargs -n1 -I@ locate -b '\@' 

--dmg

于 2013-04-30T09:50:45.120 回答
1

还有另一种选择,它依赖于使用 find。这个想法是运行一次查找,保存所有文件名,然后将它们与文件列表进行比较。

首先,必须对文件列表进行排序:让我们调用 sortedFiles.txt

 find / -type f | xargs -n1 -I@ basename '@' | sort -u > /tmp/foundFiles.txt

现在比较它们,只打印第一个文件中的那些,而不是第二个文件中的

 comm -23 /tmp/sortedFiles.txt /tmp/foundFiles.txt

这会告诉你那些不在计算机中的。

如果您想要计算机中的那些,请使用:

 comm -12 /tmp/sortedFiles.txt /tmp/foundFiles.txt

这将告诉您计算机中的那些。缺点是你不知道它们在哪里。:)

或者运行查找:

find / -type f > /tmp/allFiles.txt

然后使用 grep 进行迭代,确保匹配最后 / 的行尾

 cat /tmp/filesToFind.txt | xargs -n1 -I@ egrep '/@$' /tmp/allFiles.txt

这将仅打印找到的文件的位置,但不会打印未找到的文件。

--dmg

于 2013-04-30T10:16:39.390 回答
0

如果您执行循环,最好使用定位而不是查找。它更快!

如果 lista 包含文件名,您可以使用:

cat lista | xargs locate
于 2013-04-30T10:07:05.413 回答