2015-11-19 3 views
0

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

До сих пор у меня есть это:

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

Это работает, но проблема является более сложной, чем это. Существует два случая:

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

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

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

+1

Команда 'fdupes' может делать то, что вы хотите. –

+0

'cmp' сообщает вам, являются ли файлы одинаковыми, он сравнивает байты по байтам. –

ответ

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) 
+0

Эй, извините, потребовалось время, чтобы вернуться к вам ... Я попытался запустить ваш код, и это дает мне 3 ошибки. По-видимому ": команда не найдена в строке 4" (вероятно, потому, что нет строки 4) и 2 ошибки в строке 22, что-то о синтаксисе – x4iiiis

Смежные вопросы