#!/usr/bin/perl
use strict;
use warnings;
use Digest::SHA qw(sha256_hex);
use File::Find;

my %file_hashes;
my %size_map;

# Recursively find all files
find(\&process_file, '.');

# Compare hashes for files of the same size
foreach my $size (keys %size_map) {
    next unless @{$size_map{$size}} > 1;  # Ignore unique sizes

    foreach my $file (@{$size_map{$size}}) {
        open my $fh, '<', $file or next;
        binmode($fh);
        my $hash = sha256_hex(do { local $/; <$fh> });
        close $fh;

        push @{ $file_hashes{$hash} }, $file;
    }
}

# Print duplicate files
foreach my $hash (keys %file_hashes) {
    next unless @{$file_hashes{$hash}} > 1;  # Ignore unique files

    print "Duplicate files:\n";
    print join("\n", @{$file_hashes{$hash}}), "\n\n";
}

sub process_file {
    return unless -f $_;  # Ignore directories
    push @{ $size_map{(stat($_))[7]} }, $File::Find::name;
}

