用于提取目录中所有 .tgz 的 Bash 脚本[重复]
Posted
技术标签:
【中文标题】用于提取目录中所有 .tgz 的 Bash 脚本[重复]【英文标题】:Bash script to extract all .tgz in directory [duplicate] 【发布时间】:2016-04-18 22:21:31 【问题描述】:我有一个包含所有 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
【问题讨论】:
for fname in $fname%/*/*.tgz; do
将沿第一个给定文件目录中的所有*.tgz
循环。
【参考方案1】:
看起来像这样的东西可以工作
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
的命令相同
你想在[
之后和]
之前保留空格
[
... ]
内部是一个表达式(谓词)
计算结果为 true
或 false
在这种情况下,我们使用变量替换
其中 shell 变量的值,$tgz
这里,
使用前正在修改中
将变量名括起来总是最安全的
在大括号中的$
之后 ...
不过,这样做也可以让您注释变量 call 用修改后的值替换正常的变量值
我记住注释的快速而肮脏的助记符
它们的功能是查看$
键的任一侧
(对不起,非英语非 qwerty 键盘布局)
并注意 #
哈希或磅字符继续 $
所以$name#<regexp>
将删除 第一个匹配项
正则表达式<regexp>
在#
之后和 之前
从变量值的开始。
同样%
是$
和$name%<regexp>
之后的键
将删除正则表达式的最后一个匹配项
从变量的值
两个注解都可以加倍##
或%%
表示:
删除正则表达式的最长匹配
而不是最短的。
所以"$tgz##*\." == "tgz"
表示删除直到最后一个点(包括最后一个点)的所有内容
从变量$tgz
中的值,看看是否还有什么
正好等于字符串"tgz"
关于“bash 变量替换”的网络搜索 和“bash 测试” 会带你走的更远
【讨论】:
Don't parse the output fromls
如果我想传入整个目录怎么办?像这样的东西 ./my_script /path/to/my/directory
@tomc 您能否在您的代码旁边提供一些 cmets 来解释 if 语句。以上是关于用于提取目录中所有 .tgz 的 Bash 脚本[重复]的主要内容,如果未能解决你的问题,请参考以下文章
用于测试给定用户是不是可以读取目录和其中所有文件的 Bash 脚本?