2016-01-13 67 views
0

我有一个包含所有tgz文件的目录。目前,我有我运行会已更新:Bash脚本提取目录中的所有.tgz

  1. 您可以在目录中第一个参数的脚本
  2. 提取tgz
  3. cd到提取的文件夹
  4. ,然后运行我的负载脚本
  5. 并继续下一个tgz ..

如下所示。

目前这个脚本的工作,但如果有人不仅仅是目录名称(例如,./myScript /全/路径/到/目录)

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 
+0

'for fname in $ {FNAME%/ *}/* TGZ。 do'将循环到第一个给定文件的目录中的所有'* .tgz'。 – Kellerspeicher

回答

1

的东西看起来放在一个参数以外它会失败这样可以工作

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

明显的回声只是为了演示

注释避免使用ls是公平的,如果你是不是在CONTRO你的环境。将你感兴趣的文件的过滤器进一步推送到一个不太具体的集合的循环中。

取决于你有多少控制,你可能需要更多的偏执测试。

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

在这种情况下,我们使用变量替换
其中一个shell变量的值,$tgz这里,
被之前修改使用

它始终是最安全的附上的名字变量 后面的$花括号{ ...}

但是这样做也可以让你注释变量调用
用修改后的值来代替正常的变量值

我的快速和肮脏的助记符记住注释
和它们的功能是看所述$
(对不起非英语非QWERTY键盘布局)的任一侧
并注意#散列或磅字符前进$
这样${name#<regexp>}删除第一场比赛
正则表达式<regexp>
的 的#后和}
开始变量值的之前。

同样的%是后$${name%<regexp>}
删除键从可变

两个注释的值正则表达式
最后匹配可成倍##%%到意思是:
删除最长正则表达式的匹配
而不是最短的。

所以
"${tgz##*\.}" == "tgz"
手段删除变量$tgz直至并包括从值中最后一个点
一切,看看剩下
正好等于该字符串"tgz"

网络搜索上“bash变量替换”
和“bash测试” 将带你进一步

+0

[不要解析'ls'的输出](http://mywiki.wooledge.org/ParsingLs) –

+0

如果我想传入整个目录呢?像这样的./my_script/path/to/my /目录 – kkmoslehpour

+0

@tomc可以请你在代码旁边的一些注释来解释if语句。 – kkmoslehpour

相关问题