Я пишу скрипт BASH, который, между прочим, копирует файлы из одного каталога в другой на основе входных аргументов для дат начала и окончания. Имена файлов имеют формат YYYYMMDDhhmmss.jpg
, например. 20161230143922.jpg
. Я использую find ... -exec cp {} ...
, потому что в исходном каталоге есть десятки тысяч файлов. Входными аргументами являются дата начала и окончания в формате YYYYMMDD
.BASH найти регулярное выражение для произвольного диапазона чисел в большом количестве файлов
Я знаю, что я не могу сделать простой диапазон в регулярном выражении, например ($startdate..$enddate)
, но я не могу понять, как программно генерировать регулярное выражение, которое будет работать. Если бы у меня было меньше файлов, я мог бы просто сделать cp {$startdate..$enddate} destination
, но, увы, я не думаю, что это возможно.
Я хотел бы, чтобы скопировать все файлы между $startdate
и $enddate
, которые попадают между часами 0500 и 1700. Это будет включать в себя изображения, как 20170102060635.jpg
и 20170104131255.jpg
, но не 20170103010022.jpg
.
Это то, что я до сих пор:
#!/bin/bash
STARTDATE=$1
ENDDATE=$2
FILE_NAME="review-${STARTDATE}-${ENDDATE}.mp4"
if [[ -n "$STARTDATE" ]]; then
echo "STARTDATE: $STARTDATE"
else
echo "Invalid start date: '$STARTDATE'"
echo "Syntax: ./create_time_lapse_date_range.sh <startdate> <enddate>"
exit
fi
if [[ -n "$ENDDATE" ]]; then
echo "ENDDATE: $ENDDATE"
else
echo "Invalid end date: '$ENDDATE'"
echo "Syntax: ./create_time_lapse_date_range.sh <startdate> <enddate>"
exit
fi
cd ~/Desktop/test\ timelapse
# Copy relevant files to local directory
find ~/Desktop/originals -regex "???????????????" -exec cp {} ~/Desktop/test\ timelapse/ \;
# Rename files to be sequential serial numbers
find ~/Desktop/test\ timelapse -name "*.jpg" | awk 'BEGIN{ a=0 }{ printf "mv \"%s\" ~/Desktop/\"test\ timelapse/%06d.jpg\"\n", $0, a++ }' | bash
# Generate timelapse video
ffmpeg -framerate 25 -i %06d.jpg -c:v libx264 -r 25 ${FILE_NAME}
Вы можете создать функцию, которая будет разделена дату и время из файла и сравнить их к соответствующим границам. –