我如何 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]=1
在 dateLst
.
中创建唯一的 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 的键,所以这会循环不同的日期并且 echo
是 tar
命令来创建每个 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
上的任何前缀或后缀匹配项。
我正在使用 Git bash 并想使用 git Bash.[=13= 中的“tar”功能来存档我的文件]
我的想法是用 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]=1
在 dateLst
.
中创建唯一的 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 的键,所以这会循环不同的日期并且 echo
是 tar
命令来创建每个 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
上的任何前缀或后缀匹配项。