gpt4 book ai didi

Bash - 为数组项创建 tar

转载 作者:行者123 更新时间:2023-11-29 09:10:22 27 4
gpt4 key购买 nike

我有一个数组,其中包含我希望添加到压缩的 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。

如有任何帮助,我们将不胜感激!

最佳答案

问题只存在于压缩文件中。我建议先创建和使用未压缩的存档,然后在循环运行完毕后压缩它。

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 通常会拒绝创建一个空存档(我们在第一行中想要的)。为了强制它这样做,我们需要一个因操作系统而异的技巧:

  • BSD:tar cf empty.tar --from-file/dev/null
  • GNU (Linux):tar cvf empty.tar --files-from/dev/null
  • Solaris:tar 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 你应该知道你传递给它的是什么并且这些都不是来自不受信任的来源,否则它可能会带来安全问题,所以一般来说我建议避免它.

关于Bash - 为数组项创建 tar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16769004/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com