使用 find 比较数据库中的文件列表来查找丢失的文件

使用 find 比较数据库中的文件列表来查找丢失的文件

我有数据库中 2000 个文件的列表,如下所示:

./aa/0f/unique-string/IMG_0987.JPG
./ab/cf/unique-string/IMG_0987.JPG

我想将该列表与实际目录内容进行比较,以识别丢失的文件。

以下命令可以单独运行,但是当我编写脚本时则不起作用......

find . -false -samefile ./ab/cf/unique-string/IMG_0987.JPG

我最接近的说法如下:

#!/bin/bash
TEST=`cat ./list.lst`
find . -false -samefile "$TEST"

我做错了。正确的方法是什么?

答案1

您的 find 命令正在使用 list.lst 的全部内容,因为您不是一次输入一行。

while read f; do
find . -false -samefile "$f"
done<./list.lst

这将每次读取文件 list.lst 的一行。

答案2

通过遵循你的策略,你将获得2000x2000 = 4,000,000比较。你可以做得更好。

假设列表是file_t1; 现在我们首先通过以下方式生成 PC 上所有文件的列表

      find . -type f > file_t2

然后我们对两个文件进行排序:

      sort -n file_t1 > file1
      sort -n file_t2 > file2

现在我们使用通信生成差异列表:

      comm -X file1 file2

在哪里:

      X = 12 -> lines that appear in **both** files
      X = 13 -> lines unique to file 2
      X = 23 -> lines unique to file1

这可以用一行代码来实现,但代价是清晰度。

如果你感兴趣的话:这会快得多,因为文件已经排序好了(对通信),因此如果文件大小为 N,则需要 N 阶步骤进行比较。排序需要N对数N操作,因此这是该解决方案中最昂贵的部分,而您提出的解决方案需要N^2操作,这对于您的文件大小来说要长得多。

相关内容