Wyszukaj zduplikowane nazwy plików w hierarchii folderów?

22

Mam folder o nazwie img , ten folder ma wiele poziomów podfolderów, z których wszystkie zawierają obrazy. Zamierzam zaimportować je do serwera obrazu.

Zwykle obrazy (lub dowolne pliki) mogą mieć tę samą nazwę, pod warunkiem, że znajdują się w innej ścieżce katalogu lub mają inne rozszerzenie. Jednak serwer obrazu, do którego je importuję, wymaga, aby wszystkie nazwy obrazów były unikatowe (nawet jeśli rozszerzenia są różne).

Na przykład obrazy background.png i background.gif nie byłyby dozwolone, ponieważ pomimo tego, że mają różne rozszerzenia, wciąż mają tę samą nazwę pliku. Nawet jeśli są w oddzielnych podfolderach, nadal muszą być unikatowe.

Zastanawiam się, czy mogę wykonać wyszukiwanie cykliczne w folderze img , aby znaleźć listę plików o tej samej nazwie (z wyłączeniem rozszerzenia).

Czy istnieje polecenie, które może to zrobić?

    
zadawane JD Isaacks 13.06.2011, 17:28
źródło

5 odpowiedzi

15

FSlint to wszechstronna wyszukiwarka duplikatów, która zawiera funkcję znajdowania zduplikowanych nazw:

Pakiet FSlint dla Ubuntu podkreśla interfejs graficzny, ale jak wyjaśniono w FAQ FAQ FSlint Interfejs wiersza poleceń jest dostępny za pośrednictwem programów w /usr/share/fslint/fslint/ . Użyj opcji --help dla dokumentacji, np .:

$ /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.

Przykładowe użycie:

$ /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
    
odpowiedział ændrük 13.06.2011, 21:02
źródło
26
find . -mindepth 1 -printf '%h %f\n' | sort -t ' ' -k 2,2 | uniq -f 1 --all-repeated=separate | tr ' ' '/'

Jak zaznaczono w komentarzu, to również znajdzie foldery. Oto polecenie ograniczenia dostępu do plików:

find . -mindepth 1 -type f -printf '%p %f\n' | ...
    
odpowiedział ojblass 13.06.2011, 22:57
źródło
5

Zapisz to w pliku o nazwie 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

Następnie wykonaj plik wykonywalny:

chmod +x duplicates.py

Uruchom na przykład tak:

./duplicates.py ~/images

Powinien wyprowadzić pary plików o tej samej nazwie (1). Napisane w Pythonie, powinieneś być w stanie go zmodyfikować.

    
odpowiedział loevborg 13.06.2011, 23:01
źródło
3

Zakładam, że musisz tylko zobaczyć te "duplikaty", a następnie obsłużyć je ręcznie. Jeśli tak, to ten kod bash4 powinien zrobić to, co chcesz, myślę.

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

Zobacz link i / lub instrukcję bash, aby uzyskać pomoc na temat składni skojarzonej tablicy.

    
odpowiedział geirha 13.06.2011, 20:23
źródło
1

To jest 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"

Ustaw jako wykonywalny:

chmod a+x bname 

Wywołaj:

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

Pro:

  • Jest prosty i prosty, a więc rozszerzalny.
  • Obsługuje puste pola, tabulatory, linebreaki i pagefeeds w nazwach plików, afaik. (Zakładając, że nie ma czegoś takiego w nazwie rozszerzenia).

Con:

  • Znajduje zawsze sam plik, a jeśli znajdzie a.gif dla a.jpg, to znajdzie także plik a.jpg dla a.gif. Tak więc dla 10 plików o tej samej nazwie systemowej znajduje 100 pasujących wyników.
odpowiedział user unknown 13.06.2011, 22:15
źródło

Przeczytaj inne pytania na temat tagów