用于提取目录中所有 .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 的命令相同 你想在[之后和]之前保留空格

[ ... ] 内部是一个表达式(谓词) 计算结果为 truefalse

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

将变量名括起来总是最安全的 在大括号中的$ 之后 ...

不过,这样做也可以让您注释变量 call 用修改后的值替换正常的变量值

我记住注释的快速而肮脏的助记符 它们的功能是查看$键的任一侧 (对不起,非英语非 qwerty 键盘布局) 并注意 # 哈希或磅字符继续 $ 所以$name#&lt;regexp&gt;删除 第一个匹配项 正则表达式&lt;regexp&gt;# 之后和 之前 从变量值的开始

同样%$$name%&lt;regexp&gt; 之后的键 将删除正则表达式的最后一个匹配项 从变量的值

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

所以"$tgz##*\." == "tgz" 表示删除直到最后一个点(包括最后一个点)的所有内容 从变量$tgz 中的值,看看是否还有什么 正好等于字符串"tgz"

关于“bash 变量替换”的网络搜索 和“bash 测试” 会带你走的更远

【讨论】:

Don't parse the output from ls 如果我想传入整个目录怎么办?像这样的东西 ./my_script /path/to/my/directory @tomc 您能否在您的代码旁边提供一些 cmets 来解释 if 语句。

以上是关于用于提取目录中所有 .tgz 的 Bash 脚本[重复]的主要内容,如果未能解决你的问题,请参考以下文章

仅提取特定文件名然后将其用于变量的 Bash 脚本

sh 用于git的bash命令重置所有目录并提取最新提交

用于测试给定用户是不是可以读取目录和其中所有文件的 Bash 脚本?

使用 bash 命令 awk sed 等从脚本中提取参数字段

Linux Bash - 修改从标准输出中提取的文本

用于监视新文件目录的 bash 脚本