尝试根据文件名中包含的日期将范围文件从一个目录复制到另一个目录时遇到问题。文件名中的日期为UTC,而创建的日期为CST。目录中包含的所有文件名都具有类似于以下内容的文件名:
foo_20160227_0015.gif
foo_20160227_0030.gif
.....
.....
foo_20160304_0030.gif
foo_20160304_0045.gif
我尝试使用的脚本如下:
# Variables
strPrevDay=$(date +"%Y%m%d" -d "yesterday")
str7DaysAgo=$(date +"%Y%m%d" -d "7 days ago")
strImgDir="~/Documents/Projects/Radar/Images/"
strTmpImgDir="~/Documents/Projects/Radar/Images/Temp/"
strFileName="foo_"
strFile=
# Copy files created in the last week
for f in $strImgDir$strFileName{$str7DaysAgo..$strPrevDay}*.gif; do cp "$f" $strTmpImgDir; done
然后,脚本运行后,我将收到以下错误消息:
cp: cannot stat ‘/home/user/Documents/Projects/Radar/Images/foo_{20160227..20160304}*.gif’: No such file or directory
发生此错误的原因是{$str7DaysAgo..$strPrevDay}
先扩展括号(因为它不是形式,所以什么也不做),然后扩展变量。这是一个陷阱。{NUMBER1..NUMBER2}
在7天之内,用来枚举日期并非没有道理date
。请参阅Jeff Schaller的答案。
另一种选择是使用eval
强制评估以期望的顺序进行。使用eval
是容易出错的,因为您需要非常小心要评估两次的部分,但是这里我们有部分文件名已知仅包含数字,因此可以。请注意,如果有几天没有文件生成,则需要打开该nullglob
选项。
#!/bin/bash
last_day=$(date +"%Y%m%d" -d "yesterday")
first_day=$(date +"%Y%m%d" -d "7 days ago")
eval "all_days=({$first_day..$last_day})"
image_directory=~/Documents/Projects/Radar/Images/
temporary_directory="$image_directory/Temp/"
filename_prefix="foo_"
shopt -s nullglob
for day in "${all_days[@]}"; do
files=("$image_directory/$filename_prefix$day"*.gif)
if [[ ${#files[@]} != 0 ]]; then
cp "${files[@]}" "$temporary_directory"
fi
done
(我还修复了您的引号-和难以理解的变量名。请注意,VAR="~/something"
将波浪号放入VAR
,您需要将波浪号不加引号以获取主目录。Bash然后扩展波浪号,因为您使用了无引号的变量扩展名,如果目录名称包含空格或其他Shell特殊字符,则会导致中断–除非您知道有必要,否则不要将变量不加引号。)
一种替代方法是枚举文件,仅复制所需范围内的文件。对于较大范围,这可能会更快,因为每次使用通配符都必须枚举目录中的文件(没有更快的方法来获取与特定模式匹配的文件)。
#!/bin/bash
last_day=$(date +"%Y%m%d" -d "yesterday")
first_day=$(date +"%Y%m%d" -d "7 days ago")
image_directory=~/Documents/Projects/Radar/Images/
temporary_directory="$image_directory/Temp/"
filename_prefix="foo_"
shopt -s nullglob
for file in "$image_directory/$filename_prefix"*.gif; do
file_date="${file##*/"$filename_prefix"}"; file_date=${file_date:0:8}
if ((file_date >= first_day && file_date <= last_day)); then
cp "$file" "$temporary_directory"
fi
done
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句