6

I have an array with files and directories that I wish to add to the compressed tar (tar.gz). Originally I was planning to loop through the array and add each item to the tar, something like that:

tar czf my_app.tar.gz

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

Running the script I have found that I cannot add files to the compressed tar. I was wondering whether there is any other way of creating a tar from my list of location in the array.

Any help would be greatly appreciated!

4

2 回答 2

8

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

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
  • 索拉里斯tar cvf empty.tar -I /dev/null

有关此的更多详细信息解释了他链接到的页面

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

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

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

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

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

于 2013-05-27T08:57:15.053 回答
3

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

for (( i = 0;  i < ${#app_items[@]}; i++))
do
  echo ${app_items[$i]} >> items$$
done
tar cfz my_app.tar.gz -T items$$
rm items$$
于 2013-05-27T18:18:47.730 回答