nix-configs

Personal NixOS and home-manager configuration files
Log | Files | Refs

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 }