我有一个装满文件的文件夹,我时不时需要将其中的一部分文件复制到其他地方进行处理。
文件的文件名中包含创建日期,例如 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 也存在)
(如果你遇到过,古老的date
(sh-实用程序时代 (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
零匹配会导致空字符串而不是错误。当最好对多个文件执行单个操作时(例如tar
或rsync
),这很有用。