@Asparagales

Как в Linux найти файлы одинакового размера?

Есть директория. В ней находятся файлы и еще другие директории с файлами. Некоторые из этих файлов на самом деле являются копиями друг друга, помещеными в директорию в разное время из разных источников. Но при этом эти копии имеют хоть и схожее, но не одинаковое название. Но они должны иметь одинаковый размер. Нужно получить список всех файлов с одинаковым размером. Чтобы потом уже вручную удалить дубликаты. Как это сделать? Гугление обычно выдает команду find, но я так и не смог с ней разобраться. Кажется она умеет только искать файлы меньше и больше определенного размера.

(Еще лучше, если можно будет находить файлы с размером совпадающин не только байт в байт, но и задавать диапазон. Например, найти все файлы, которые не отличаются друг от друга более чем на 10 Кб. Но это уже пожелание опционально)
  • Вопрос задан
  • 299 просмотров
Решения вопроса 1
hint000
@hint000
у админа три руки
Нужно получить список всех файлов с одинаковым размером. Чтобы потом уже вручную удалить дупликаты.
Вы можете в несколько кликов искать и удалять дубликаты файлов, используя GUI-утилиту под названием FSlint. Находит не просто совпадение размера, а именно совпадение и размера, и содержимого. Имена файлов при этом могут быть разные. Просто добавляете несколько папок, по которым нужно искать дубликаты, потом среди найденных выделяете те, которые хотите удалить и удаляете. Т.е. вручную можно выбирать в какой из папок файл оставить, а в какой удалить. Можно все дубликаты оставить, можно все удалить (!).
Утилита имеет и другие функции для поиска разных корявостей и неоптимальностей в папках (имена с "плохими" символами, пустые папки и т.д.)

Есть ещё утилита командной строки fdupes, которая тоже ищет дубликаты.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
pickHabr
@pickHabr
Костыльных дел мастер
https://linuxconfig.org/how-to-use-find-command-to...

upd

https://stackoverflow.com/questions/7541616/how-to...
ls -l|grep '^-'|awk '{if(a[$5]){ a[$5]=a[$5]"\n"$NF; b[$5]++;} else a[$5]=$NF} END{for(x in b)print a[x];}'


upd 2
этот код выведет файлы с одинаковым размером, смотри рекурсивно от текущей папки и отображает вес файла
ls -lR | grep '^-' | awk '{
    f = ""; 
    if (NF > 9) 
        for (i = 9; i <= NF; i++) 
            f = f ? f" "$i : $i; 
    else 
        f = $9;
    
    if (a[$5]) { 
        a[$5] = a[$5]"\n"$5" "f; 
        b[$5]++; 
    } else { 
        a[$5] = $5" "f 
    }
} 
END { 
    for (x in b) 
        print a[x]; 
}'


upd 3
а тебе вот прям нужен баш? можно на питоне скрипт сделать
Ответ написан
2ord
@2ord
Еще лучше, если можно будет находить файлы с размером совпадающин не только байт в байт, но и задавать диапазон. Например, найти все файлы, которые не отличаются друг от друга более чем на 10 Кб. Но это уже пожелание опционально
утилита ssdeep умеет искать схожие файлы, производя нечеткое сравнение и генерирует хэш-сумму файла.
Уточнение: диапазон нельзя указать. Она сама определяет критерии для сравнения.
Ответ написан
Комментировать
saboteur_kiev
@saboteur_kiev Куратор тега Linux
software engineer
1. Поискать готовые инструменты, их есть.

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

3. найти все файлы, которые не отличаются друг от друга более чем на 10 Кб
С этим сложнее. Есть софт, который может определять похожие изображения, но именно файлы, там непонятно как с критериями работать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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