duplicate-filenames.nix (1475B)
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> [dir3 ...]" 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 [[ $# -ge 2 ]] || usage 25 26 for dir in "$@"; do 27 [[ -d "$dir" ]] || { 28 echo "Not a directory: $dir" 29 exit 1 30 } 31 done 32 33 run_find() { 34 local dir=$1 35 if $recursive; then 36 find "$dir" -type f -print0 37 else 38 find "$dir" -maxdepth 1 -type f -print0 39 fi 40 } 41 42 declare -A files 43 44 for dir in "$@"; do 45 while IFS= read -r -d "" file; do 46 base=''${file##*/} 47 48 files["$base"]+="$file 49 " 50 done < <(run_find "$dir") 51 done 52 53 for base in "''${!files[@]}"; do 54 matches=''${files["$base"]} 55 56 count=0 57 while IFS= read -r match; do 58 [[ -n "$match" ]] && ((count += 1)) 59 done <<< "$matches" 60 61 (( count > 1 )) || continue 62 63 printf "MATCH: %s\n" "$base" 64 65 while IFS= read -r match; do 66 [[ -n "$match" ]] || continue 67 printf " %s\n" "$match" 68 done <<< "$matches" 69 70 printf "\n" 71 done 72 '') 73 ]; 74 }