zoukankan      html  css  js  c++  java
  • linux批量解压缩

    1. find . -name "stat_*_2012_05_26_log.tgz" -exec cp {} /home/adstat/apache_log/stat/ \;  

     上述命令代表在当前文件夹下查找符合正则表达式stat_*_2012_05_26_log.tgz 的文件并分别复制到/home/adstat/apache_log/stat/目录下。 

      那么批量解压文件是否这样呢:

    Java代码  收藏代码
    1. find . -name "stat_*_2012_05_26_log.tgz"|xargs tar -zxvf  

      其实是不可以的,执行结果如下:

    Java代码  收藏代码
    1. tar: ./stat_64_138_2012_05_26_log.tgz:归档中找不到  
    2. tar: ./stat_10_10_75_80_2012_05_26_log.tgz:归档中找不到  
    3. tar: ./stat_64_139_2012_05_26_log.tgz:归档中找不到  
    4. tar: ./stat_74_195_2012_05_26_log.tgz:归档中找不到  

      为什么tar不支持这种通配符语法呢?

    通配符是shell解决的问题
    tar -xvf *.tar
    实际上执行tar时,tar接收到的是
    tar -xvf a.tar b.tar c.tar ...
    如果当前目录跟本没有tar的东西,那么tar就收到'*.tar'这个参数
    与win不同,linux所有字符都可以作文件名,也即目录中不存在着 *.tar这个文件
    为了防止 *.tar被shell解释为a.tar b.tar c.tar...
    可以给它加个单引号
     
    用tar解开一个Archive时,语法是
    tar -xvf <tarfile.tar> <archived_file>
    <tarfile.tar> 是选项f所要求的,只能是一个文件,比如myfiles.tar。
    <archived_file> 是myfiles.tar所包含的归了档的文件中的一个或者多个成员文件。如果是多个,可以用通配符。
    先别跟我急,我知道,这些你是清楚的。但是,你的问题是,用了
    tar -xvf *.tar
    如楼上所说,tar接收到的是
    tar -xvf a.tar b.tar c.tar ...
    tar把你的意图理解为,在a.tar里解出b.tar c.tar .
     
    可以使用的方法如下:
    方法:
    第一:
    for tar in *.tar.gz;  do tar xvf $tar; done
    for tar in *.tar.bz2; do tar xvf $tar; done
     
    第二:用tar命令批量解压某个文件夹下所有的tar.gz文件
    ls *.tar.gz | xargs -n1 tar xzvf
     
    第三:find -maxdepth 1 -name "*.gz"|xargs -i tar xvzf {}
    这条命令可解压当前目录下的所有gz文件
    批量解压是比较郁闷的事,以前尝试各种方法,甚至用脚本循环语句解压都不行
    现在发现这条命令可以搞定,maxdepth表示搜索深度,1代表只搜索当前目录
     
    第四:for i in $(ls *.gz);do tar xvf $i;done
  • 相关阅读:
    常用的正则表达式
    Spring
    Hibernate-04
    Hibernate-03
    Hibernate-02
    Hibernate-01
    装饰器(python)
    软件工程之小组选题报告
    小组项目之需求分析与原型设计
    关于group_concat函数拼接字符超长的问题
  • 原文地址:https://www.cnblogs.com/lansor/p/2574214.html
Copyright © 2011-2022 走看看