nix-configs

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

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 }