Bash 脚本用于提取目录中的所有 .tgz



我有一个包含所有tgz文件的目录。目前,我有一个正在运行的脚本,它将

  1. 将目录作为第一个参数
  2. 提取tgz
  3. cd到解压缩的文件夹中
  4. 然后运行我的加载脚本
  5. 然后继续下一个TGZ。

所 示。

目前这个脚本可以工作,但如果有人输入目录名称以外的参数(例如,./myScript/whole/path/to/directory),它将失败

dirname=$1
cur_dir=`pwd`
echo The directory you are about to extract is $dirname
echo $(ls ${cur_dir}/${dirname}/*.tgz)
echo Your current directory is ${cur_dir}
for tgz in $(ls ${cur_dir}/${dirname}/*.tgz) ; do  # <---- I think there is a better way of doing this please advise
        echo the tgz you are about to extract now is ${tgz}
        cd ${dirname};             #cd into input directory 
        tar -xvzf ${tgz};          #extract tgz
        cd ${tgz%%.tgz};           #cd into the folder you extracted 
        loadItExit;                #run my other script to load
        cd ../..;                  #move up two levels back to original path
done

看起来像这样的东西可以工作

dirname="$1"
for tgz in $(ls ${dirname}/*.tgz) ; do 
    echo "tar -xzf ${tgz}";  
    echo "cd  ${tgz%%.tgz}"; 
    echo "LoadIt"; 
    echo "cd .."; 
done

显然回声只是为了演示

如果您无法控制环境,避免使用 ls 的注释是公平的。将感兴趣的文件的筛选器进一步推送到不太具体的集合上的循环中。

根据你的控制程度,你可能需要更多的偏执测试。

dirname="$1"
for tgz in ${dirname}/* ; do
   if [ "${tgz##*.}" == "tgz" ] then
        echo "tar -xzf ${tgz}";  
        echo "cd  ${tgz%%.tgz}"; 
        echo "LoadIt"; 
        echo "cd .."; 
   fi
done

编辑评论以解释if声明

首先,bash 中的字符[test 命令相同您想在[之后和之前保留空格]

[里面... ]是表达式(谓词)评估结果为 truefalse

在本例中,我们使用变量替换
其中外壳变量的值$tgz此处,
在使用前正在修改

将变量名称括起来始终是最安全的在戴着牙套${... }

但是,这样做也允许您注释变量调用
将普通变量值替换为修改后的值

我快速而肮脏的记忆记符,用于记住注释
它们的功能是看向$
的任一侧(对不起,非英语非QWERTY键盘布局)
并注意哈希或井号字符#继续$
所以${name#<regexp>}删除第一个匹配项
的正则表达式<regexp>
#之后和}
之前从变量值的开头开始。

同样,%$${name%<regexp>}
之后的关键将删除正则表达式
的最后一个匹配项从变量的值

两个注释都可以加倍##%%表示:
删除正则表达式
的最长匹配项而不是最短的。

所以

"${tgz##*.}" == "tgz"意味着删除所有内容,包括最后一个点
从变量中的值$tgz,看看是否剩下
什么正好等于字符串"tgz"

关于"bash变量替换"
的网络搜索和"猛击测试"将带您走得更远

相关内容

  • 没有找到相关文章

最新更新