• Как найти повторяющиеся файлы с одинаковым именем, но в другом случае, которые существуют в той же директории в Linux?

    {stack_txt_0}/www/images/taxi.jpg /www/images/Taxi.jpg {stack_txt_1}/www/

  • Ответы

  • {stack_txt_0}perl -pe 's!([^/]+)$!lc $1!e'

    Что будет в Нижнем регистре только именем часть пути.

    Редактировать 1: На самом деле вся проблема может быть решена с:

    find . | perl -ne 's!([^/]+)$!lc $1!e; print if 1 == $seen{$_}++' 

    Редактировать 3: я нашел решение, используя СЭД, команды SORT и uniq, которые также будут распечатывать дубликаты, но это работает только если нет пробелов в именах файлов:

    find . |sed 's,\(.*\)/\(.*\)$,\1/\2\t\1/\L\2,'|sort|uniq -D -f 1|cut -f 1 {stack_txt_3}find{stack_txt_4}#!/usr/bin/perl -w  use strict; use warnings;  my %dup_series_per_dir; while (<>) {     my ($dir, $file) = m!(.*/)?([^/]+?)$!;     push @{$dup_series_per_dir{$dir||'./'}{lc $file}}, $file; }  for my $dir (sort keys %dup_series_per_dir) {     my @all_dup_series_in_dir = grep { @{$_} > 1 } values %{$dup_series_per_dir{$dir}};     for my $one_dup_series (@all_dup_series_in_dir) {         print "$dir\{" . join(',', sort @{$one_dup_series}) . "}\n";     } } {stack_txt_5}

    Попробовать:

    ls -1 | tr '[A-Z]' '[a-z]' | sort | uniq -c | grep -v " 1 " {stack_txt_1}ls -1{stack_txt_2}tr '[A-Z]' '[a-z]' преобразует все прописные буквы на строчные, в sort{stack_txt_4}uniq -c{stack_txt_5}grep -v " 1 "{stack_txt_6}qq{stack_txt_7}qQ{stack_txt_8}2 qq {stack_txt_9}ls -1{stack_txt_10}find .{stack_txt_11}find DIRNAME{stack_txt_12}DIRNAME{stack_txt_13}2 ./.gconf/system/gstreamer/0.10/audio/profiles/mp3 2 ./.gconf/system/gstreamer/0.10/audio/profiles/mp3/%gconf.xml 2 ./.gnome2/accels/blackjack 2 ./qq {stack_txt_14}pax> ls -1d .gnome2/accels/[bB]* .gconf/system/gstreamer/0.10/audio/profiles/[mM]* [qQ]? .gconf/system/gstreamer/0.10/audio/profiles/mp3 .gconf/system/gstreamer/0.10/audio/profiles/MP3 .gnome2/accels/blackjack .gnome2/accels/Blackjack qq qQ {stack_txt_15}tr будут в Нижнем регистре все компоненты пути, так что мы оба

    /a/b/c /a/B/c {stack_txt_17}perl -ne '     chomp;     @flds = split (/\//);     $lstf = $f[-1];     $lstf =~ tr/A-Z/a-z/;     for ($i =0; $i ne $#flds; $i++) {         print "$f[$i]/";     };     print "$x\n";' {stack_txt_18}tr '[A-Z]' '[a-z]' {stack_txt_19}find -type f чтобы ограничить то, что вернулся.

    {stack_txt_0}ls | sort -f | uniq -i -d {stack_txt_1}
    {stack_txt_0}findsn{stack_txt_1}fslint{stack_txt_2}/findsn --help find (files) with duplicate or conflicting names. Usage: findsn [-A -c -C] [[-r] [-f] paths(s) ...]

    Если никакие аргументы не заданы в $Path ищется любые избыточные или конфликтующие файлы.

    -A  reports all aliases (soft and hard links) to files.     If no path(s) specified then the $PATH is searched. {stack_txt_4}
    {stack_txt_0}find . | sort -f | uniq -i -d

    Вот пример, как найти все дубликаты файлов jar:

    find . -type f -printf "%f\n" -name "*.jar" | sort -f | uniq -i -d {stack_txt_1}
    {stack_txt_0}#! /bin/sh # find duplicated files in directory tree # comparing by file NAME, SIZE or MD5 checksum # -------------------------------------------- # LICENSE(s): BSD / CDDL # -------------------------------------------- # vermaden [AT] interia [DOT] pl # http://strony.toya.net.pl/~vermaden/links.htm __usage() { echo "usage: $( basename ${0} ) OPTION DIRECTORY" echo " OPTIONS: -n check by name (fast)" echo " -s check by size (medium)" echo " -m check by md5 (slow)" echo " -N same as '-n' but with delete instructions printed" echo " -S same as '-s' but with delete instructions printed" echo " -M same as '-m' but with delete instructions printed" echo " EXAMPLE: $( basename ${0} ) -s /mnt" exit 1 } __prefix() { case $( id -u ) in (0) PREFIX="rm -rf" ;; (*) case $( uname ) in (SunOS) PREFIX="pfexec rm -rf" ;; (*) PREFIX="sudo rm -rf" ;; esac ;; esac } __crossplatform() { case $( uname ) in (FreeBSD) MD5="md5 -r" STAT="stat -f %z" ;; (Linux) MD5="md5sum" STAT="stat -c %s" ;; (SunOS) echo "INFO: supported systems: FreeBSD Linux" echo echo "Porting to Solaris/OpenSolaris" echo " -- provide values for MD5/STAT in '$( basename ${0} ):__crossplatform()'" echo " -- use digest(1) instead for md5 sum calculation" echo " $ digest -a md5 file" echo " -- pfexec(1) is already used in '$( basename ${0} ):__prefix()'" echo exit 1 (*) echo "INFO: supported systems: FreeBSD Linux" exit 1 ;; esac } __md5() { __crossplatform :> ${DUPLICATES_FILE} DATA=$( find "${1}" -type f -exec ${MD5} {} ';' | sort -n ) echo "${DATA}" \ | awk '{print $1}' \ | uniq -c \ | while read LINE do COUNT=$( echo ${LINE} | awk '{print $1}' ) [ ${COUNT} -eq 1 ] && continue SUM=$( echo ${LINE} | awk '{print $2}' ) echo "${DATA}" | grep ${SUM} >> ${DUPLICATES_FILE} done echo "${DATA}" \ | awk '{print $1}' \ | sort -n \ | uniq -c \ | while read LINE do COUNT=$( echo ${LINE} | awk '{print $1}' ) [ ${COUNT} -eq 1 ] && continue SUM=$( echo ${LINE} | awk '{print $2}' ) echo "count: ${COUNT} | md5: ${SUM}" grep ${SUM} ${DUPLICATES_FILE} \ | cut -d ' ' -f 2-10000 2> /dev/null \ | while read LINE do if [ -n "${PREFIX}" ] then echo " ${PREFIX} \"${LINE}\"" else echo " ${LINE}" fi done echo done rm -rf ${DUPLICATES_FILE} } __size() { __crossplatform find "${1}" -type f -exec ${STAT} {} ';' \ | sort -n \ | uniq -c \ | while read LINE do COUNT=$( echo ${LINE} | awk '{print $1}' ) [ ${COUNT} -eq 1 ] && continue SIZE=$( echo ${LINE} | awk '{print $2}' ) SIZE_KB=$( echo ${SIZE} / 1024 | bc ) echo "count: ${COUNT} | size: ${SIZE_KB}KB (${SIZE} bytes)" if [ -n "${PREFIX}" ] then find ${1} -type f -size ${SIZE}c -exec echo " ${PREFIX} \"{}\"" ';' else # find ${1} -type f -size ${SIZE}c -exec echo " {} " ';' -exec du -h " {}" ';' find ${1} -type f -size ${SIZE}c -exec echo " {} " ';' fi echo done } __file() { __crossplatform find "${1}" -type f \ | xargs -n 1 basename 2> /dev/null \ | tr '[A-Z]' '[a-z]' \ | sort -n \ | uniq -c \ | sort -n -r \ | while read LINE do COUNT=$( echo ${LINE} | awk '{print $1}' ) [ ${COUNT} -eq 1 ] && break FILE=$( echo ${LINE} | cut -d ' ' -f 2-10000 2> /dev/null ) echo "count: ${COUNT} | file: ${FILE}" FILE=$( echo ${FILE} | sed -e s/'\['/'\\\['/g -e s/'\]'/'\\\]'/g ) if [ -n "${PREFIX}" ] then find ${1} -iname "${FILE}" -exec echo " ${PREFIX} \"{}\"" ';' else find ${1} -iname "${FILE}" -exec echo " {}" ';' fi echo done } # main() [ ${#} -ne 2 ] && __usage [ ! -d "${2}" ] && __usage DUPLICATES_FILE="/tmp/$( basename ${0} )_DUPLICATES_FILE.tmp" case ${1} in (-n) __file "${2}" ;; (-m) __md5 "${2}" ;; (-s) __size "${2}" ;; (-N) __prefix; __file "${2}" ;; (-M) __prefix; __md5 "${2}" ;; (-S) __prefix; __size "${2}" ;; (*) __usage ;; esac {stack_txt_1}OLD : find "${1}" -type f | xargs -n 1 basename NEW : find "${1}" -type f -printf "%f\n" {stack_txt_2}
    find -type d -exec sh -c " ls {} | uniq -cid" \;  {stack_txt_1}find -type f  -exec readlink -m {} \; | gawk 'BEGIN{FS="/";OFS="/"}{$NF=tolower($NF);print}' | uniq -c {stack_txt_2}

    Я просто использовал fdupes на CentOS убирать целый тайского бокса дубликатов файлов...

    ням установить fdupes

    {stack_txt_0}find . -type f | awk -F/ '{print $NF}' | sort -f | uniq -i -d {stack_txt_1}find{stack_txt_2}awk{stack_txt_3}sort{stack_txt_4}uniq{stack_txt_5}