Klasör hiyerarşisinde yinelenen dosya adlarını mı arıyorsunuz?

22

img adında bir klasörüm var; bu klasörde, tümü resim içeren alt klasörlerin birçok düzeyi var. Bunları bir görüntü sunucusuna aktaracağım.

Normalde görüntüler (veya herhangi bir dosya) farklı bir dizin yolunda oldukları veya farklı bir uzantıya sahip oldukları sürece aynı ada sahip olabilirler. Ancak, onları içe aktardığım resim sunucusu, tüm görüntü adlarının benzersiz olmasını gerektirir (uzantılar farklı olsa bile).

Örneğin, background.png ve background.gif resimlerine izin verilmeyecektir çünkü farklı uzantılara sahip olsalar da yine aynı dosya adına sahipler. Ayrı alt klasörlerde olsalar bile, hala benzersiz olmaları gerekir.

Yani aynı ada sahip dosyaların (uzantı hariç) bir listesini bulmak için img klasöründe yinelemeli bir arama yapıp yapamayacağımı merak ediyorum.

Bunu yapabilecek bir komut var mı?

    
sordu JD Isaacks 13.06.2011 17:28

5 cevap

15

FSlint , yinelenen adlar bulmak için bir işlev içeren çok yönlü bir yinelenen bulucu:

Ubuntu için FSlint paketi, grafik arayüzünü vurgular, ancak FSlint SSS 'da açıklandığı gibi komut satırı arabirimi, /usr/share/fslint/fslint/ programında kullanılabilir. Belge için --help seçeneğini kullanın, örn .:

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

Örnek kullanım:

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

Yorumda belirtildiği gibi, bu da klasörleri bulacaktır. İşte dosyaları kısıtlamak için komut:

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

Bunu duplicates.py adlı bir dosyaya kaydedin

#!/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

Ardından dosyayı yürütülebilir yapın:

chmod +x duplicates.py

Örn. böyle:

./duplicates.py ~/images

Aynı basename (1) olan dosya çiftleri çıktı olmalıdır. Python ile yazılmış, onu değiştirebilmelisiniz.

    
verilen cevap loevborg 13.06.2011 23:01
3

Sadece bu "kopyaları" görmeniz gerektiğini, sonra bunları manuel olarak ele almanız gerektiğini varsayıyorum. Eğer öyleyse, bu bash4 kodu istediğinizi yapmalıyım.

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

İlişkilendirilmiş dizi sözdizimi hakkında yardım almak için İşte ve / veya bash elkitabına bakın.

    
verilen cevap geirha 13.06.2011 20:23
1

Bu bir isim:

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

Yürütülebilir yapın:

chmod a+x bname 

Onu davet et:

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

Pro:

  • Bu basit ve basit, dolayısıyla genişletilebilir.
  • Boşlukları, sekmeleri, çizgileri ve sayfa beslemelerini dosya adlarında, afaik olarak işler. (Uzantı adında böyle bir şey olmadığını varsayalım.)

Con:

  • Her zaman dosyanın kendisini bulur ve a.jpg için bir gif bulursa, a.gif için de bir.gif bulur. Yani aynı ana isminin 10 dosyası için, sonunda 100 eşleşme bulunur.
verilen cevap user unknown 13.06.2011 22:15

Etiketlerdeki diğer soruları oku