Поиск дубликатов файлов с небольшими различиями в именах файлов

Шифрование защищает вашу систему от автономного доступа, т. е. доступа к вашему оборудованию.

Если кто-то может получить доступ к вашему жесткому диску, смонтировать корневой раздел и восстановить ключи шифрования, ничто не мешает им расшифровать и смонтировать другие ваши разделы.

0
05.10.2021, 13:44
2 ответа

Следующий скрипт работает, устанавливая список позиционных параметров в список имен, соответствующих шаблону *' ('*')', т. е. все файлы с именами, которые содержат пробел, за которым следует скобка в конце, в текущем каталоге.

Сценарий использует двойной цикл для сравнения каждого имени со всеми остальными. Чтобы избежать сравнения некоторого имени Aс другим именем B, а затем Bс A, мы смещаем первый элемент списка в начале внешней итерации. Это также позволяет избежать проверки имени Aпротив самого себя.

Внутри внутреннего цикла мы удаляем круглые скобки в конце имен и сравниваем две полученные строки. Если строки совпадают, мы печатаем имена.

#!/bin/sh

set -- *' ('*')'

for name do
        shift

        for dup do
                if [ "${name%% (*)}" = "${dup%% (*)}" ]; then
                        printf '"%s" <-> "%s"\n' "$name" "$dup"
                fi
        done
done
0
05.10.2021, 14:40

Несмотря на опоздание, я решил добавить небольшой сценарий Bash, который обрабатывает имена файлов с помощью Gawk. Он помечает множество дубликатов среди файлов в любом заданном каталоге. Обработка остается O (n^2 ), хотя пары файлов проверяются только один раз.

Запустите скрипт в интересующем каталоге, например, в каталоге, содержащем:

$ \ls -A -1
2323- (1236).suffix
23232(1234).suffix
23232 (1236).hsj
23232 (1236).suffix
hello(2001.10.29)fgh.ssh
hello(2002.10.29)fgh.ssh
23232(1236).suffix
23232(12 6).suffix
23232 (1286).suffix
23232 (1446).suffix
23232(3236).suffix
dwlkl(1234).sds

Теперь скрипт:

$ cat near_match.sh
#!/usr/bin/env bash
gawk '
    {i++; a[i] = $0; next}  # put files to check in array 'a'
    END {
        nfiles = i; # number of files to check
        for (i = 1; i <= nfiles-1; i++) {
            lblkarr1 = split(a[i], blkarr1, "[()]");
            lparr1 = split(blkarr1[2], parr1, "");
            for (j = i+1; j <= nfiles; j++) {
                lblkarr2 = split(a[j], blkarr2, "[()]");
                lparr2 = split(blkarr2[2], parr2, "");
                mismatch = 0;
                if ("x"blkarr1[1]"x" == "x"blkarr2[1]"x" && "x"blkarr1[3]"x" == "x"blkarr2[3]"x" && lparr1 == lparr2) {
                    for (k=1; k<=length(blkarr1[2]); k++) { if (parr1[k] != parr2[k]) mismatch++ };
                    if (mismatch == 1)  printf "dupes: %s  <-->  %s\n", a[i], a[j];
                }
            }
        }
    }' <<< $(\ls -A -1 -- *"("*")"*)

exit 0

Сделайте скрипт исполняемым и запустите его без аргументов.

$ near_match.sh
dupes: 23232(1234).suffix  <-->  23232(1236).suffix
dupes: 23232 (1236).suffix  <-->  23232 (1286).suffix
dupes: hello(2001.10.29)fgh.ssh  <-->  hello(2002.10.29)fgh.ssh
dupes: 23232(1236).suffix  <-->  23232(12 6).suffix
dupes: 23232(1236).suffix  <-->  23232(3236).suffix
  • Как указано в OP, «обман» определяется исключительно как несоответствие 1 -символа внутри круглых скобок. Адаптация решения для его расширения таким образом, чтобы можно было обнаруживать несоответствия символов в любом месте имени файла, является тривиальной задачей.
  • Круглые скобки могут быть в любом месте имени файла, а имя файла может иметь любой суффикс или не иметь его.
  • Предлагаемое решение кажется устойчивым к специальным символам внутри имени файла, за исключением дополнительных круглых скобок.
  • Изменение несоответствия 1 символа -на несоответствие нескольких символов -возможно с минимальными изменениями. Было бы тривиально изменить это число с помощью аргумента, переданного сценарию. Спросите, если вы должны.

ХТХ

0
07.10.2021, 15:49

Теги

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