2017-06-23 62 views
0

我每天都會生成名稱爲ABC_20170622.csv的文件,只有日期參數會被更改。我需要將基於日期參數的最後07天文件連接到一個文件中,這將在每個星期一完成。concat最後07天文件到Shell中的一個文件中

示例文件集; Jun 15 07:00 ABC_20170614.csv Jun 16 07:00 ABC_20170615.csv Jun 17 07:00 ABC_20170616.csv Jun 18 07:00 ABC_20170617.csv Jun 19 07:00 ABC_20170618.csv Jun 20 07:00 ABC_20170619.csv Jun 21 07:00 ABC_20170620.csv Jun 22 07:00 ABC_20170621.csv Jun 23 07:00 ABC_20170622.csv

這就像 cat ABC_20170619.csv ABC_20170620.csv ABC_20170621.csv > one_week.csv

但我需要automaticaly得到的日期,這將在shell腳本運行..

+0

你相信mtimes是準確的嗎?如果您不需要取消名稱並信任文件系統元數據,那只是「查找」。 -mtime -7 -exec cat - {} +> one_week.csv' –

+0

順便說一句 - 你可以使用bash builtins來做這個嗎?如果是這樣,哪個版本? (現代bash - 自4.2左右開始 - 有'printf%()T'格式的字符串支持,在某些情況下不需要'date'命令)。 –

+0

如果你不*擁有現代bash,你是否保證有'date'的GNU實現(相對於busybox或BSD版本等)? –

回答

3

第一 - 在容易的就是用文件的時間戳,不是名字。這將是這樣的:

find . -mtime -7 -exec cat -- {} + >one_week.csv 

但是,假設你真的需要使用的名字。好吧,那麼:

#!/usr/bin/env bash 

die() { echo "$*" >&2; exit 1; } 

[ -n "$BASH_VERSION" ] || die "This script requires bash" 
[[ $BASH_VERSION =~ ^[0123] ]] && die "This script requires bash 4.2" 
[[ $BASH_VERSION =~ ^4[.][01][.] ]] && die "This script requires bash 4.2" 

# bash 4.2: get current epoch time in seconds 
printf -v current_time_seconds '%(%s)T' -1 

# subtract 7 days from that 
prev_week_seconds=$((current_time_seconds - (60 * 60 * 24 * 7))) 

# convert it to YYYYMMDD 
printf -v prev_week_date '%(%Y%m%d)T' "$prev_week_seconds" 

# generate the first name that matches 
start_file=ABC_${prev_week_date}.csv 

# generate an array listing files that exist with that name or newer 
files=() 
for f in ABC_*.csv; do 
    if [[ $f = $start_file || $f > $start_file ]]; then 
    files+=("$f") 
    fi 
done 

# concatenate all files generated above 
cat -- "${files[@]}" >one_week.csv 

如果需要,使這項工作與舊版本的bash(ERR,合理舊版本的bash的 - 我不能保證任何事情預先3.2),改變printf -v current_time_seconds '%(%s)T' -1current_time_seconds=$(date +%s) ,並且printf -v prev_week_date '%(%Y%m%d)T' "$prev_week_seconds"prev_week_date=$(date -d "@$prev_week_seconds" +%Y%m%d)。請注意,即使這些需要GNU日期,也不能保證與其他OS供應商提供的date命令一起使用。

相關問題