Сортировка фотографий с использованием сценария оболочки

Большинство моих файлов фотографий имеют следующее соглашение об именах / формат IMG_20131204_120000.JPG, показывающее дату и время, когда была сделана фотография (соглашение об именах iPhone / Apple). Однако не все мои фотографии соответствуют этому соглашению об именах. С помощью этого форума я разработал следующий сценарий, чтобы классифицировать мои фотографии в каталогах дат:

cd '/photos/' for x in *.JPG *.jpg *.TIF *.tif *.PNG *.png *.BMP *.bmp *.GIF *.gif *.IMG *.img *.JPEG *.jpeg *.TIFF *.tiff; do d=$(date -r "$x" +%Y%m%d)" - Family Photos" t=$(expr substr "$x" 1 4) if [ "$t" == "IMG_" ]; then d=$(expr substr "$x" 5 8)" - Family Photos" fi mkdir -p "$d" >/dev/null 2>&1 mv -- "$x" "$d/" >/dev/null 2>&1 done 

PS. Я использую оператор IF, чтобы взять дату из самого имени файла, если имя файла находится в формате IMG_20131204_120000.JPG, так как эта дата наиболее точно отражает дату, когда фотография была фактически сделана, но если файл не соответствует этому соглашению об именах, я введите дату операционной системы, когда файл был последним изменен / создан.

Он работает отлично по большей части, за исключением случаев, когда есть файлы, которые начинаются с «IMG_», но затем не соответствуют соглашению об именах IMG_20131204_120000.JPG, например, файл IMG_001.JPG или IMG_Photo1. Есть ли лучший способ структурировать оператор IF здесь, чтобы он проверял не только то, что файл начинается с «IMG_», но и следующие 8 символов – это числа / формат даты?

Вы можете изменить команду if на что-то вроде этого:

 if [[ "$t" =~ IMG_+[0-9]{8}[a-zA-Z]*$ ]] 

=~ – оператор сравнения регулярных выражений, который вводится в bash версии 3 и выше.

Используя этот оператор if, вы можете поймать имена, такие как IMG_11111111alphabets.ext . Вы можете играть с ним и настраивать его в соответствии с вашими потребностями. Для получения дополнительной информации см. Следующее: регулярное выражение Баша

Я мог бы пойти по этому поводу по-другому. ImageMagik может читать метаданные exif из ваших файлов изображений. Формат не меняется.

 identify -verbose example.jpg 

возвращается (вместе с большим количеством другой информации)

Свойства:

дата: создание: 2013-11-07T04: 55: 55-06: 00
дата: изменить: 2013-11-07T04: 55: 55-06: 00

Вы могли бы grep создать дату, а затем разобрать ее, чтобы вам действительно не нужно иметь дело с условными утверждениями или вообще разбирать странное имя файла