Cerca nomi di file duplicati all'interno della gerarchia di cartelle?

22

Ho una cartella chiamata img , questa cartella ha molti livelli di sotto-cartelle, tutte contenenti immagini. Ho intenzione di importarli in un server di immagini.

Normalmente le immagini (o qualsiasi file) possono avere lo stesso nome purché si trovino in un percorso di directory diverso o abbiano un'estensione diversa. Tuttavia, il server di immagini in cui li sto importando richiede che tutti i nomi delle immagini siano univoci (anche se le estensioni sono diverse).

Ad esempio, le immagini background.png e background.gif non sarebbero consentite perché pur avendo estensioni differenti hanno ancora lo stesso nome file. Anche se si trovano in sottocartelle separate, devono comunque essere univoci.

Quindi mi chiedo se posso fare una ricerca ricorsiva nella cartella img per trovare un elenco di file con lo stesso nome (esclusa l'estensione).

C'è un comando che può farlo?

    
posta JD Isaacks 13.06.2011 - 17:28
fonte

5 risposte

15

FSlint è un versatile cercatore di duplicati che include una funzione per trovare i nomi duplicati:

Il pacchetto FSlint per Ubuntu enfatizza l'interfaccia grafica, ma come spiegato nelle FAQ di FSlint a l'interfaccia della riga di comando è disponibile tramite i programmi in /usr/share/fslint/fslint/ . Utilizza l'opzione --help per la documentazione, ad esempio:

$ /usr/share/fslint/fslint/fslint --help
File system lint.
A collection of utilities to find lint on a filesystem.
To get more info on each utility run 'util --help'.

findup -- find DUPlicate files
findnl -- find Name Lint (problems with filenames)
findu8 -- find filenames with invalid utf8 encoding
findbl -- find Bad Links (various problems with symlinks)
findsn -- find Same Name (problems with clashing names)
finded -- find Empty Directories
findid -- find files with dead user IDs
findns -- find Non Stripped executables
findrs -- find Redundant Whitespace in files
findtf -- find Temporary Files
findul -- find possibly Unused Libraries
zipdir -- Reclaim wasted space in ext2 directory entries
$ /usr/share/fslint/fslint/findsn --help
find (files) with duplicate or conflicting names.
Usage: findsn [-A -c -C] [[-r] [-f] paths(s) ...]

If no arguments are supplied the $PATH is searched for any redundant
or conflicting files.

-A reports all aliases (soft and hard links) to files.
If no path(s) specified then the $PATH is searched.

If only path(s) specified then they are checked for duplicate named
files. You can qualify this with -C to ignore case in this search.
Qualifying with -c is more restictive as only files (or directories)
in the same directory whose names differ only in case are reported.
I.E. -c will flag files & directories that will conflict if transfered
to a case insensitive file system. Note if -c or -C specified and
no path(s) specifed the current directory is assumed.

Esempio di utilizzo:

$ /usr/share/fslint/fslint/findsn /usr/share/icons/ > icons-with-duplicate-names.txt
$ head icons-with-duplicate-names.txt 
-rw-r--r-- 1 root root    683 2011-04-15 10:31 Humanity-Dark/AUTHORS
-rw-r--r-- 1 root root    683 2011-04-15 10:31 Humanity/AUTHORS
-rw-r--r-- 1 root root  17992 2011-04-15 10:31 Humanity-Dark/COPYING
-rw-r--r-- 1 root root  17992 2011-04-15 10:31 Humanity/COPYING
-rw-r--r-- 1 root root   4776 2011-03-29 08:57 Faenza/apps/16/DC++.xpm
-rw-r--r-- 1 root root   3816 2011-03-29 08:57 Faenza/apps/22/DC++.xpm
-rw-r--r-- 1 root root   4008 2011-03-29 08:57 Faenza/apps/24/DC++.xpm
-rw-r--r-- 1 root root   4456 2011-03-29 08:57 Faenza/apps/32/DC++.xpm
-rw-r--r-- 1 root root   7336 2011-03-29 08:57 Faenza/apps/48/DC++.xpm
-rw-r--r-- 1 root root    918 2011-03-29 09:03 Faenza/apps/16/Thunar.png
    
risposta data ændrük 13.06.2011 - 21:02
fonte
26
find . -mindepth 1 -printf '%h %f\n' | sort -t ' ' -k 2,2 | uniq -f 1 --all-repeated=separate | tr ' ' '/'

Come dice il commento, troverà anche le cartelle. Ecco il comando per limitarlo ai file:

find . -mindepth 1 -type f -printf '%p %f\n' | ...
    
risposta data ojblass 13.06.2011 - 22:57
fonte
5

Salva questo in un file chiamato duplicates.py

#!/usr/bin/env python

# Syntax: duplicates.py DIRECTORY

import os, sys

top = sys.argv[1]
d = {}

for root, dirs, files in os.walk(top, topdown=False):
    for name in files:
        fn = os.path.join(root, name)
        basename, extension = os.path.splitext(name)

        basename = basename.lower() # ignore case

        if basename in d:
            print(d[basename])
            print(fn)
        else:
            d[basename] = fn

Quindi rendi il file eseguibile:

chmod +x duplicates.py

Esegui ad es. così:

./duplicates.py ~/images

Dovrebbe generare coppie di file con lo stesso nome di base (1). Scritto in python, dovresti essere in grado di modificarlo.

    
risposta data loevborg 13.06.2011 - 23:01
fonte
3

Suppongo che tu debba solo vedere questi "duplicati", quindi gestirli manualmente. Se è così, questo codice bash4 dovrebbe fare quello che vuoi, penso.

declare -A array=() dupes=()
while IFS= read -r -d '' file; do 
    base=${file##*/} base=${base%.*}
    if [[ ${array[$base]} ]]; then 
        dupes[$base]+=" $file"
    else
        array[$base]=$file
    fi
done < <(find /the/dir -type f -print0)

for key in "${!dupes[@]}"; do 
    echo "$key: ${array[$key]}${dupes[$key]}"
done

Vedi link e / o il manuale di bash per la guida sulla sintassi dell'array associativo.

    
risposta data geirha 13.06.2011 - 20:23
fonte
1

Questo è bname:

#!/bin/bash
#
#  find for jpg/png/gif more files of same basename 
#
# echo "processing () "
bname=$(basename "" .)
find -name "$bname.jpg" -or -name "$bname.png"

Rendilo eseguibile:

chmod a+x bname 

Richiamalo:

for ext in jpg png jpeg gif tiff; do find -name "*.$ext" -exec ./bname "{}" $ext ";"  ; done

Pro:

  • È semplice e diretto, quindi estendibile.
  • Gestisce spazi vuoti, tabulazioni, interruzioni di riga e avanzamenti di pagina nei nomi dei file, afaik. (Supponendo che non ci sia nulla nel nome-estensione).

Con:

  • Trova sempre il file stesso, e se trova a.gif per a.jpg, troverà anche a.jpg per a.gif. Quindi, per 10 file con lo stesso nome base, trova 100 corrispondenze alla fine.
risposta data user unknown 13.06.2011 - 22:15
fonte

Leggi altre domande sui tag