我有两个包含文件的目录。目录A包含带有编号结尾的照片列表(例如janet1.jpg laura2.jpg),目录B具有相同的文件,除了具有不同的编号结尾(例如janet41.jpg laura33.jpg)。如何在忽略编号的结尾的同时找到目录A和B中没有相应文件的文件?例如,目录A中有一个rachael3但目录B中没有rachael \ d。我认为在bash中有一种方法可以处理diff命令,但我没有看到明显的方法。
答案 0 :(得分:1)
我无法直接使用diff
。在两个目录上使用sums工具(md5
,sha1
等)可能会更容易,然后根据第一个(sum)列对这两个文件进行排序,并对这些输出文件进行diff / compare。
或者,像findimagedupes
这样的东西(它不像diff
那样简单比较或者总和检查)可能是一个更简单(也可能更有用)的解决方案。
答案 1 :(得分:1)
您似乎知道您的文件是相同的,如果它们存在且您确定,每个目录只有一种文件。
所以根据这个diff
目录的内容,你只需要获得文件名的相关部分(" laura"," janet")
这可以通过简单地从ls
的输出中轻轻填充相应的部分来完成:
ls dir1/ | egrep -o '^[a-A]+'
然后进行比较,让我们说dir1
和dir2
,您可以使用:
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