我有数据库中 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操作,这对于您的文件大小来说要长得多。