This question already has answers here:
How to loop over files in directory and change path and add suffix to filename
(5个答案)
我有一个包含所有
以目录作为第一个参数
提取
然后运行我的加载脚本
去下一个TGZ…
如下所示。
目前这个脚本可以工作,但是如果有人输入的参数不只是目录名(例如,./myscript/whole/path/to/directory),它将失败。
显然回声只是为了演示
如果您不能控制您的环境,那么避免使用
取决于你的控制力有多小,你可能需要更多的偏执测试。
编辑以供评论,解释
首先,bash中的char
您希望在
在
计算结果为
在这种情况下,我们使用变量替换
这里是shell变量的值,
在使用前正在进行修改
将变量的名称括起来总是最安全的
在大括号中的
但是这样做也允许您注释变量调用
用修改后的值替换正常变量值
我记注释的快速而肮脏的记忆法
它们的功能是查看
(抱歉,非英语非QWERTY键盘布局)
注意
因此
正则表达式的
在
从变量值的开始。
同样,
将删除正则表达式的最后一个匹配项
从变量的值
两个注释都可以加倍
删除正则表达式的最长匹配项
而不是最短的。
所以
意思是删除最后一个点之前的所有内容
从变量中的值
完全等于字符串
关于“bash变量替换”的web搜索
和“重击测试”
会带你走得更远
(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
您希望在
[
之后和]
之前保留空格在
[
里面…]
是表达式(谓词)计算结果为
true
或false
在这种情况下,我们使用变量替换
这里是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