Создайте временную шкалу изображений jpg в соответствии с датой изменения, используя linux - PullRequest
0 голосов
/ 24 сентября 2018

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

Я пробовал до сих пор:

ls -Rt *.jpg | convert -append jpgfile

и

convert -append $(ls -Rtr $(find MontrealTest -name *.jpg)) MontrealTest.jpg

Программа bash должна создать временную шкалу изображений в q3_image_sorter.bash от самого старого до самого нового.convert -append может использоваться для создания изображения временной шкалы, состоящего из N аргументов имени изображения.N-1 обрабатываются как входные данные, которые должны считываться и укладываться вертикально, а последний (N-й) аргумент - это выходное имя файла

.Изображение временной шкалы должно соответствовать пути, указанному в качестве первого аргумента, но _ заменять любые косые черты.ех.$ bash q3_image_sorter.bash Q3/SimpleTest выводит файл Q3_SimpleTest.jpg.* рекомендуется использовать eog для просмотра файлов

Это список файлов jpg, и мне нужно преобразовать их в изображения.Например, при запуске bash q3_image_sorter.bash Q3/MontrealTest я получу 8 изображений от самых старых до самых новых.

enter image description here

1 Ответ

0 голосов
/ 24 сентября 2018

Надежное выполнение (т. Е. Безопасное поддержание необычных или враждебных имен файлов или каталогов - кроме тех, которые содержат символы новой строки, которые мы отбрасываем, чтобы избежать зависимости от GNU sort), может выглядеть следующим образом:

#!/usr/bin/env bash

# Start with a version check; this would need changes to support older bash
case $BASH_VERSION in ''|[123].*) echo "ERROR: Bash 4.0 required" >&2; exit 1;; esac

dir=$1
[[ $dir ]] || { echo "Usage: ${0##*/} dirname" >&2; exit 1; }

# telling find to ignore files with newlines so we don't need to use GNU sort
readarray -t files < <(
  find "$dir" -name $'*\n*' -prune -o -type f -name '*.jpg' -printf '%T@ %p\n' \
    | sort -n | sed -e 's/^[^ ]* //'
)

(( ${#files[@]} )) || { echo "ERROR: No .jpg files found in $dir" >&2; exit 1; }

outname=${dir//'/'/_}.jpg  ## replace slashes with underscores and add .jpg to get outname

convert "${files[@]}" -append "$outname"

Ссылки на синтаксис, используемый в каждом месте:

  • readarray считывает список элементов в массив.По умолчанию ожидается содержимое с разделителями новой строки;в bash 4.4 аргумент -d '' может использоваться вместо указания разделителей NUL.readarray также называется mapfile и задокументировано по адресу http://wiki.bash -hackers.org / commands / builtin / mapfile
  • (( )) входит в арифметический контекст, где нольрезультат оценивается как ложный, а ненулевой результат идентифицируется как истинный.См. http://wiki.bash -hackers.org / syntax / arith_expr для получения дополнительной информации об арифметических выражениях в bash.
  • ${#arrayname[@]} расширяется до количества элементов в массиве с именем arrayname.См. BashFAQ # 5 для общего ознакомления с массивами в bash, или http://wiki.bash -hackers.org / syntax / arrays
  • ${varname//search/replace} расширяется до содержимогопеременной с именем varname, со всеми экземплярами search, замененными на replace.Это пример раскрытия параметров, подробно описанный в http://wiki.bash -hackers.org / syntax / pe .
  • "${arrayname[@]}" расширяется до отдельных элементов из массива с именем arrayname.
  • <( ... ) - это подстановка процесса - синтаксис, который создает файловый объект, который при чтении будет содержать выходные данные команды ....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...