This question already has answers here:

How to loop over files in directory and change path and add suffix to filename
(5个答案)
我有一个包含所有tgz文件的目录。目前,我有一个运行的脚本
以目录作为第一个参数
提取tgz
cd进入提取的文件夹
然后运行我的加载脚本
去下一个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中的char[test
您希望在[之后和]之前保留空格
[里面…]是表达式(谓词)
计算结果为truefalse
在这种情况下,我们使用变量替换
这里是shell变量的值,
在使用前正在进行修改
将变量的名称括起来总是最安全的
在大括号中的$tgz之后…$
但是这样做也允许您注释变量调用
用修改后的值替换正常变量值
我记注释的快速而肮脏的记忆法
它们的功能是查看{键的两边
(抱歉,非英语非QWERTY键盘布局)
注意}散列或磅字符继续$
因此#将删除第一个匹配项
正则表达式的$
${name#<regexp>}之后和<regexp>之前
从变量值的开始。
同样,#}%之后的键。
将删除正则表达式的最后一个匹配项
从变量的值
两个注释都可以加倍$${name%<regexp>}表示:
删除正则表达式的最长匹配项
而不是最短的。
所以
##
意思是删除最后一个点之前的所有内容
从变量中的值%%看是否还有
完全等于字符串"${tgz##*\.}" == "tgz"
关于“bash变量替换”的web搜索
和“重击测试”
会带你走得更远

关于linux - Bash脚本提取目录中的所有.tgz ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34775232/

10-10 15:06