Linux поиск одинаковых строк

Обновлено: 05.07.2024

Организация вашего домашнего каталога или даже системы может быть особенно сложной, если у вас есть привычка загружать всевозможные вещи из Интернета.

Часто вы можете обнаружить, что загрузили один и тот же файл mp3, pdf, epub (и все другие расширения файлов) и скопировали его в разные каталоги. Это может привести к тому, что ваши каталоги будут загромождены всевозможными бесполезными дублированными материалами.

В этом руководстве вы узнаете, как находить и удалять повторяющиеся файлы в Linux с помощью инструментов командной строки rdfind и fdupes, а также с помощью инструментов с графическим интерфейсом под названием DupeGuru и FSlint.

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

1. Rdfind - находит повторяющиеся файлы в Linux

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

Rdfind использует алгоритм для классификации файлов и определяет, какой из дубликатов является исходным файлом, а остальные считает дубликатами. Правила ранжирования:

  • Если A был найден при сканировании входного аргумента раньше, чем B, A имеет более высокий рейтинг.
  • Если A был обнаружен на глубине ниже B, A имеет более высокий рейтинг.
  • Если A был найден раньше, чем B, A имеет более высокий рейтинг.

Последнее правило используется, в частности, когда два файла находятся в одном каталоге.

Чтобы установить rdfind в Linux, используйте следующую команду для вашего дистрибутива Linux.

Чтобы запустить rdfind в каталоге, просто введите rdfind и целевой каталог. Вот пример:


Как видите, rdfind сохранит результаты в файле с именем results.txt, расположенном в том же каталоге, в котором вы запустили программу. Файл содержит все дубликаты файлов, найденные rdfind. Вы можете просмотреть файл и удалить дубликаты файлов вручную, если хотите.

Еще вы можете использовать параметр -dryrun , который предоставит список дубликатов без каких-либо действий:

Когда вы найдете дубликаты, вы можете заменить их жесткими ссылками.

И если вы хотите удалить дубликаты, вы можете запустить.

Чтобы проверить другие полезные параметры rdfind, вы можете использовать руководство по rdfind с.

2. Fdupes - сканирование дубликатов файлов в Linux

Fdupes - еще одна программа, которая позволяет выявлять повторяющиеся файлы в вашей системе. Он бесплатный, имеет открытый исходный код и написан на C. Он использует следующие методы для определения повторяющихся файлов:

  • Сравнение частичных подписей md5sum
  • Сравнение полных подписей md5sum
  • побайтовое сравнение проверки

Как и у rdfind, у него есть похожие параметры:

  • Рекурсивный поиск
  • Исключить пустые файлы
  • Показывает размер повторяющихся файлов.
  • Немедленно удалите дубликаты.
  • Исключить файлы с другим владельцем

Чтобы установить fdupes в Linux, используйте следующую команду для вашего дистрибутива Linux.

Синтаксис Fdupes похож на rdfind. Просто введите команду, а затем каталог, который вы хотите просканировать.

Для рекурсивного поиска файлов вам необходимо указать -r такую u200bu200bопцию.

Вы также можете указать несколько каталогов и указать каталог для рекурсивного поиска.

Чтобы fdupes рассчитал размер повторяющихся файлов, используйте параметр -S .

Для сбора сводной информации о найденных файлах используйте параметр -m .


Наконец, если вы хотите удалить все дубликаты, используйте -d такую u200bu200bопцию.

Fdupes спросит, какой из найденных файлов удалить. Вам нужно будет ввести номер файла:


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

Чтобы получить список доступных опций для использования с fdupes, просмотрите страницу справки, запустив.

3. dupeGuru - поиск дубликатов файлов в Linux

dupeGuru - это кроссплатформенный инструмент с открытым исходным кодом, который можно использовать для поиска дубликатов файлов в системе Linux. Инструмент может сканировать имена файлов или содержимое в одной или нескольких папках. Это также позволяет вам найти имя файла, похожее на файлы, которые вы ищете.

dupeGuru поставляется в разных версиях для платформ Windows, Mac и Linux. Его функция быстрого алгоритма нечеткого сопоставления поможет вам найти повторяющиеся файлы в течение минуты. Он настраивается, вы можете извлекать точные дубликаты файлов, которые хотите, и удалять ненужные файлы из системы.

Чтобы установить dupeGuru в Linux, используйте следующую команду для вашего дистрибутива Linux.


4. FSlint - Поиск дубликатов файлов для Linux

FSlint - это бесплатная утилита, которая используется для поиска и очистки различных форм линта в файловой системе. Он также сообщает о повторяющихся файлах, пустых каталогах, временных файлах, повторяющихся/конфликтующих (двоичных) именах, плохих символических ссылках и многом другом. Он имеет режимы командной строки и графического интерфейса.

