要检查的文件列表是否存在

时间:2013-04-30 09:43:40

标签: linux shell

我有一大堆文件,我需要检查它们是否在我的linux服务器上。其中一些可能是,其中一些可能不是。

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

或者我必须在shell脚本中使用循环查找吗?

3 个答案:

答案 0 :(得分:1)

我假设您有一个没有路径的文件名列表(全部唯一)。我建议使用locate

假设您的文件包含文件名: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

答案 1 :(得分:1)

还有另一种选择,它依赖于使用find。想法是运行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:

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

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

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

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

- DMG

答案 2 :(得分:0)

如果你进行循环,最好使用locate而不是find。它更快!

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

cat lista | xargs locate