Сравнение имен файлов и md5sum нескольких файлов в Linux

Я пишу сценарий bash, который копирует изображения из каталога (и всех его подкаталогов) в другой каталог.

Пока что у меня это:

find . -type f -regextype posix-extended -regex '^.*IMG_[0-9]{4}\.jpg' -exec cp {} ~/$output \;

Это работает, но проблема более сложная. Есть два случая:

  • Некоторые изображения имеют одинаковое название, но разные. В этом случае их нужно переименовать, просто добавив второй «.JPG» в конце их имени.
  • Однако, если два файла имеют одинаковое имя и являются идентичными файлами, в выходной каталог следует скопировать только один, а абсолютный путь другого записать в текстовый файл - duplicats.txt.

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

Заранее благодарю за любую помощь!


person x4iiiis    schedule 19.11.2015    source источник
comment
Команда fdupes может делать то, что вы хотите.   -  person Roger Lipscombe    schedule 19.11.2015
comment
cmp сообщает вам, что если файлы идентичны, он сравнивает байт за байтом.   -  person Benjamin W.    schedule 19.11.2015


Ответы (1)


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

#!/bin/bash

input=$1
output=$2
logfile=~/duplicates.txt

while IFS= read -r -d '' f
do
    #strip the input directory name from the file
    f=${f/$input\//}
    echo Working with $f
    #check if the file exists
    if [ -f "$output/$f" ]; then
        if cmp -s "$input/$f" "$output/$f"; then
            #file is identical
            echo "$f" >> "$logfile"
        else
            #same filename, but different file
            cp --parents -p "$input/$f" "$output/$f.JPG"
        fi
    else
        cp --parents -p "$input/$f" "$output/$f"
    fi
done< <(find "$input" -type f -regextype posix-extended -regex '^.*IMG_[0-9]{4}\.jpg' -print0)
person miken32    schedule 19.11.2015
comment
Эй, извините, что потребовалось некоторое время, чтобы ответить вам... Я попытался запустить ваш код, и он дает мне 3 ошибки. Судя по всему: команда не найдена в строке 4 (вероятно, потому что нет строки 4) и 2 ошибки в строке 22, что-то о синтаксисе - person x4iiiis; 22.11.2015