shell 如何压缩一个变量中有多个文件后缀的文件?[duplicate]

krcsximq  于 2023-01-17  发布在  Shell
关注(0)|答案(1)|浏览(118)
    • 此问题在此处已有答案**:

Difference between sh and Bash(11个答案)
Brace expansion from a variable in Bash(2个答案)
5天前关闭。
这篇文章是编辑和提交审查昨天.

#!/bin/sh
BackupPath="/root/upfOps/te"
if [ ! -d "$BackupPath" ]; then
    mkdir -p "$BackupPath"
fi

MYSC_JSON_YAML_DB="home/mysc/cmin02sms/etc/{*.json,*.yaml,*.db}"
tar vczf /root/upfOps/te/t1.tar.gz $MYSC_JSON_YAML_DB

echo $MYSC_JSON_YAML_DB
tar vczf /root/upfOps/te/t2.tar.gz /home/mysc/cmin02sms/etc/{*.json,*.yaml,*.db}

输出:

[root@upf-100.novalocal upfOps]# ./test
tar: home/mysc/cmin02sms/etc/{*.json,*.yaml,*.db}:无法 stat: 没有那个文件或目录
tar: 由于前次错误,将以上次的错误状态退出
home/mysc/cmin02sms/etc/{*.json,*.yaml,*.db}
tar: 从成员名中删除开头的“/”
/home/mysc/cmin02sms/etc/conf.ismpbus.json
/home/mysc/cmin02sms/etc/conf.simu.json
/home/mysc/cmin02sms/etc/conf.slrun.json
/home/mysc/cmin02sms/etc/conf.smp.json
/home/mysc/cmin02sms/etc/chassis.yaml
/home/mysc/cmin02sms/etc/lager.yaml
/home/mysc/cmin02sms/etc/microservice.yaml
/home/mysc/cmin02sms/etc/conf.crontab.db
[root@upf-100.novalocal upfOps]#

第一个tar命令导致"cannot stat:没有这样的文件或目录""。2但是第二个tar可以成功地压缩这些文件。
如何压缩一个变量中有多个文件后缀的文件?有没有人能给出一个只使用sh或bash脚本的任何方式的解决方案?
我只想使用一个变量,例如

tempPath=home/mysc/cmin02sms/etc/{*.json,*.yaml,*.db}
tar cvzf /root/etcFiles.tar.gz $tempPath

写tempPath变量的正确方法是什么?

hgqdbh6s

hgqdbh6s1#

您的选项仅限于#!/bin/sh,如果您可以将其更改为bash(推荐使用#!/usr/bin/env bash),则可以通过extglob shell选项使用扩展的文件匹配模式:

shopt -s extglob
tar vczf /root/upfOps/te/t1.tar.gz home/mysc/cmin02sms/etc/@(*.json|*.yaml|*.db)

我没有使用中间变量,如果你愿意,你可以使用一个,但是在一个变量中存储多个值是不好的做法;它实际上应该是一个数组(与extglob一样,它不是POSIX特性,因此需要bash)。

prefix=home/msyc/cmin02sms/etc
files=("$prefix"/@(*.json|*.yaml|*.db_))

然后在tar中使用数组,如下所示:

tar vczf /root/upfOps/te/t1.tar.gz "${files[@]}"

注意我没有使用全大写的变量名;全大写应该保留给特殊的变量,通常是那些为了从设置它们的shell启动的外部程序而导出到环境中的变量。

相关问题