如何使用diff命令在目录中查找具有相同名称部分的文件?

时间:2015-03-17 13:10:16

标签: linux bash

我有两个包含文件的目录。目录A包含带有编号结尾的照片列表(例如janet1.jpg laura2.jpg),目录B具有相同的文件,除了具有不同的编号结尾(例如janet41.jpg laura33.jpg)。如何在忽略编号的结尾的同时找到目录A和B中没有相应文件的文件?例如,目录A中有一个rachael3但目录B中没有rachael \ d。我认为在bash中有一种方法可以处理diff命令,但我没有看到明显的方法。

3 个答案:

答案 0 :(得分:1)

我无法直接使用diff。在两个目录上使用sums工具(md5sha1等)可能会更容易,然后根据第一个(sum)列对这两个文件进行排序,并对这些输出文件进行diff / compare。

或者,像findimagedupes这样的东西(它不像diff那样简单比较或者总和检查)可能是一个更简单(也可能更有用)的解决方案。

答案 1 :(得分:1)

您似乎知道您的文件是相同的,如果它们存在且您确定,每个目录只有一种文件。

所以根据这个diff目录的内容,你只需要获得文件名的相关部分(" laura"," janet")

这可以通过简单地从ls的输出中轻轻填充相应的部分来完成:

ls dir1/ | egrep -o '^[a-A]+'

然后进行比较,让我们说dir1dir2,您可以使用:

diff <(ls dir1/ | egrep -o '^[a-A]+') <(ls dir2/ | egrep -o '^[a-A]+')

答案 2 :(得分:0)

假设文件被简单地重命名并且在其他方​​面相同,找到丢失文件的简单解决方案是使用md5sum(或sha等)和uniq

#!/bin/bash

md5sum A/*.jpg B/*.jpg >index 
awk '{print $1}' <index | sort >sums # delete dir/file

# list unique files (missing from one directory)
uniq -u sums | while read s; do
    grep "$s" index | sed 's/^[a-z0-9]\{32\}  //'
done

在一个文件夹包含重命名的同一文件的多个副本的情况下,此操作失败(这样哈希值与一个文件夹中的多个文件匹配),但是很容易解决:

#!/bin/bash

md5sum A/*.jpg B/*.jpg > index
sed 's/\/.*//' <index | sort >sums # just delete /file

# list unique files (missing from one directory)
uniq sums | awk '{print $1}' |\
uniq -u | while read s junk; do
    grep "$s" index | sed 's/^[a-z0-9]\{32\}  //'
done