Tar进入了for循环

时间:2018-04-01 04:34:47

标签: bash shell unix sh

我有大量带有日期的csv文件 我想将每天的文件tar到单独的tar.gz文件中。但是,当我这样做。单日输出卡住或单日创建tar文件。

1 个答案:

答案 0 :(得分:1)

你使这比它需要的更难。如果你要做的只是tar早于"5 days ago"的文件,那么你已经知道如何获取"5 days ago"的纪元以来的秒数,每天都是86400秒,所以循环每次减去i * 86400秒,因为你想回去生成感兴趣的日期和tar文件名,例如

$ d=$(date -d"5 days ago" +%s)
for i in {1..30}; do 
    dt="$(date -d@$((d - i * 86400)) +%Y%m%d)"
    fn="$dt.tar.gz"
    echo "tar -czf $fn *$dt*"
done

它使用简单的通配符来查找与每个日常tar文件中包含的日期匹配的所有文件,例如,上面代码段的输出是:

tar -czf 20180326.tar.gz *20180326*
tar -czf 20180325.tar.gz *20180325*
tar -czf 20180324.tar.gz *20180324*
tar -czf 20180323.tar.gz *20180323*
tar -czf 20180322.tar.gz *20180322*
tar -czf 20180321.tar.gz *20180321*
tar -czf 20180320.tar.gz *20180320*
...
tar -czf 20180304.tar.gz *20180304*
tar -czf 20180303.tar.gz *20180303*
tar -czf 20180302.tar.gz *20180302*
tar -czf 20180301.tar.gz *20180301*
tar -czf 20180228.tar.gz *20180228*
tar -czf 20180227.tar.gz *20180227*
tar -czf 20180226.tar.gz *20180226*
tar -czf 20180225.tar.gz *20180225*

您可以轻松地将此逻辑调整为上述函数,并且比命令替换中的三重管道更有效,只是为了每天生成DIFF

编辑以回应评论Re:递归

上面的目的是提供一个计算所需日期和形成tar文件名的简单方法的示例,以及一个简单的搜索glob,以便您可以根据自己的喜好将各个部分放在一起。如果您难以将其放入以递归方式查找具有公共日期的文件的形式,那么在命令替换中使用find提供了一种使用上面显示的相同glob进行递归搜索的简单方法。

find命令可以采用以下形式:

tar -czf "$fn" $(find "$srchpath" -type f -name *"$dt"*) 2>/dev/null

find将在"$srchpath"及以下的文件中搜索与" $ dt" glob匹配的文件。如果该范围内有任何缺失的天数,则会将"tar: Cowardly refusing to create an empty archive"错误消息重定向到位桶。

一个简短的示例脚本,将srchpath作为第一个参数(默认'.'),将"5 days ago"搜索之前的天数(默认30)作为第二个参数参数,您可以执行以下操作。

#!/bin/bash

srchpath="${1:-.}"      ## search path (default .)
daterng="${2:-30}"      ## date range (default 30)

test -d "$srchpath" || {    ## validate search path
    printf "error: path not found '%s'.\n" "$srchpath"
    exit 1
}
test "$daterng" -eq "$daterng" 2>/dev/null || { ## validate range
    printf "error: non-integer range entered '%s'.\n" "$daternd"
    exit 1
}
d=$(date -d"5 days ago" +%s)    ## get 5 days ago

for ((i = 1; i <= daterng; i++)); do    ## loop over days in range
    dt="$(date -d@$((d - i * 86400)) +%Y%m%d)"  ## get date yyyymmdd
    fn="$dt.tar.gz"     ## form filename yyyymmdd.tar.gz
    echo "tar -czf $fn \$(find $srchpath -type f -name *$dt*)" ## echo command
    ## recursively compress matching files (no spaces allowed in name)
    tar -czf "$fn" $(find "$srchpath" -type f -name *"$dt"*) 2>/dev/null
done

注意:要压缩的文件名称中不能包含空格。如果可能,请使用-print0 find选项并将输出通过xargs致电tar