Bash 使用for循环的tar文件
我想在上述日期之前归档这些文件。我需要做到两件事 我有这样的示例文件Bash 使用for循环的tar文件,bash,shell,sh,Bash,Shell,Sh,我想在上述日期之前归档这些文件。我需要做到两件事 我有这样的示例文件 ABCSMOKLO2Y_pm24hr_20180410.000006_4.csv 11randomletters_6randomalphanumeric_YYYYMMDD.randomnumbers_randomnum.csv 我想根据文件名中的日期对文件进行tar。例如,如果我提到4月10日。每一个日期文件都应该在这样的特定日期上使用tar 20180410.tar.gz 20180409.tar.gz 20180408
ABCSMOKLO2Y_pm24hr_20180410.000006_4.csv
11randomletters_6randomalphanumeric_YYYYMMDD.randomnumbers_randomnum.csv
我想根据文件名中的日期对文件进行tar。例如,如果我提到4月10日。每一个日期文件都应该在这样的特定日期上使用tar
20180410.tar.gz
20180409.tar.gz
20180408.tar.gz
如果在特定日期没有可用的文件。我不想为没有文件的日期创建tar文件
function archive_old_files(){
d=$(date -d"$DAYS_TO_ARCHIVE days ago" +%s)
echo "$d"
for i in {1..30}; do
dt="$(date -d@$((d - i * 86400)) +%Y%m%d)"
fn="$dt.tar.gz"
if [ "$dt" -lt "$d" ] || [ -f *"$dt"* ]; then
tar -czf "$DEST_ARCHIVE"/$fn "$SRC_DIR_ARCHIVE"/*$dt*
fi
done
}
总结:
- 我需要在for循环中指定目录。我怎样才能达到目标
- 使用文件对上述日期以上的所有csv文件进行Tar 检查(文件是否在特定日期可用)
date.tar.gz
#!/bin/bash
SRC_DIR_ARCHIVE=dates
DAYS_TO_ARCHIVE=30
DEST_ARCHIVE=dates/archiv
d=$(date -d"$DAYS_TO_ARCHIVE days ago" +%Y%m%d)
echo "$d"
for i in {1..30}
do
dt="$(date -d "$d -${i} days" +%Y%m%d)"
fn="$dt.tar.gz"
toarc=("$SRC_DIR_ARCHIVE"/???????????_??????_${dt}.*_*.csv)
test -f "${toarc[0]}" && \
tar -czf "$DEST_ARCHIVE/$fn" ${toarc[*]} || \
echo "no file, cmd: tar -czf $DEST_ARCHIVE/$fn ${toarc[*]}"
done
我根据shell globbing的可能性和您的描述对文件模式进行了一些限制
然后我收集数组中的文件,并检查索引0处的第一个元素是否为文件
顶部的文件/目录名仅用于满足我的测试条件
我真的不明白你为什么把日期计算成秒。我仍然不明白为什么会有变量DAYS TO归档,但是在循环中有{1..30}
。可能是因为{1..$DAYS_TO_ARCHIVE}
不起作用,但是
for i in $(seq 1 $DAYS_TO_ARCHIVE)
会有用的。我希望它能进一步帮助你
如果你在每月的第一个月里用CRON来控制这个问题,我会考虑使用YyYYMM的日期命令,例如201802个月(每月)只生成
for dt in 201802{01..31}
do
...
done
如果缺少(不存在)日期的文件,则会得到完美的处理
toarc阵列尺寸的测试
${#toarc[0]}
不起作用,因为如果找不到文件,数组将以文本形式包含filepattern
我希望这会有所帮助。传递glob(如
[-f*“$dt”*]
中所述)是不可靠的——如果您有两个带有子字符串的文件,它将扩展为[-f 20180414-1.txt 20180414-2.txt]
,这是无效的语法。另请参见。请注意,POSIX标准化函数声明语法只是archive_old_files(){
,而遗留ksh函数声明语法是function archive_old_files{
;此处使用的amalgam两者都不兼容。除此之外,您还不清楚您的意思。在循环中为指定目录会是什么样子?您的意思是要迭代目录,而不是迭代数字吗?