我正在编写一个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命令的其他组合,但是没有运气。
答案 0 :(得分:2)
tar
应该成功压缩现有文件,尽管出现“无此类文件或目录” 错误。
无论如何,您还可以结合使用nullglob
和extglob
@()
来仅获取现有文件:
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
不够完美,但可能更适合您的口味。
都不是一个很好的解决方案,但是其中一个应该会让您满意。