Bash-为数组项创建tar

Bash-为数组项创建tar,bash,shell,gzip,tar,Bash,Shell,Gzip,Tar,我有一个包含我希望添加到压缩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(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--来自文件/dev/null
  • GNU(Linux):
    tar cvf empty.tar——来自/dev/null的文件
  • Solaris:
    tar cvf empty.tar-I/dev/null
更多的细节解释了这一点

一种完全不同的方法,它似乎也能很好地处理带有空格的文件名(但不适用于带有换行符的文件名,因此它不太通用):


但是像往常一样,对于
eval
你应该知道你传递给它的是什么,并且这些都不是来自不可信的来源,否则它可能会带来安全问题,所以一般来说我建议避免它。

用数组中的名称创建一个文件,然后使用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$$
((i=0;i<${app#u items[@]};i++)的

做
echo${app_items[$i]}>>项目$$
完成
tar cfz my_app.tar.gz-T项目$$
rm项目$$

app_项添加到变量中,然后最后执行
tar$that_变量
,这样做怎么样?您会得到什么错误?谢谢@fedorqui,您的解决方法就成功了!当文件名中有空格时,fedorqui的解决方案将出现问题。或者更确切地说,只有一个
tar rf my_app.tar“${app_items[@]}”
,除非数组是巨大的。当然。我认为迭代的整个想法是由于不知何故无法使用您给出的一行代码。(但可能是OP没有想到这一点。)
tar:懦弱地拒绝创建空存档
——通过将第一行更改为
tar cf my_app.tar——文件来自/dev/null
(来自)哇!是的,你是对的!不知道我是怎么滑倒的。我采纳了你的意见。
eval tar cfz my_app.tgz $(printf "%q " "${app_items[@]}")
for (( i = 0;  i < ${#app_items[@]}; i++))
do
  echo ${app_items[$i]} >> items$$
done
tar cfz my_app.tar.gz -T items$$
rm items$$