如果存在文件列表,请将它们打包成tar文件。

3

我有一个文件列表,其中可能存在需要压缩并打包的文件,这是更大脚本的一部分。目前我的代码如下:

tar -czvf config.tar.gz file1.xml file2.xml file3.xml

问题是并不是所有的文件都可能存在,如果它们不存在就会出现错误。检查和打包这些文件的最佳方法是什么?

2个回答

4

试用这个bash脚本:

#!/bin/bash
files=("$@")
for i in "${!files[@]}"
do
    [ -e "${files[i]}" ] || unset files[i]
done
tar -czvf config.tar.gz "${files[@]}"

如何使用:

script  file1.xml file2.xml file3.xml

这样,tar.gz文件可以一步完成创建过程,无需将中间文件存储在磁盘上。

替代方法:使用shell函数

为了使该功能在命令提示符下可用,而不需要脚本文件,请使用以下命令创建一个shell函数:

tar2() { files=("$@"); for i in "${!files[@]}"; do [ -e "${files[i]}" ] || unset files[i]; done; tar -czvf config.tar.gz "${files[@]}"; }

运行此程序的方法如下:
tar2 abc file1.xml file2.xml file3.xml

为了使这个函数定义永久存在,将它添加到你的~/.bashrc文件中。

替代方案:硬编码文件名

files=(file1.xml file2.xml file3.xml)
for i in "${!files[@]}"
do
    [ -e "${files[i]}" ] || unset files[i]
done
tar -czvf config.tar.gz "${files[@]}"

无法将文件作为命令行参数输入。这是什么意思?你在使用tar时将文件作为命令行参数,为什么不用于脚本呢? - undefined
@Rpds7 如果你更喜欢使用shell函数,我刚刚添加了一个与脚本功能相同的函数。 - undefined

1
你可以使用for循环遍历要添加到归档文件中的文件列表,并检查它们是否存在。请注意,在未压缩的归档文件中,您需要使用“r”(替换)或“u”(更新)模式。
for f in file1.xml file2.xml file3.xml; do
   [[ -f $f ]] && tar rvf config.tar "$f"
done

# compress the tar file
gzip config.tar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接