Чтобы установить FSlint в Linux, используйте следующую команду для вашего дистрибутива Linux.


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

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

Я уверен, что однажды нашел команду unix, которая могла печатать общие строки из двух или более файлов, кто-нибудь знает ее имя? Это было гораздо проще, чем diff .

команда, которую вы ищете, это comm . например:-

-1: подавить столбец 1 (строки, уникальные для 1.сортированный.txt)

-2 : подавить графе 2 (строки, уникальные для 2.сортированный.txt)

легко применить comm до несортированный файлы, использовать Баша подмена процесса:

таким образом, файлы abc и def имеют одну общую строку, ту, что с "132". Используя comm на неразобранные файлы:

последняя строка не произвела вывода, общая строка не была обнаружена.

Теперь использовать comm на отсортированных файлах, сортировка файлов с помощью процесса замена:

Теперь у нас есть линия 132!

может быть, вы имеете в виду comm ?

сравнение отсортированных файлов FILE1 и FILE2 строка за строкой.

без вариантов, произведите выход 3-столбца. Колонки содержит строки, уникальные для FILE1, column два содержит строки, уникальные для FILE2, а третий столбец содержит строки, общие для обоих файлов.

секрет в поиске этой информации-информационные страницы. Для программ GNU они гораздо более детализированы, чем их man-страницы. Попробуй!--1--> и он перечислит вам все мелкие полезные утилиты.

чтобы дополнить Perl one-liner, вот его awk эквивалентны:

это будет читать все строки file1 в массиве arr[] , а затем проверьте каждую строку в file2 если он уже существует в массиве (т. е. file1 ). Найденные строки будут напечатаны в том порядке, в котором они отображаются в file2 . Обратите внимание, что сравнение in arr использует всю строку с file2 как индекс массива, поэтому он будет сообщать только о точных совпадениях по всему русло.

дает вам различия двух файлов (что в 2.txt, а не в 1.txt), вы можете легко сделать

собрать все общие линии, которые должны обеспечить легкое решение вашей проблемы. Если вы отсортировали файлы, вы должны взять comm тем не менее. Привет!

в ограниченной версии Linux (например, QNAP (nas), над которым я работал):
- связи не существовало!--6--> - grep -f file1 file2 может вызвать некоторые проблемы, как сказал @ChristopherSchultz и используя grep -F -f file1 file2 был очень медленным (более 5 минут - не закончил его - более 2-3 секунд с помощью метода ниже на файлах более 20 МБ)

так вот что я сделал :

если "файлов.тот же.сортировка " должна быть в том же порядке, что и исходные, чем добавить эту строку для того же порядка, чем файл1 :

или, для того же порядка, что и file2:

Если два файла еще не отсортированы, вы можете использовать:

просто для справки если кто-то все еще ищет, как это сделать для нескольких файлов, см. связанный ответ на Поиск совпадающих строк во многих файлах.

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

Что такое команда uniq?

Команда uniq в Linux используется для отображения идентичных строк в текстовом файле. Эта команда может быть полезна, если вы хотите удалить повторяющиеся слова или строки из текстового файла. Поскольку команда uniq сопоставляет соседние строки для поиска избыточных копий, она работает только с отсортированными текстовыми файлами.

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

Как использовать команду uniq

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

Базовый синтаксис

Базовый синтаксис команды uniq:

Выходной аргумент является необязательным и может быть пропущен. Если пользователь не указывает входной файл, uniq берет данные из стандартного вывода в качестве входных. Это позволяет пользователю передавать uniq по конвейеру с другими командами Linux .

Пример текстового файла

Мы будем использовать текстовый файл duplicate.txt в качестве входных данных для команды.

Обратите внимание, что мы уже отсортировали этот текстовый файл с помощью команды sort . Если вы работаете с другим текстовым файлом, вы можете отсортировать его с помощью следующей команды:

Удалить повторяющиеся линии

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

Подсчет повторяющихся строк

Чтобы вывести количество повторяющихся строк в текстовом файле, используйте флаг -c с командой по умолчанию.

Система отображает количество строк в текстовом файле. Вы можете видеть, что строка This is a text file встречается в файле два раза. По умолчанию команда uniq чувствительна к регистру.

Печатать только повторяющиеся строки

Чтобы печатать только повторяющиеся строки из текстового файла, используйте флаг -D . -D означает Дубликат .

Система отобразит вывод следующим образом.

Пропуск полей при проверке дубликатов

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

Рассмотрим следующий текстовый файл fields.txt .

Чтобы пропустить первое поле:

Вышеупомянутая команда пропустила первое поле (IP-адреса и имена ОС) и сопоставила второе слово (TCP и FS). Затем он отображал первое вхождение каждого совпадения в качестве вывода.

Игнорировать символы при сравнении

