我们得到一组文件(TEMP1_12172014.txt,TEMP2_12172014.txt,TEMP3_12172014.txt)作为一组和(TEMP1_12182014.txt,TEMP2_12182014.txt,TEMP3_12182014.txt)。
所有6个文件都在一个位置:/ home / wauser / tempfiles
我必须根据时间戳一次处理TEMP1,TEMP2和TEMP3。处理必须一个接一个地完成。完成第一组处理后,从该位置删除该组并处理下一组。
请帮助找到使用unix脚本执行这些文件的方法。
更新:我们必须将/ home / wauser / tempfiles中的一组文件复制到/ home / wauser / tempprocessfiles
提前致谢。
答案 0 :(得分:1)
source="/home/wauser/tmpfiles"
target="/home/wauser/tempprocessfiles"
cd "$source" || exit 1
ls TEMP[0-9]_[01][0-9][0-3][0-9]20[0-9][0-9].txt 2>/dev/null |
sed 's/TEMP._\([01][0-9][0-3][0-9]20[0-9][0-9]\)\.txt/\1/' |
sort -u |
sed 1q |
while read date
do
mv TEMP[0-9]_${date}.txt "$target"
done
使用ls
有点值得商榷,但如果文件名按照它们的原样进行控制,则不会遇到名称中出现意外字符的问题 - 文件名中的空格和换行符对脚本造成严重破坏,但明确描述的名称不包含空格等。
脚本将目录更改为源目录(或退出; cd
命令会在失败时生成错误消息)。它会根据与模板匹配的文件名生成可能日期的列表,该列表适度地限制为已识别的半合理日期(但它允许在19个月的第39天;它不能真正验证日期) 。从该列表中,它选择最早排序的那个。这意味着它将在11月30日之前选择12月1日。如果您使用格式为YYYYMMDD的日期,则列出的第一个条目将是最早的日期。如果您想使用更复杂的排序标准,可以修复它:
sort -u -k 1.5,1.9 -k 1.3,1.4 -k 1.1,1.2
' while'循环也可以说是多余的;您可以将其替换为(read date; mv TEMP[0-9]_${data}.txt "$target")
或其左右。然后,您可以省略管道的sed 1q
部分;只读第一行。