Переместить / переименовать много файлов с определенным размером файла

Я восстановил много фотографий (более 1000) с плохой SD-карты. Все, кроме 75, которое кажется «сломанным». Я запустил программу, чтобы все картинки читались на более низком уровне, и обнаружил, что я получил все картинки, в том числе те, которые не читаются на SD-карте, проблема в том, что они были восстановлены с разными именами, и многие дублируются .

Я хочу найти файл (если их больше одного, просто получить первый) в папке «good» с тем же размером, который есть у каждого файла в папке «bad», и переименовать его по имени.

Я выполнил эту команду ls -lR | egrep -v '^d' | awk '$5==5040057{print}'

и получил этот результат

-rw-r--r-- 1 user user  5040057 Apr  6 04:47 _MG_2443.JPG
-rw-r--r-- 1 user user 5040057 Apr  6 04:47 f11146176.jpg
-rw-r--r-- 1 user user 5040057 Apr  6 04:47 f12072256.jpg
-rw-r--r-- 1 user user 5040057 Apr  6 04:47 f14834560.jpg

Правка: в результате команды не отображается, но структура папок следует:

Recovery:
 |- Bad ( containing _MG_XXXX.JPG files )
 |- Good ( Containing fXXXXXXXX.jpg files )

Где первый _IMG_2443.JPG - плохое изображение, а любое из следующего - хорошее (это кандидаты, которые будут переименованы или перемещены). Поэтому для предыдущего примера я хотел бы, чтобы файл примера f11146176.jpg переименовывался в папке «Good» в «_MG_2443.JPG», чтобы я мог проверить его позже и заменить в папке «bad».

Есть ли способ запустить команду, чтобы сделать это автоматически для всех изображений? Благодаря

4
задан 6 May 2014 в 15:56

1 ответ

Размер файла не является хорошим способом определить дубликаты. У Вас может быть два файла с тем же самым размером, но различным содержанием. Это означает, что довольно вероятно, что этот подход перестанет работать. Тем не менее следующее сделает то, что Вы попросили.

Важный: это предполагает, что Ваши имена файлов не имеют никаких пробелов и никаких новых строк.

find bad -iname "*.jpg" -printf "%s %f\n" | while read -r bs bf; do 
  find good/ -iname "*.jpg" -printf "%s %f\n" | while read -r gs gf; do 
    [ $bs -eq $gs ] && echo "mv good/$gf good/$bf"; 
  done 
done

Объяснение

  • find bad -iname "*.jpg" -printf "%s %f\n" : найдите все файлы, имя которых заканчивается в .jpg или .JPG в bad каталог и печать их размер и имя файла.
  • while read -r bs bf; do : считайте каждую строку вывода выше, сохранив размер файла как $bs и его имя как $bf.
  • Второе find ... | while ...; done делает точно то же для good каталог, сохраняя размер файла как $gs и его имя как $gf.
  • [[ $bs -eq $gs ]] && echo "mv good/$gf good/$bf"; : Если размер плохого файла совпадает с размером хорошего файла, переименуйте хороший файл с помощью имени плохого файла. Если это делает то, на что Вы ожидаете, удаляете эхо и изменяете строку просто mv good/"$gf" good/"$bf". Обратите внимание, что это сохранит последнее 'плохое' имя файла как заключительное название 'хорошего' файла.

Я хочу подчеркнуть, что это не безопасно, различные файлы могут иметь тот же самый размер и совершенно другое содержание. Вместо того, чтобы использовать этот наивный подход, Вы могли бы быть более обеспеченным использованием программы, которая специально предназначена для сравнения изображений. Я никогда не использовал никакое подобное программное обеспечение, но 3-минутный поиск поднял DupeGuru. Я предлагаю, чтобы Вы попробовали его сначала:

DupeGuru: Выпуск Изображения dupeGuru (PE, если коротко) является инструментом для нахождения дублирующихся изображений на компьютере. dupeGuru PE является старший брат dupeGuru.

Это программное обеспечение работает как dupeGuru, но специализировано для соответствия дублирующихся изображений. dupeGuru PE работает на Windows, Mac OS X и Linux.

3
ответ дан 6 May 2014 в 15:56

Другие вопросы по тегам:

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