Поиск дубликатов файлов с помощью скрипта bash

Вам нужно {}, а не[]:

echo CONFIG2{,/DOS}/{PROCAR,CHG*,vasprun.xml}

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

1
14.10.2020, 11:35
2 ответа

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

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

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

#!/bin/bash
unset arr i
while IFS= read -r f; do

    # move file to array if binary
    if file -i "$f" | grep -q "charset=binary"; then
        arr[++i]="$f"
    fi
    
    # if end of paragraph and array has files, hardlink and unset array
    if [[ "$f" == "" && "${arr[@]}" ]]; then
        printf "\n => Hardlink for %d files:\n" "$i"
        hardlink -n -c -vv "${arr[@]}"
        unset arr i
    fi

done < <(fdupes -rpio time.)

hardlinkс параметром -nимитирует и ничего не пишет,так что проверьте все вышеперечисленное как есть и удалите -nпозже.

Также не обрабатываются имена файлов с символами новой строки, тестирование с использованием пробелов проходит нормально.

0
18.03.2021, 22:57

Наконец-то получил желаемый результат. Спасибо @thanasisp. Для этого вам понадобятся две программы fdupes и rdfind.

#!/bin/bash
unset arr i; while IFS= read -r f; do if file -i "$f" | grep -q "charset=binary"; then arr[++i]="$f"; fi; if [[ "$f" == "" && "${arr[@]}" ]]; then printf "\n => Hardlink for %d files:\n" "$i";rdfind -makehardlinks true "${arr[@]}" | grep "Total size is" | grep -P "[0-9]+" -o  | head -1 | awk -v count="$i" '{print $1/count;}' | awk '{printf("%s kibibytes saved.\n",$1/1024)}'; unset arr i; fi; done < <(fdupes -rpio time.)
0
18.03.2021, 22:57

Теги

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