Найти файлы с тем же именем, но другим содержанием?

Диск и планирование памяти совершенно отличаются. В отсутствие приоритетного планировщика IO IO будет обработан по принципу "первым прибыл, первым обслужен". Если система является связанным IO, то все процессы работают в более или менее круговом основании, пока все не ожидают ввода-вывода. Хороший приоритет процесса окажет мало влияния на свою частоту планирования.

Последние версии Linux добавили ionice средство. Неактивный приоритет предназначается для предотвращения неисправности IO, которая может произойти, когда головами двигают в другую область дисковых записей задержки для других процессов.

Renicing ввод-вывод, связанный процесс маловероятен к значительно медленному свой уровень ввода-вывода, если среднее число загрузки не превышает количество центральных процессоров. Если неиспользованные циклы ЦП будут доступны, то процесс, как будут, вероятно, планировать, достаточно часто сохранит свой уровень ввода-вывода близко к тому, чем это было бы в регулярном приоритете.

Недавние ядра Linux изменят приоритет IO процесса reniced, которым не установили приоритет IO. 40 приоритетных уровней ЦП отображаются на 8 приоритетных уровнях IO, таким образом, значительное хорошее изменение может потребоваться, чтобы изменять приоритет IO.

Наличие значительного количества зависящих от ЦП процессов, работающих в или выше связанного приоритета процессов ввода-вывода, может замедлить свой уровень ввода-вывода. Процесс все еще получит интервалы времени, приводящие к появлению ввода-вывода.

9
07.03.2012, 04:23
4 ответа

Обновление: зафиксированный опечатка в сценарии: измененный print $NF кому: print $3; также убранные вещи, и добавили некоторые комментарии.

Принимающие имена файлов не содержат \n, следующее распечатывает отсортированный список, который повреждается (как в: разделите повреждения управления) в уникальном file name, уникальный md5sum, и показывает соответствующую группу путей к файлам.

#!/bin/bash

# Choose which script to use for the final awk step 
out_script=out_all

# Print all duplicated file names, even when md5sum is the same 
out_all='{ if( p1 != $1 ) { print nl $1; print I $2 }
      else if( p2 != $2 ) { print I $2 }
      print I I $3; p1=$1; p2=$2; nl="\n" }
   END { printf nl}'

# Print only duplicated file names which have multiple md5sums.
out_only='{ if( p1 != $1 ) { if( multi ) { print pend }
                             multi=0; pend=$1 "\n" I $2 "\n" }
       else if( p2 != $2 ) { multi++; pend=pend I $2 "\n" } 
       pend=pend I I $3 "\n"; p1=$1; p2=$2 } 
   END { if( multi ) print pend }'

# The main pipeline 
find "${1:-.}" -type f -name '*' |  # awk for duplicate names
awk -F/ '{ if( name[$NF] ) { dname[$NF]++ }
           name[$NF]=name[$NF] $0 "\n" } 
     END { for( d in dname ) { printf name[d] } 
   }' |                             # standard md5sum output 
xargs -d'\n' md5sum |               # " "==text, "*"==binary
sed 's/ [ *]/\x00/' |               # prefix with file name  
awk -F/ '{ print $3 "\x00" $0 }' |  # sort by name. md5sum, path 
sort |                              # awk to print result
awk -F"\x00" -v"I=   " "${!out_script}"

Вывод, показывающий только имена файлов с несколькими md5s

afile.html
   53232474d80cf50b606069a821374a0a
      ./test/afile.html
      ./test/dir.svn/afile.html
   6b1b4b5b7aa12cdbcc72a16215990417
      ./test/dir.svn/dir.show/afile.html

Вывод, показывающий все файлы с тем же именем.

afile.html
   53232474d80cf50b606069a821374a0a
      ./test/afile.html
      ./test/dir.svn/afile.html
   6b1b4b5b7aa12cdbcc72a16215990417
      ./test/dir.svn/dir.show/afile.html

fi    le.html
   53232474d80cf50b606069a821374a0a
      ./test/dir.svn/dir.show/fi    le.html
      ./test/dir.svn/dir.svn/fi    le.html

file.html
   53232474d80cf50b606069a821374a0a
      ./test/dir.show/dir.show/file.html
      ./test/dir.show/dir.svn/file.html

file.svn
   53232474d80cf50b606069a821374a0a
      ./test/dir.show/dir.show/file.svn
      ./test/dir.show/dir.svn/file.svn
      ./test/dir.svn/dir.show/file.svn
      ./test/dir.svn/dir.svn/file.svn

file.txt
   53232474d80cf50b606069a821374a0a
      ./test/dir.show/dir.show/file.txt
      ./test/dir.show/dir.svn/file.txt
      ./test/dir.svn/dir.show/file.txt
      ./test/dir.svn/dir.svn/file.txt
8
27.01.2020, 20:06

Вот сценарий Perl. Выполните его в каталоге наверху дерева, которое Вы хотите искать. Сценарий зависит от find и md5, но последний может быть заменен sha1, sum или любая другая программа хеширования файла, которая принимает вход на stdin и производит хеш на stdout.

use strict;

my %files;
my %nfiles;
my $HASHER = 'md5';

sub
print_array
{
    for my $x (@_) {
        print "$x\n";
    }
}

open FINDOUTPUT, "find . -type f -print|" or die "find";

while (defined (my $line = <FINDOUTPUT>)) {
    chomp $line;
    my @segments = split /\//, $line;
    my $shortname = pop @segments;
    push @{ $files{$shortname} }, $line;
    $nfiles{$shortname}++;
}

for my $shortname (keys %files) {
    if ($nfiles{$shortname} < 2) {
        print_array @{ $files{$shortname} };
        next;
    }
    my %nhashes;
    my %revhashes;
    for my $file (@{ $files{$shortname} }) {
        my $hash = `$HASHER < $file`;
        $revhashes{$hash} = $file;
        $nhashes{$hash}++;
    }
    for my $hash (keys %nhashes) {
        if ($nhashes{$hash} < 2) {
            my $file = $revhashes{$hash};
            print "$file\n";
        }
    }
}
1
27.01.2020, 20:06

finddup этот инструмент может также помочь Вам в списке файлов с теми же именами или содержанием..

1
27.01.2020, 20:06
[112063] Для тех, кто хочет видеть только список имен файлов, вот соответствующая часть ответа [112430]Peter.O[112431] [112432][112433]:


}'

Мне не нужны md5sums, потому что я использую [112434]fslint-gui[112435] перед сценарием, чтобы очистить все дубликаты.[112068].

1
27.01.2020, 20:06

Теги

Похожие вопросы