mExiftoolCopyingRenaming.sh 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. #!/bin/bash
  2. E='echo -e';e='echo -en';trap "R;exit" 2
  3. ESC=$( $e "\e")
  4. TPUT(){ $e "\e[${1};${2}H" ;}
  5. CLEAR(){ $e "\ec";}
  6. # 25 возможно это
  7. CIVIS(){ $e "\e[?25l";}
  8. # это цвет текста списка перед курсором при значении 0 в переменной UNMARK(){ $e "\e[0m";}
  9. MARK(){ $e "\e[1;90m";}
  10. # 0 это цвет заднего фона списка
  11. UNMARK(){ $e "\e[0m";}
  12. # ~~~~~~~~ Эти строки задают цвет фона ~~~~~~~~
  13. R(){ CLEAR ;stty sane;CLEAR;};
  14. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  15. HEAD(){ for (( a=2; a<=34; a++ ))
  16. do
  17. TPUT $a 1
  18. $E "\033[34m\xE2\x94\x82 \xE2\x94\x82\033[0m";
  19. done
  20. TPUT 2 3
  21. $E "\033[1;2mКопирование примеров \033[36m COPYING EXAMPLES\033[0m";
  22. TPUT 3 3
  23. $E "\033[2mЭти примеры демонстрируют возможность копировать значения тегов между файлами.\033[0m";
  24. TPUT 24 3
  25. $E "\033[1;2mПереименование примеров \033[36mRENAMING EXAMPLES\033[0m";
  26. TPUT 33 4
  27. $E "\033[32mUp \xE2\x86\x91 \xE2\x86\x93 Down Select Enter\033[0m";
  28. MARK;TPUT 1 1
  29. $E "\033[0m\033[34m+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+\033[0m" ;UNMARK;}
  30. i=0; CLEAR; CIVIS;NULL=/dev/null
  31. FOOT(){ MARK;TPUT 35 1
  32. $E "\033[0m\033[34m+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+\033[0m";UNMARK;}
  33. # это управляет кнопками ввер/хвниз
  34. i=0; CLEAR; CIVIS;NULL=/dev/null
  35. #
  36. ARROW(){ IFS= read -s -n1 key 2>/dev/null >&2
  37. if [[ $key = $ESC ]];then
  38. read -s -n1 key 2>/dev/null >&2;
  39. if [[ $key = \[ ]]; then
  40. read -s -n1 key 2>/dev/null >&2;
  41. if [[ $key = A ]]; then echo up;fi
  42. if [[ $key = B ]];then echo dn;fi
  43. fi
  44. fi
  45. if [[ "$key" == "$($e \\x0A)" ]];then echo enter;fi;}
  46. M0(){ TPUT 4 3; $e "Скопируйте значения всех доступных для записи тегов из «src.cr2» в «dst.jpg» \033[32m exiftool -tagsFromFile src.cr2 dst.jpg \033[0m";}
  47. M1(){ TPUT 5 3; $e "Скопируйте значения всех доступных для записи тегов из «src.jpg» в «dst.jpg» \033[32m exiftool -TagsFromFile src.jpg -all:all dst.jpg \033[0m";}
  48. M2(){ TPUT 6 3; $e "Удалите всю метаинформацию \033[33m exiftool -all= dst.jpg \033[0m";}
  49. M3(){ TPUT 7 3; $e "Восстановите всю метаинформацию EXIF с нуля в образе \033[32m exiftool -exif:all= -tagsfromfile @ -all:all -unsafe bad.jpg \033[0m";}
  50. M4(){ TPUT 8 3; $e "Скопируйте метаинформацию из «a.jpg» в файл данных XMP \033[32m exiftool -Tagsfromfile a.jpg out.xmp \033[0m";}
  51. M5(){ TPUT 9 3; $e "Скопируйте всю метаинформацию из «a.jpg» в «b.jpg», удалив всю информацию XMP и эскиз \033[32m exiftool -tagsFromFile a.jpg -XMP:All= -ThumbnailImage= -m b.jpg \033[0m";}
  52. M6(){ TPUT 10 3; $e "Скопируйте заголовок с одного изображения на другое и установите новое имя автора \033[32m exiftool -TagsFromFile src.jpg -title -author=Phil dst.jpg \033[0m";}
  53. M7(){ TPUT 11 3; $e "Скопируйте ISO из одного изображения и комментарий из другого изображения в целевой образ\033[32m exiftool -TagsFromFile a.jpg -ISO -TagsFromFile b.jpg -comment dst.jpg\033[0m";}
  54. M8(){ TPUT 12 3; $e "Копируйте информацию EXIF из одного изображения в другое, за исключением тегов SubIFD \033[32m exiftool -tagsfromfile src.jpg -exif:all --subifd:all dst.jpg \033[0m";}
  55. M9(){ TPUT 13 3; $e "Используйте дату из метаинформации, чтобы установить дату изменения файловой системы \033[32m exiftool '-FileModifyDate<DateTimeOriginal' dir \033[0m";}
  56. M10(){ TPUT 14 3; $e "Скопируйте всю возможную информацию из «src.jpg» и запишите в формате XMP в «dst.jpg» \033[32m exiftool -TagsFromFile src.jpg '-xmp:all<all' dst.jpg \033[0m";}
  57. M11(){ TPUT 15 3; $e "Установите Описание изображения из имени файла после удаления расширения \033[32m exiftool '-Description<\${FileName;s/\.[^.]*\$//}' dir \033[0m";}
  58. M12(){ TPUT 16 3; $e "Преобразуйте информацию IPTC в XMP с соответствующими преобразованиями имен тегов \033[32m exiftool -@ iptc2xmp.args -iptc:all= a.jpg \033[0m";}
  59. M13(){ TPUT 17 3; $e "Рекурсивно перезаписать все изображения JPG в dir с информацией \033[32m exiftool -tagsfromfile %d%f.CR2 -r -ext JPG dir \033[0m";}
  60. M14(){ TPUT 18 3; $e "Добавить марку камеры в список ключевых слов \033[32m exiftool '-keywords+<make' image.jpg \033[0m";}
  61. M15(){ TPUT 19 3; $e "Установите тег комментария для всех изображений в «dir» из значений тегов EXIF: ISO \033[32m exiftool '-comment<ISO=\$exif:iso Exposure=\${shutterspeed}' dir \033[0m";}
  62. M16(){ TPUT 20 3; $e "Скопируйте ICC_Profile из одного образа в другой \033[32m exiftool -TagsFromFile src.jpg -icc_profile dst.jpg \033[0m";}
  63. M17(){ TPUT 21 3; $e "Скопируйте всю метаинформацию в исходной форме из изображения JPEG в файл MIE \033[32m exiftool -TagsFromFile src.jpg -all:all dst.mie \033[0m";}
  64. M18(){ TPUT 22 3; $e "Bыполняет ту же задачу, за исключением того, что параметр -o не будет записывать в файл \033[32m exiftool -o dst.mie -all:all src.jpg \033[0m";}
  65. M19(){ TPUT 23 3; $e "[Дополнительно] Извлеките JpgFromRaw или PreviewImage из всех файлов, кроме JPG, в DIR, сохранив их с именами файлов, например image_EXT.jpg ";}
  66. #
  67. M20(){ TPUT 25 3; $e "Примечание \033[32m Note \033[0m";}
  68. M21(){ TPUT 26 3; $e "Переименуйте old.jpg в new.jpg в каталоге dir \033[32m exiftool -filename=new.jpg dir/old.jpg \033[0m";}
  69. M22(){ TPUT 27 3; $e "Переместите файлы из каталога «dir» в каталоги, названные исходными расширениями файлов \033[32m exiftool -directory=%e dir \033[0m";}
  70. M23(){ TPUT 28 3; $e "Переместите все файлы в «dir» в иерархию каталогов на основе года, месяца и дня \033[32m exiftool '-Directory<DateTimeOriginal' -d %Y/%m/%d dir \033[0m";}
  71. M24(){ TPUT 29 3; $e "Тот же эффект, что и выше, за исключением того, что файлы копируются, а не перемещаются \033[32m exiftool -o . '-Directory<DateTimeOriginal' -d %Y/%m/%d dir \033[0m";}
  72. M25(){ TPUT 30 3; $e "Переименуйте все файлы в «dir», добавив к имени файла название модели камеры \033[32m exiftool '-filename<%f_\${model;}.%e' dir \033[0m";}
  73. M26(){ TPUT 31 3; $e "Переименуйте все изображения в dir в соответствии с датой и временем CreateDate \033[32m exiftool '-FileName<CreateDate' -d %Y%m%d_%H%M%S%%-c.%%e dir \033[0m";}
  74. M27(){ TPUT 32 3; $e "Задайте имена файлов изображений JPG в каталоге с помощью тегов CreateDate и FileNumber \033[32m exiftool '-FileName<\${CreateDate}_\$filenumber.jpg' -d %Y%m%d -ext jpg \033[0m";}
  75. #
  76. M28(){ TPUT 34 3; $e "Выход \033[32m EXIT \033[0m";}
  77. LM=28
  78. MENU(){ for each in $(seq 0 $LM);do M${each};done;}
  79. POS(){ if [[ $cur == up ]];then ((i--));fi
  80. if [[ $cur == dn ]];then ((i++));fi
  81. if [[ $i -lt 0 ]];then i=$LM;fi
  82. if [[ $i -gt $LM ]];then i=0;fi;}
  83. REFRESH(){ after=$((i+1)); before=$((i-1))
  84. if [[ $before -lt 0 ]];then before=$LM;fi
  85. if [[ $after -gt $LM ]];then after=0;fi
  86. if [[ $j -lt $i ]];then UNMARK;M$before;else UNMARK;M$after;fi
  87. if [[ $after -eq 0 ]] || [ $before -eq $LM ];then
  88. UNMARK; M$before; M$after;fi;j=$i;UNMARK;M$before;M$after;}
  89. INIT(){ R;HEAD;FOOT;MENU;}
  90. SC(){ REFRESH;MARK;$S;$b;cur=`ARROW`;}
  91. # Функция возвращения в меню
  92. ES(){ MARK;$e " ENTER = main menu ";$b;read;INIT;};INIT
  93. while [[ "$O" != " " ]]; do case $i in
  94. 0) S=M0;SC;if [[ $cur == enter ]];then R;echo " Скопируйте значения всех доступных для записи тегов из «src.cr2» в «dst.jpg», записав информацию в одноименные теги в предпочтительных группах.";ES;fi;;
  95. 1) S=M1;SC;if [[ $cur == enter ]];then R;echo " Скопируйте значения всех доступных для записи тегов из «src.jpg» в «dst.jpg», сохранив исходные группы тегов.";ES;fi;;
  96. 2) S=M2;SC;if [[ $cur == enter ]];then R;echo "
  97. Удалите всю метаинформацию с изображения «dst.jpg», затем скопируйте теги EXIF из «src.jpg»:
  98. exiftool -all= -tagsfromfile src.jpg -exif:all dst.jpg
  99. #
  100. Следующая команда удалит все дополнительные метаданные, связанные с файлом
  101. exiftool -all= imagen.jpg
  102. #
  103. Для удаления EXIF-данных из всех файлов изображений в директории:
  104. exiftool -all= *
  105. #
  106. Для удаления EXIF-данных только из изображений, удовлетворяющих маске (например, с расширением .jpg):
  107. exiftool -all= *.jpeg
  108. #
  109. Если нужно удалить метаданные рекурсивно из всех файлов в директории /home/user/photo/, не создавая бэкапы и с показам прогресса:
  110. exiftool -overwrite_original -progress -r -all= /home/user/photo/*
  111. ";ES;fi;;
  112. 3) S=M3;SC;if [[ $cur == enter ]];then R;echo " Восстановите всю метаинформацию EXIF с нуля в образе. Этот метод можно использовать в изображениях JPEG для восстановления поврежденной информации EXIF, которая в
  113. противном случае не мог быть записан из-за ошибок. Тег «Небезопасный» - это ярлык для небезопасных тегов EXIF в изображениях JPEG, которые обычно не копируются.
  114. Видеть документацию по именам тегов для получения дополнительных сведений о небезопасных тегах.";ES;fi;;
  115. 4) S=M4;SC;if [[ $cur == enter ]];then R;echo " Скопируйте метаинформацию из «a.jpg» в файл данных XMP. Если файл данных XMP «out.xmp» уже существует, он будет обновлен с новой информацией. В противном случае
  116. будет создан файл данных XMP. Таким образом можно создавать только файлы, содержащие только метаданные (файлы, содержащие изображения, можно редактировать, но не
  117. созданный). См. «ПРИМЕРЫ НАПИСАНИЯ» выше, чтобы узнать о другом способе создания файлов XMP.";ES;fi;;
  118. 5) S=M5;SC;if [[ $cur == enter ]];then R;echo " Скопируйте всю метаинформацию из «a.jpg» в «b.jpg», удалив всю информацию XMP и эскиз изображения из места назначения.";ES;fi;;
  119. 6) S=M6;SC;if [[ $cur == enter ]];then R;echo " Скопируйте заголовок с одного изображения на другое и установите новое имя автора.";ES;fi;;
  120. 7) S=M7;SC;if [[ $cur == enter ]];then R;echo " Скопируйте ISO из одного изображения и комментарий из другого изображения в целевой образ.";ES;fi;;
  121. 8) S=M8;SC;if [[ $cur == enter ]];then R;echo " Копируйте только информацию EXIF из одного изображения в другое, за исключением тегов SubIFD.";ES;fi;;
  122. 9) S=M9;SC;if [[ $cur == enter ]];then R;echo " Используйте исходную дату из метаинформации, чтобы установить дату изменения файловой системы одного и того же файла для всех изображений в каталоге. (Обратите
  123. внимание, что \"-TagsFromFile @\" предполагается, если при перенаправлении информации, как в этом примере, не указан другой -TagsFromFile.)";ES;fi;;
  124. 10) S=M10;SC;if [[ $cur == enter ]];then R;echo " Скопируйте всю возможную информацию из «src.jpg» и запишите в формате XMP в «dst.jpg».";ES;fi;;
  125. 11) S=M11;SC;if [[ $cur == enter ]];then R;echo " Установите Описание изображения из имени файла после удаления расширения. В этом примере используется «Расширенное форматирование» для выполнения операция
  126. подстановки для удаления последней точки и последующих символов из имени файла.";ES;fi;;
  127. 12) S=M12;SC;if [[ $cur == enter ]];then R;echo " Преобразуйте информацию IPTC в XMP с соответствующими преобразованиями имен тегов и удалите исходную информацию IPTC из изображения. В этом примере используется
  128. iptc2xmp.args - файл, включенный в дистрибутив ExifTool и содержащий необходимые аргументы для преобразования информации IPTC в формат XMP. Также в дистрибутив
  129. включены xmp2iptc.args (который выполняет обратное преобразование) и еще несколько файлов .args для других преобразований между EXIF, IPTC и XMP.";ES;fi;;
  130. 13) S=M13;SC;if [[ $cur == enter ]];then R;echo " Рекурсивно перезаписать все изображения \"JPG\" в \"dir\" с информацией, скопированной из соответствующих изображений \"CR2\" в тех же каталогах.";ES;fi;;
  131. 14) S=M14;SC;if [[ $cur == enter ]];then R;echo " Добавить марку камеры в список ключевых слов.";ES;fi;;
  132. 15) S=M15;SC;if [[ $cur == enter ]];then R;echo " Установите тег комментария для всех изображений в «dir» из значений тегов EXIF: ISO и ShutterSpeed. Результирующий комментарий будет в виде
  133. \"ISO=100 Exposure=1/60\"";ES;fi;;
  134. 16) S=M16;SC;if [[ $cur == enter ]];then R;echo " Скопируйте ICC_Profile из одного образа в другой.";ES;fi;;
  135. 17) S=M17;SC;if [[ $cur == enter ]];then R;echo " Скопируйте всю метаинформацию в исходной форме из изображения JPEG в файл MIE. Если файл MIE не существует, он будет создан. Эта техника может использоваться для
  136. хранения метаданных изображения, чтобы его можно было вставить обратно в изображение (с помощью обратной команды) позже в рабочем процессе.";ES;fi;;
  137. 18) S=M18;SC;if [[ $cur == enter ]];then R;echo " Эта команда выполняет ту же задачу, что и команда выше, за исключением того, что параметр -o не будет записывать в выходной файл, который уже существует.";ES;fi;;
  138. 19) S=M19;SC;if [[ $cur == enter ]];then R;echo "
  139. exiftool -b -jpgfromraw -w %d%f_%ue.jpg -execute -b -previewimage -w %d%f_%ue.jpg -execute -tagsfromfile @ -srcfile %d%f_%ue.jpg -overwrite_original -common_args --ext jpg DIR
  140. [Дополнительно] Извлеките JpgFromRaw или PreviewImage из всех файлов, кроме JPG, в DIR, сохранив их с именами файлов, например image_EXT.jpg, затем добавьте все
  141. мета информация из исходных файлов в извлеченные изображения. Здесь командная строка разбита на три раздела (разделенных параметрами -execute), и каждый выполняется,
  142. как если бы это была отдельная команда. Параметр -common_args заставляет аргументы --ext jpg DIR применяться ко всем трем команд, а опция -srcfile позволяет
  143. извлеченному изображению JPG быть исходным файлом для третьей команды (тогда как файлы RAW являются исходным файлы для двух других команд).
  144. ";ES;fi;;
  145. 20) S=M20;SC;if [[ $cur == enter ]];then R;echo " Путем записи тегов «FileName» и «Directory» файлы переименовываются и / или перемещаются в новые каталоги. Это может быть особенно полезно и эффективно для
  146. организация файлов по дате в сочетании с параметром -d. Новые каталоги создаются по мере необходимости, но существующие файлы не будут перезаписаны. В коды
  147. формата % d,% f и% e могут использоваться в новом имени файла для представления каталога, имени и расширения исходного файла, а% c может использоваться для добавления
  148. номер копии, если файл уже существует (подробности см. в параметре -w). Обратите внимание, что если используется в строке формата даты, к передать эти коды через
  149. синтаксический анализатор даты / времени. (И далее обратите внимание, что в пакетном файле Windows все символы '%' также должны быть экранированы, поэтому в этом
  150. крайнем случае case '%%%% f' необходим для передачи простого '% f' через два уровня синтаксического анализа.)
  151. Дополнительную документацию и примеры см. в https://exiftool.org/filename.html";ES;fi;;
  152. 21) S=M21;SC;if [[ $cur == enter ]];then R;echo " Переименуйте \"old.jpg\" в \"new.jpg\" в каталоге \"dir\".";ES;fi;;
  153. 22) S=M22;SC;if [[ $cur == enter ]];then R;echo " Переместите все файлы из каталога «dir» в каталоги, названные исходными расширениями файлов.";ES;fi;;
  154. 23) S=M23;SC;if [[ $cur == enter ]];then R;echo " Переместите все файлы в «dir» в иерархию каталогов на основе года, месяца и дня «DateTimeOriginal». например) Эта команда переместит файл «dir / image.jpg»
  155. с «DateTimeOriginal» от «2005: 10: 12 16:05:56» до «2005/10/12 / image.jpg».";ES;fi;;
  156. 24) S=M24;SC;if [[ $cur == enter ]];then R;echo " Тот же эффект, что и выше, за исключением того, что файлы копируются, а не перемещаются.";ES;fi;;
  157. 25) S=M25;SC;if [[ $cur == enter ]];then R;echo " Переименуйте все файлы в «dir», добавив к имени файла название модели камеры. Точка с запятой после имени тега внутри фигурных скобок приводит к появлению символов
  158. которые недопустимы в именах файлов Windows, которые необходимо удалить из значения тега (см. «Расширенное форматирование» для объяснения).";ES;fi;;
  159. 26) S=M26;SC;if [[ $cur == enter ]];then R;echo " Переименуйте все изображения в dir в соответствии с датой и временем CreateDate, добавив номер копии с ведущим '-', если файл уже существует (\"% -c\"),
  160. и с сохранением исходного расширения файла (% e). Обратите внимание на дополнительный символ «%», необходимый для экранирования кодов файлов (% c и% e) в строке
  161. формата даты.";ES;fi;;
  162. 27) S=M27;SC;if [[ $cur == enter ]];then R;echo " Задайте имена файлов всех изображений JPG в текущем каталоге с помощью тегов CreateDate и FileNumber в виде «20060507_118-1861.jpg».";ES;fi;;
  163. #
  164. 28) S=M28;SC;if [[ $cur == enter ]];then R;clear;exit 0;fi;;
  165. esac;POS;done