我有一个充满文件的文件夹,我有时需要在其中将这些文件的子集复制到其他地方进行处理。
文件在文件名(即filename_20131028.txt)中具有创建日期。
如何在两个日期之间选择和复制文件。理想情况下,我想制作一个类似于“ get_my_foo_files.sh 20131010 20131025”的脚本,并获取10月10日至10月25日之间的文件。
提前致谢。
编辑:我也开放使用Python / Perl的解决方案。
使用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,请注意此Beartrap)。
(如果您遇到过,古老的date
(sh-utils时代)版本允许使用mktime()
规范化功能,您可以简单地将每月的每日增量增加到99,然后它将为您静默修复:
$ date -d 20160832
Thu Sep 1 00:00:00 IST 2016
)
非常类似的东西(但可以说在行为上不相同),也可以用文件系统的时间戳来完成使用GNUfind
和修改时间相关的选项(-mtime
,-daystart
等等)。
一个可能有用的变化是使用bash的扩展globlob(通过@(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
)执行单个操作时,此功能很有用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句