duplicate-filenames.nix (1327B)
1 { pkgs, ... }: 2 3 { 4 environment.systemPackages = [ 5 (pkgs.writeShellScriptBin "duplicate-filenames" '' 6 set -euo pipefail 7 8 usage() { 9 echo "Usage: $0 [-r] <dir1> <dir2>" 10 echo " -r Search recursively" 11 exit 1 12 } 13 14 recursive=false 15 16 while getopts ":r" opt; do 17 case "$opt" in 18 r) recursive=true ;; 19 *) usage ;; 20 esac 21 done 22 shift $((OPTIND - 1)) 23 24 [[ $# -eq 2 ]] || usage 25 26 dir1=$1 27 dir2=$2 28 29 [[ -d "$dir1" && -d "$dir2" ]] || { 30 echo "Both arguments must be directories." 31 exit 1 32 } 33 34 run_find() { 35 local dir=$1 36 if $recursive; then 37 find "$dir" -type f -print0 38 else 39 find "$dir" -maxdepth 1 -type f -print0 40 fi 41 } 42 43 declare -A files1 44 45 while IFS= read -r -d "" file; do 46 base=''${file##*/} 47 files1["$base"]+="$file 48 " 49 done < <(run_find "$dir1") 50 51 while IFS= read -r -d "" file; do 52 base=''${file##*/} 53 matches=''${files1["$base"]:-} 54 [[ -n "$matches" ]] || continue 55 56 while IFS= read -r match; do 57 [[ -n "$match" ]] || continue 58 printf "MATCH:\n %s\n %s\n\n" "$match" "$file" 59 done <<< "$matches" 60 done < <(run_find "$dir2") 61 '') 62 ]; 63 }