【问题标题】:Bash - creating tar for array itemsBash - 为数组项创建 tar
【发布时间】:2013-05-22 01:32:08
【问题描述】:

我有一个包含我希望添加到压缩 tar (tar.gz) 中的文件和目录的数组。最初我打算循环遍历数组并将每个项目添加到 tar,如下所示:

tar czf my_app.tar.gz

for app_item in "${app_items[@]}"
do
    tar rzf my_app.tar.gz $app_item
done

运行脚本我发现我无法将文件添加到压缩的 tar。我想知道是否有任何其他方法可以从我在数组中的位置列表创建 tar。

任何帮助将不胜感激!

【问题讨论】:

  • 循环将app_item 添加到变量并最终执行tar $that_variable 怎么样?
  • 你遇到了什么错误?
  • 感谢@fedorqui,您的解决方法可以解决问题!
  • fedorqui的解决方案在文件名有空格时会出现问题。

标签: bash shell gzip tar


【解决方案1】:

这个问题只存在于压缩档案中。我建议先创建和使用未压缩的存档,然后在循环运行后对其进行压缩。

tar cf my_app.tar --files-from /dev/null
for app_item in "${app_items[@]}"
do
    tar rf my_app.tar "$app_item"
done
gzip my_app.tar

正如@Matthias 在评论中指出的那样,tar 通常会拒绝创建一个空存档(我们在第一行中想要的)。为了强制它这样做,我们需要一个因操作系统而异的技巧:

  • BSDtar cf empty.tar --from-file /dev/null
  • GNU (Linux)tar cvf empty.tar --files-from /dev/null
  • Solaristar cvf empty.tar -I /dev/null

更多细节解释the page he linked to

一种完全不同的方法,它似乎也适用于其中包含空格的文件名(但不适用于其中包含换行符的文件名,因此它不是很一般):

tar cfz my_app.tgz --files-from <(printf "%s\n" "${app_items[@]}")

还有另一种方法(也适用于文件名中的换行符和其他内容):

eval tar cfz my_app.tgz $(printf "%q " "${app_items[@]}")

但是像往常一样使用eval,你应该知道你传递给它的东西,并且这些都不是来自不受信任的来源,否则它可能会造成安全问题,所以一般我建议避免它。

【讨论】:

  • 或者更确切地说是单个tar rf my_app.tar "${app_items[@]}",除非数组很大。
  • 当然。我认为迭代的整个想法源于某种方式无法使用您提供的单线。 (但也许 OP 只是没有想到这一点。)
  • tar: Cowardly refusing to create an empty archive - 通过将第一行更改为tar cf my_app.tar --files-from /dev/null(来自here)解决
  • 哇!是的,你是对的!不知道那是怎么滑倒我的。我采纳了你的意见。
【解决方案2】:

使用数组中的名称创建一个文件,然后使用 tar(BSD 或 GNU)的 -T 选项读取该文件。这将适用于任意数量的文件,适用于名称中带有空格的文件,并将在归档时压缩以最小化所需的磁​​盘空间。例如:

for (( i = 0;  i < ${#app_items[@]}; i++))
do
  echo ${app_items[$i]} >> items$$
done
tar cfz my_app.tar.gz -T items$$
rm items$$

【讨论】:

    猜你喜欢
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2022-07-27
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多