gpt4 book ai didi

regex - BASH 查找大量文件中任意范围数字的正则表达式

转载 作者:太空宇宙 更新时间:2023-11-04 10:26:13 25 4
gpt4 key购买 nike

我正在编写一个 BASH 脚本,其中包括根据开始日期和结束日期的输入参数将文件从一个目录复制到另一个目录。文件名的格式为 YYYYMMDDhhmmss.jpg,例如20161230143922.jpg。我正在使用 find ... -exec cp {} ... 因为源目录中有数万个文件。输入参数是格式为 YYYYMMDD 的开始和结束日期。

我知道我不能像 ($startdate..$enddate) 这样在正则表达式中做一个简单的范围,但我无法弄清楚如何以编程方式生成一个可以工作的正则表达式.如果我有更少的文件,我可以简单地执行 cp {$startdate..$enddate} destination,但唉,我认为这是不可行的。

我想复制 $startdate$enddate 之间 0500 和 1700 之间的所有文件。这将包括像 20170102060635 这样的图像。 jpg20170104131255.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}

最佳答案

正则表达式不是处理数值范围的最佳工具,因此您可能需要考虑一种在正则表达式本身之外合并某些逻辑的解决方案。像这样:

REGEX="([0-9]{8})([0-9]{4})"

for f in ~/Desktop/originals/*.jpg
do
if [[ $f =~ $regex ]]
then
datepart=${BASH_REMATCH[1]}
timepart=${BASH_REMATCH[2]}

#if the DATE part matches
if (( $STARTDATE <= $datepart )) && (( $datepart <= $ENDDATE ))
then
#if the TIME part matches
if [[ $timepart =~ "(0[5-9]|1[0-7])" ]]
then
# copy file ...
fi
fi
fi
done

纯正则表达式解决方案

如果您真的想要一个纯正则表达式解决方案,这将有助于证明其复杂性。这是一个正则表达式,用于查找 0500 到 1700 时间范围内的所有文件,日期为 2017 年 1 月:^201701\d{2}(0[5-9]|1[0-7])\d{4 }\.jpg$

注意匹配从 0500 到 1700 的时间所需的正则表达式模式:

(0[5-9]|1[0-7])

它不是很漂亮,而且是硬编码的范围。要处理动态开始和结束日期,您将动态构建类似的模式。可以做到,但为什么要使用正则表达式呢?

这是一个示例,显示了您需要为 20161225 到 20170114 的日期范围生成的内容:

^(201612(2[5-9]|3\d)|201701(0\d|1[0-4]))(0[5-9]|1[0-7] )\d{4}\.jpg$

关于regex - BASH 查找大量文件中任意范围数字的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41472097/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com