当某些文件可能丢失时,tar压缩文件

时间:2018-08-14 20:33:21

标签: bash ubuntu tar

我正在编写一个bash脚本,该脚本将文件从另一台服务器拉到当前目录。问题是我收到了很多文件,我只需要其中的3个文件。但是所有三个可能都不在那里。

例如,将服务器全部设为:

server call --> file1.txt file2.txt file3.xls file4.json .... (etc)

然后使用tar压缩文件:

tar zcf needed_files.tgz file4.json file23.doc *.txt

但是file4.json不存在,所以我希望tar压缩file23.doc和所有.txt文件,但脚本会失败:

tar: file4.json: Cannot stat: No such file or directory

我尝试了czvf之类的tar命令的其他组合,但是没有运气。

2 个答案:

答案 0 :(得分:2)

tar应该成功压缩现有文件,尽管出现“无此类文件或目录” 错误。

无论如何,您还可以结合使用nullglobextglob @()来仅获取现有文件:

shopt -s extglob nullglob
files=( "fileA"@() "fileB"@() *.txt )

(( ${#files[@]} )) && tar zcf needed_files.tgz -- "${files[@]}" 

答案 1 :(得分:1)

尝试扩展全局。

shopt -s extglob # set extended globbing on
if echo file[1234].+(txt|xls|json) | grep -vq '\['
then tar cvzf needed_files.tgz file[1234].+(txt|xls|json)
else echo No matching files for extglob 'file[1234].+(txt|xls|json)'
fi

如果存在匹配的文件,它将列出它们。

如果没有,它将从字面上回显该模式。

找出模式元字符可以告诉您集合中是否有文件。如果确实存在,则使用相同的glob将文件提供给tar,它将完全接收匹配的文件集。如果没有,条件测试可让您跳过它。

当然,如果您使用名称中的[等来创建文件,则会中断...

或者,您可以循环执行。...

for f in file[1234].+(txt|xls|json)
do if [[ -e "$f" ]]
   then [[ -e needed_files.tar ]] && c=r || c=c
        tar ${c}vf needed_files.tar "$f"
   fi
done

不够完美,但可能更适合您的口味。

都不是一个很好的解决方案,但是其中一个应该会让您满意。