我如何 tar 文件并将它们放入 gitbash 的列表中

How do I tar files and put them in a list with gitbash

我正在使用 Git bash 并想使用 git Bash.[=13= 中的“tar”功能来存档我的文件]

如您所见,这些文件的名称中包含日期,我想 tar 所有日期都在单独的 tar 文件中。 在这种情况下,结果将是我有 2 个 tar 文件和 2 个不同的日期。

我的想法是用 find iname "jo* | \d\d\d\d\d\d | sort | tar -czvf testarchive.zip ~/test/targetfolder 在这些文件中“找到” 6 个 digit,然后 tar 它们。但是,我必须将第一个找到的日期放入列表中,tar 它们直到日期更改,然后将第二个日期文件放入列表中,依此类推...

由于我没有使用 bash 和编写脚本的经验,所以我不知道如何解决这个问题。我很乐意提供帮助。我还没能在互联网上找到解决方案..

P.S。我不确定 git bash 是 Linux/Unix 还是一种不同的脚本语言,或者它是否只是 Git bash,如果我没有全部满足,抱歉要求。

乍一看,我会构建一个唯一日期的关联数组,然后 tar 每个匹配的集合。

$: echo jo* # I made some similar local files
jo02042018ab jo02042018cd jo10112018ab jo10112018cd jo10112018ef

文件名不准确,但足够接近说明问题。

$: declare -A dateLst # create an *associative* array, keys are dates

关联数组使用字符串作为索引(即使它们是数字)。

$: for f in jo[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]?? # for each file
>  do dateLst["${f//[^0-9]/}"]=1                         # assert date as a key
>  done

dateLst[somekey]=1dateLst.
中创建唯一的 somekey ${f//[^0-9]/} 从文件名中删除所有 non-numerals,只留下日期。 (即使它们实际上具有 .txt 文件扩展名,这也可能会正常工作,尽管您需要在 for 语句中编辑 glob。)
因此,dateLst["${f//[^0-9]/}"]=1 将文件中的日期设置为查找 table 中的键。如果它已经存在,它只是重新设置它。

我们现在有 table 个可用于创建压缩包的唯一日期。

$: for t in "${!dateLst[@]}"; do echo tar -cvzf $t.tgz jo$t*; done
tar -cvzf 10112018.tgz jo10112018ab jo10112018cd jo10112018ef
tar -cvzf 02042018.tgz jo02042018ab jo02042018cd

${!dateLst[@]} 是来自 table 的键,所以这会循环不同的日期并且 echotar 命令来创建每个 tarball。 jo$t* 列出要包含在该存档中的所有匹配文件。删除 echo 以执行命令。

也许您正在寻找这样的东西?

for pat in jo[0-9][0-9][0-9][0-9][0-9][0-9]*; do
    tail=${pat#jo[0-9][0-9][0-9][0-9][0-9][0-9]}
    head=${pat%"$tail"}
    date=${head#jo}
    # If this tarball exists, skip
    if [ -e "$date.tar.gz" ]; then
        continue
    fi
    # Else, tar this date
    tar czvf "$date.tar.gz" "jo$date"*
done

不清楚您希望 ~/test/targetfolder 用于何处或如何使用。如果那是文件所在的位置,那么可能只是 cd 在 运行 之前。如果那是您想要创建 tar 文件的位置,请将其放在上面任何地方的 "$date.tar.gz" 之前。

参数扩展 ${variable#pattern}${variable%pattern} 产生 $variable 的值,分别删除了 pattern 上的任何前缀或后缀匹配项。