Поиск дубликатов файлов по первым нескольким символам имени файла

В GNU awk(gawk)использование FPATдля определения поля как последовательности не-#@символов:

$ gawk '{$1=$1} 1' FPAT='[^#@]+' OFS='\n' file >> Sequence.txt
$ 
$ tail Sequence.txt 
HelloMyName
IsAdam
NiceToMeetYou

Аналогичный подход, на perl:

perl -lpe '$_ = join "\n", /[^#@]+/g' file >> Sequence.txt
1
02.11.2020, 14:44
2 ответа

Фильтр возможных дубликатов

Вы можете использовать какой-нибудь скрипт для фильтрации этих файлов на предмет возможных дубликатов. Вы можете переместить в новый каталог все файлы, совпадающие по крайней мере с другим, без учета регистра, в части до первого тире, подчеркивания или пробела в их именах. cdв каталог jars, чтобы запустить его.

#!/bin/bash
mkdir -p possible_dups

awk -F'[-_ ]' '
    NR==FNR {seen[tolower($1)]++; next}
    seen[tolower($1)] > 1
' <(printf "%s\n" *.jar) <(printf "%s\n" *.jar) |\
    xargs -r -d'\n' mv -t possible_dups/ --

Примечание:-r— это расширение GNU, позволяющее избежать однократного запуска mvбез файловых аргументов, когда не найдены возможные дубликаты. Также параметр GNU -d'\n'разделяет имена файлов символами новой строки, что означает, что в приведенной выше команде обрабатываются пробелы и другие обычные символы, но не символы новой строки.

Вы можете отредактировать назначение разделителя полей, -F'[-_ ]'чтобы добавить или удалить символы, определяющие конец части, которую мы проверяем на дублирование. Теперь это означает «тире, или убрать подчеркивание, или пробел». Как правило, хорошо выявлять больше, чем реальные случаи дублирования, как я, вероятно, делаю здесь.

Теперь вы можете просмотреть эти файлы. Вы также можете сразу выполнить следующий шаг для всех файлов без фильтрации, если считаете, что их количество не очень велико.


Визуальный осмотр возможных дубликатов

Предлагаю вам использовать для этой задачи визуальную оболочку, например mc, Midnight Commander . Вы можете легко установить mcс помощью инструмента управления пакетами вашего дистрибутива Linux.

Вы вызываете mcкаталог, в котором находятся эти файлы, или можете перейти туда. Используя терминал X -, вы также можете получить поддержку мыши, но есть удобные ярлыки для чего угодно.

Например, следуя меню Left -> Sorting... -> untick "case sensitive", вы получите желаемый отсортированный вид.

Перемещайтесь по файлам с помощью стрелок, и вы можете выбрать многие из них с помощью Вставить , а затем скопировать(F5 ),переместите(F6)или удалите(F8)выделенные элементы. Вот скриншот того, как это выглядит на ваших тестовых данных, отфильтрованных:

enter image description here

2
18.03.2021, 22:53

У нас есть решение Я принял ответ, который позволил легко достичь моей цели в программе, управляемой bash, в которой не используется менеджер оболочки, такой как MC или Ranger.

#!/bin/bash

declare -a names

xIFS="${IFS}"
IFS="^M"

while true; do
awk -F'[-_ ]' '
    NR==FNR {seen[tolower($1)]++; next}
    seen[tolower($1)] > 1
' <(printf "%s\n" *.jar) <(printf "%s\n" *.jar) > tmp.dat

        IDX=0
        names=()


        readarray names < tmp.dat

        size=${#names[@]}

        clear
        printf '\nPossible Dupes\n'

        for (( i=0; i<${size}; i++)); do
                printf '%s\t%s' ${i} ${names[i]}
        done

        printf '\nWhich dupe would you like to delete?\nEnter # to delete or q to quit\n'
        read n

        if [ $n == 'q' ]; then
                exit
        fi

        if [ $n -lt 0 ] || [ $n -gt $size ]; then
                read -p "Invalid Option: present [ENTER] to try again" dummyvar
                continue
        fi

        #clean the carriage return \n from the name
        IFS='^M'
        read -ra TARGET <<< "${names[$n]}"
        unset IFS

        # now remove the filename sans any carriage returns
        # from the filesystem
        # 12/18/2020
        rm "${TARGET[*]}" 
        echo "removed ${TARGET[0]}" >> rm.log
done

IFS="${xIFS}"

Это работает хорошо для меня, так как не требует чтения сотен имен файлов в поисках дубликатов и будет повторяться до тех пор, пока я не буду доволен результатом. Он также сохраняет мои действия в файл журнала.

Вообще говоря, дублирования модов, с которыми я сталкиваюсь, немногочисленны и редки, но когда они происходят, это надоедает. Этот сценарий значительно улучшает эту ситуацию для меня.

Если вы можете сделать скрипт более интеллектуальным или удобным для пользователя, сделайте это, я хотел бы увидеть его.

РЕДАКТИРОВАНО :5/11/20

  • переформулировал свои мысли
  • пользуюсь скриптом уже несколько дней, очень полезно
  • что он позволяет мне сделать, так это установить мой клиентский пакет, затем загрузить все минус клиентские моды на сервер, а затем использовать этот скрипт для быстрой очистки папки серверных модов/. Так что теперь обслуживание моего рюкзака стало еще быстрее!
  • обновлен сценарий для использования IFS и очистки вывода в меню

РЕДАКТИРОВАНО :18.12.2020

  • одно незначительное изменение позволяет скрипту вести себя корректно в еще большем количестве ситуаций.
0
18.03.2021, 22:53

Теги

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