【问题标题】:Bash script to extract all .tgz in directory [duplicate]用于提取目录中所有 .tgz 的 Bash 脚本[重复]
【发布时间】:2016-04-18 22:21:31
【问题描述】:

我有一个包含所有 tgz 文件的目录。目前,我有一个可以运行的脚本

  1. 将目录作为第一个参数
  2. 提取tgz
  3. cd 进入解压文件夹
  4. 然后运行我的加载脚本
  5. 然后继续下一个 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 循环。

标签: linux bash extract


【解决方案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 测试” 会带你走的更远

【讨论】:

  • 如果我想传入整个目录怎么办?像这样的东西 ./my_script /path/to/my/directory
  • @tomc 您能否在您的代码旁边提供一些 cmets 来解释 if 语句。
猜你喜欢
  • 1970-01-01
  • 2018-10-29
  • 2012-11-25
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多