Как и при пропуске полей, вы также можете пропускать символы. Флаг -s позволяет указать количество символов, которые следует пропускать при сопоставлении повторяющихся строк. Эта функция помогает, когда данные, с которыми вы работаете, представлены в виде следующего списка:

Чтобы игнорировать первые два символа (нумерацию списков) в файле list.txt :

В выводе выше первые два символа были проигнорированы, а остальные были сопоставлены с уникальными строками.

Проверьте количество первых N символов на наличие дубликатов

Флаг -w позволяет проверять на наличие дубликатов только фиксированное количество символов. Например:

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

Удалить чувствительность к регистру

Как упоминалось выше, uniq чувствителен к регистру при сопоставлении строк в файле. Чтобы игнорировать регистр символов, используйте параметр -i с командой.

Вы увидите следующий результат.

Обратите внимание, что в выводе выше uniq не отображал строки DO CATCH THIS и THIS IS A TEXT FILE .

При отправке вывода в текстовый файл система не отображает вывод команды. Вы можете проверить содержимое нового файла с помощью команды cat .

Вы также можете использовать другие способы отправки вывода командной строки в файл в Linux .

Анализ повторяющихся данных с помощью uniq

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

Работа с текстовыми файлами может быть неприятной, если вы не знаете, как фильтровать и сортировать текст в файле. Чтобы упростить вашу работу, в Linux есть несколько команд редактирования текста, таких как sed и awk, которые позволяют эффективно работать с текстовыми файлами и выводами командной строки.

Команда Grep в Linux (Поиск текста в файлах)

Команда grep означает «глобальная печать регулярных выражений», и это одна из самых мощных и часто используемых команд в Linux.

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

grep Синтаксис команды

Синтаксис grep команды следующий:

Элементы в квадратных скобках не являются обязательными.
  • OPTIONS - Ноль или более вариантов. Grep включает в себя ряд параметров, которые контролируют его поведение.
  • PATTERN - Шаблон поиска.
  • FILE - Ноль или более имен входных файлов.

Чтобы иметь возможность искать файл, пользователь, выполняющий команду, должен иметь доступ на чтение к файлу.


Поиск строки в файлах

Основное использование grep команды - поиск строки (текста) в файле.

Например, чтобы отобразить все строки, содержащие строку bash из /etc/passwd файла, вы должны выполнить следующую команду:


Вывод должен выглядеть примерно так:

Если строка содержит пробелы, вам необходимо заключить ее в одинарные или двойные кавычки:


Инвертировать (исключить) совпадение

Чтобы отобразить линии, которые не соответствуют шаблону, используйте параметр -v (или --invert-match ).

Например, чтобы напечатать строки, которые не содержат строку, которую nologin вы используете:

Использование Grep для фильтрации выходных данных команды

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

Например, чтобы узнать, какие процессы выполняются в вашей системе как пользователь, www-data вы можете использовать следующую ps команду:


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

Рекурсивный поиск

Для рекурсивного поиска шаблона, grep используйте -r опцию (или --recursive ). Когда эта опция используется, grep будет выполняться поиск по всем файлам в указанном каталоге, пропуская символические ссылки, которые встречаются рекурсивно.

Чтобы перейти по всем символическим ссылкам , вместо этого -r используйте -R опцию (или --dereference-recursive ).

Вот пример, показывающий, как искать строку baks.dev во всех файлах в /etc каталоге:


Вывод будет включать совпадающие строки с префиксом полного пути к файлу:

Если вы используете -R опцию, grep перейдите по всем символическим ссылкам:

Обратите внимание на последнюю строку вывода ниже. Эта строка не печатается, когда grep вызывается -r из-за того, что файлы в sites-enabled каталоге Nginx являются символическими ссылками на файлы конфигурации внутри sites-available каталога.

Показывать только имя файла

Чтобы подавить grep вывод по умолчанию и печатать только имена файлов, содержащих сопоставленный шаблон, используйте параметр -l (или --files-with-matches ).

Команда ниже просматривает все файлы, заканчивающиеся .conf в текущем рабочем каталоге, и печатает только имена файлов, содержащих строку baks.dev :


Вывод будет выглядеть примерно так:

-l Вариант обычно используется в сочетании с рекурсивной опции -R :


Поиск без учета регистра

По умолчанию учитывается grep регистр. Это означает, что прописные и строчные символы рассматриваются как разные.

Чтобы игнорировать регистр при поиске, grep используйте -i опцию (или --ignore-case ).

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


Но если вы выполните поиск без учета регистра, используя -i опцию, он будет соответствовать как заглавным, так и строчным буквам:


Указание «Зебра» будет соответствовать «Зебра», «ZEbrA» или любой другой комбинации прописных и строчных букв для этой строки.

Поиск полных слов

При поиске строки grep будут отображаться все строки, в которых строка встроена в более крупные строки.

