查找两个文件夹之间的公共文件

Gra*_*ant 6 linux bash

给定两个根文件夹 A 和 B,

如何在 A 和 B 的子文件夹之间找到重复的文本文件?

换句话说,我正在考虑 A 和 B 的文件的交集。

我不想在 A 或 B 中查找重复的文件,而只想在 A 和 B 中查找文件。

编辑

重复是指具有相同内容的文件

P..*_*... 6

comm -1 -2 <(ls dir1 | sort) <(ls dir2 | sort)
f1

ls -1 dir1
f1
f2
f3


ls -1 dir2
f1
f4
f5


comm -1 -2 <(ls dir1 | sort) <(ls dir2 | sort)
f1

#If not on bash,then 
bash -c 'comm -1 -2 <(ls dir1 | sort) <(ls dir2 | sort)'
Run Code Online (Sandbox Code Playgroud)

或者使用查找。

find dir1 dir2 -type f -ls | awk -F'/' 'N[$2]++ {print $NF}'
f1
Run Code Online (Sandbox Code Playgroud)

或者完整路径

find dir1 dir2 -type f -ls | awk '{print $NF}' | awk -F'/' 'N[$2]++'
dir2/f1
Run Code Online (Sandbox Code Playgroud)

用于查找内容方面的重复项。

files1=(dir1/*)
files2=(dir2/*)


for item1 in ${files1[*]}

do
   ck1=$(cksum $item1 |awk '{print $1}')
   for item2 in ${files2[*]}
       do
         ck2=$(cksum $item2 |awk '{print $1}')

         if [ "$ck1" == "$ck2" ];then
            echo "Duplicate entry found for $item1 and $item2"
         fi
   done


done
Run Code Online (Sandbox Code Playgroud)


Mar*_*ell 4

如评论部分所示,我将为每个文件生成一个 MD5 校验和,仅一次 - 然后查找重复的校验和。

像这样的东西:

find DirA -name \*.txt -exec md5sum {} +  > /tmp/a
find DirB -name \*.txt -exec md5sum {} +  > /tmp/b
Run Code Online (Sandbox Code Playgroud)

现在找到两个文件中出现的所有校验和。

所以,沿着这些思路:

awk 'FNR==NR{md5[$1];next}$1 in md5' /tmp/[ab]
Run Code Online (Sandbox Code Playgroud)

或者也许像这样:

awk 'FNR==NR{s=$1;md5[s];$1="";name[s]=$0;next}$1 in md5{s=$1;$1="";print name[s] " : " $0}' /tmp/[ab]
Run Code Online (Sandbox Code Playgroud)