Как я могу исправить ошибку apt "W: Целевые пакеты ... настраиваются несколько раз"?

Новейшее, современное решение

Я написал скрипт на Python для автоматизации этой задачи. Вы можете найти самая последняя версия здесь.

Установка:

  1. Установите необходимые компоненты:

    sudo apt install python3-apt
  2. Загрузите пакет PYZ (aptsources-cleanup.pyz) из последнего выпуска.

  3. Пометьте пакет PYZ как исполняемый:

    chmod a+x aptsources-cleanup.pyz

Использование:

  1. Из места загрузки пакета PYZ (см. шаг 2 выше) запустите:

    sudo ./aptsources-cleanup.pyz
  2. Следуйте инструкциям, появляющимся на экране.

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


Историческое, устаревшее решение

Это более старая, короткая и простая версия, более подходящая для встроенных цитат:

#!/usr/bin/python3"""Detects and interactively deactivates duplicate Apt source entries.Usage: sudo python3 apt-remove-duplicate-source-entries.py"""from __future__ import print_functionimport aptsources.sourceslistEMPTY_COMPONENT_LIST = (None,)def get_duplicates(sourceslist):    """    Detects and returns duplicate Apt source entries.    """    sentry_map = dict()    duplicates = list()    for se in sourceslist.list:        if not se.invalid and not se.disabled:            for c in (se.comps or EMPTY_COMPONENT_LIST):                key = (se.type, se.uri, se.dist, c)                previous_se = sentry_map.setdefault(key, se)                if previous_se is not se:                    duplicates.append((se, previous_se))                    break    return duplicatesif __name__ == '__main__':    try:        input = raw_input    except NameError:        pass    sourceslist = aptsources.sourceslist.SourcesList(False)    duplicates = get_duplicates(sourceslist)    if duplicates:        for dupe, orig in duplicates:            print(                'Overlapping source entries:\n'                '  1. {0}: {1}\n'                '  2. {2}: {3}\n'                'I disabled the latter entry.'.format(                    orig.file, orig, dupe.file, dupe),                end='\n\n')            dupe.disabled = True        print('\n{0} source entries were disabled:'.format(len(duplicates)),            *[dupe for dupe, orig in duplicates], sep='\n  ', end='\n\n')        if input('Do you want to save these changes? (y/N) ').upper() == 'Y':            sourceslist.save()    else:        print('No duplicated entries were found.')

Он не принимает никаких параметров и работает на всех /etc/apt/sources.list* с помощью python3-apt пакет. Строки не обязательно должны быть точными дубликатами (даже после нормализации), но этого достаточно, если type, URI, suite и хотя бы один компонент перекрываются.

Я не уверен, что тест на равенство верен во всех угловых случаях (например, различные строки “option”).