使用for循环的tar文件

时间:2018-04-14 19:13:04

标签: 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.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文件置于上述日期之上 检查(特定日期是否可用的文件)。

如果在任何日期没有可用文件。我的脚本创建空date.tar.gz

1 个答案:

答案 0 :(得分:0)

{1..30}

我根据shell globbing和你的描述的可能性限制了filepattern。

然后我收集数组中的文件并检查索引0处的第一个元素是否是文件。

顶部的文件/目录只是为了满足我的测试条件。

我真的不明白为什么你把日期计算成几秒钟。我仍然不明白为什么有变量DAYS_TO_ARCHIVE但在循环中有{1..$DAYS_TO_ARCHIVE}。也许是因为for i in $(seq 1 $DAYS_TO_ARCHIVE) 不起作用,但是

for dt in 201802{01..31}
do 
  ...
done 

会奏效。我希望它能进一步帮助你。

如果你整个月都这样做并且在每个月的第一天由cron控制,我会考虑使用日期命令YYYYMM和 - 例如201802(每个月)生成

 ${#toarc[0]}

如果(不存在)日期的丢失文件得到完美处理。

测试toarc的数组大小

Counter

不起作用,因为如果没有找到文件,则数组包含filepattern作为文本文本。

我希望这会有所帮助。