Например, если вы ищете «gnu», все строки, где «gnu» встроен в более крупные слова, такие как «cygnus» или «magnum», будут совпадать:

Чтобы вернуть только те строки, в которых указанная строка представляет собой целое слово (заключенное не в словах), используйте параметр -w (или --word-regexp ).

Символов слова включают в себя буквенно - цифровые символы ( a-z , A-Z и 0-9 ) и подчеркивание ( _ ). Все остальные символы рассматриваются как несловесные символы.

Если вы выполните ту же команду, что и выше, включая -w опцию, grep команда вернет только те строки, которые gnu включены в качестве отдельного слова.

Показать номера строк

Опция -n (или --line-number ) указывает grep показывать номер строки, содержащей строку, которая соответствует шаблону. Когда эта опция используется, grep печатает совпадения на стандартный вывод с префиксом номера строки.

Например, чтобы отобразить строки из /etc/services файла, содержащего строку с bash префиксом с соответствующим номером строки, вы можете использовать следующую команду:


Вывод ниже показывает нам, что совпадения находятся в строках 10423 и 10424.

Количество совпадений

Чтобы напечатать количество совпадающих строк в стандартный вывод, используйте параметр -c (или --count ).

В приведенном ниже примере мы подсчитываем количество учетных записей, которые имеют /usr/bin/zsh оболочку.


Скрытый режим

-q (Или --quiet ) говорит , grep чтобы работать в скрытом режиме , чтобы не показывать ничего на стандартный вывод. Если совпадение найдено, команда завершается со статусом 0 . Это полезно при использовании grep в сценариях оболочки, где вы хотите проверить, содержит ли файл строку, и выполнить определенное действие в зависимости от результата.

Вот пример использования grep в тихом режиме в качестве команды тестирования в if инструкции :


Основное регулярное выражение

GNU Grep имеет три набора функций регулярных выражений : базовый, расширенный и Perl-совместимый.

По умолчанию grep шаблон интерпретируется как базовое регулярное выражение, где все символы, кроме метасимволов, на самом деле являются регулярными выражениями, которые соответствуют друг другу.

Ниже приведен список наиболее часто используемых метасимволов:

Используйте ^ символ (каретка), чтобы соответствовать выражению в начале строки. В следующем примере строка kangaroo будет соответствовать только в том случае, если она встречается в самом начале строки.

Используйте $ символ (доллар), чтобы соответствовать выражению в конце строки. В следующем примере строка kangaroo будет соответствовать только в том случае, если она встречается в самом конце строки.

Используйте . символ (точка), чтобы соответствовать любому отдельному символу. Например, для сопоставления всего, что начинается с kan двух символов и заканчивается строкой roo , вы можете использовать следующий шаблон:

Используйте [ ] (скобки) для соответствия любому отдельному символу, заключенному в скобки. Например, найдите строки, содержащие accept или « accent , вы можете использовать следующий шаблон:

Используется [^ ] для соответствия любому отдельному символу, не заключенному в скобки. Следующий шаблон будет соответствовать любой комбинации строк, содержащих co(any_letter_except_l)a , например coca , cobalt и так далее, но не будет совпадать со строками, содержащими cola ,


Чтобы избежать специального значения следующего символа, используйте \ символ (обратный слеш).

Расширенные регулярные выражения

Чтобы интерпретировать шаблон как расширенное регулярное выражение, используйте параметр -E (или --extended-regexp ). Расширенные регулярные выражения включают в себя все основные метасимволы, а также дополнительные метасимволы для создания более сложных и мощных шаблонов поиска. Ниже приведены некоторые примеры:

Сопоставьте и извлеките все адреса электронной почты из данного файла:

Сопоставьте и извлеките все действительные IP-адреса из данного файла:

-o Опция используется для печати только строку соответствия.

Поиск по шаблону нескольких строк

Два или более шаблонов поиска могут быть объединены с помощью оператора ИЛИ | .

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

В приведенном ниже примере мы ищем все вхождения слов fatal , error и critical в журнале Nginx файл ошибки:


Если вы используете опцию расширенного регулярного выражения -E , оператор | не должен быть экранирован, как показано ниже:


Печать строк перед сопоставлением

Чтобы напечатать определенное количество строк перед сопоставлением строк, используйте параметр -B (или --before-context ).

Например, чтобы отобразить пять строк начального контекста перед сопоставлением строк, вы должны использовать следующую команду:


Печать строк после сопоставления

Чтобы напечатать определенное количество строк после сопоставления строк, используйте параметр -A (или --after-context ).

Например, чтобы отобразить пять строк конечного контекста после сопоставления строк, вы должны использовать следующую команду:


Вывод

Команда grep позволяет искать шаблон внутри файлов. Если совпадение найдено, grep печатает строки, содержащие указанный шаблон.

Читайте также: