Linux:复制文件名中带有两个日期之间的日期的文件

Linux:复制文件名中带有两个日期之间的日期的文件

我有一个装满文件的文件夹,我时不时需要将其中的一部分文件复制到其他地方进行处理。

文件的文件名中包含创建日期,例如 filename_20131028.txt。

我该如何选择和复制两个日期之间的文件?最好我想编写一个类似“get_my_foo_files.sh 20131010 20131025”的脚本,并获取 10 月 10 日至 10 月 25 日之间的文件。

提前致谢。

编辑:我也接受使用 Python/Perl 的解决方案。

答案1

使用 GNU,date您可以轻松循环遍历一系列 YYYYMMDD 格式的日期:

#!/usr/bin/bash
first=$1
last=$2

while [[ $first -le $last ]]; do
    match=$(date +%Y%m%d  -d $first)
    echo "filename_${match}.txt"
    first=$(date +%Y%m%d -d "$first 1 day")
done 

添加你的处理,而不是echo ...。这使用日期运算其中“n day”是在给定日期上加天数,“-n day”也适用于减法(不过要注意这个捕熊器如果 HH:MM 也存在)

(如果你遇到过,古老的datesh-实用程序时代 (era) 版本允许使用mktime()规范化功能,您只需不断将月份日期增加到 99,它就会默默地为您修复它:

 $ date -d 20160832
 Thu Sep  1 00:00:00 IST 2016

一些非常相似(但可以说行为并不完全相同)的东西也可以使用文件系统时间戳使用 GNUfind及其修改时间相关选项(-mtime以及-daystart更多)。

一个可能有用的变体是使用 bash 的扩展通配符(通过@(pattern))这样您就可以一次性处理所有文件:

#!/usr/bin/bash
first=$1
last=$2

globlist=$1
while [[ $first -le $last ]]; do
    first=$(date +%Y%m%d -d "$first 1 day")
    globlist="${globlist}|${first}"
done 

shopt -s nullglob extglob
filelist="$(echo filename_@($globlist).txt)"  # NB whitespace in filenames
echo "filelist is: $filelist"

filearr=( filename_@($globlist).txt )  # safer for troublesome names
declare -p filearr

这还设置了nullglob零匹配会导致空字符串而不是错误。当最好对多个文件执行单个操作时(例如tarrsync),这很有用。

相关内容