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两者都不兼容。除此之外,您还不清楚您的意思。在
循环中为
指定目录会是什么样子?您的意思是要迭代目录,而不是迭代数字吗?