我有大量带有日期的csv文件 我想将每天的文件tar到单独的tar.gz文件中。但是,当我这样做。单日输出卡住或单日创建tar文件。
答案 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
)