linux文件批量查找与复制、批量解压、批量删除的命令

发布时间:2020-05-05编辑:脚本学堂
本文介绍下,在linux系统中,用于文件的批量查找与复制、批量解压、批量删除的命令,有需要的朋友参考下。

本节内容:
一些用于文件的批量查找与复制、批量解压、批量删除的linuxcmd/ target=_blank class=infotextkey>linux命令。

首先,find命令的例子:
 

复制代码 代码示例:
find  .  -type f -name "weapon.log*" | xargs -i  rm -fr "{}" ; 

find . -name "stat_*_2012_05_26_log.tgz" -exec cp {} /home/adstat/apache_log/stat/ ; 
命令说明:
①代表在当前文件夹下递归找到符合weapon.log开头的文件并删除,如果要指定其它目录,可以把.替换成绝对路径即可。
②代表在当前文件夹下查找符合正则表达式stat_*_2012_05_26_log.tgz 的文件并分别复制到/home/adstat/apache_log/stat/目录下。

批量解压文件是否可以这样:
 

复制代码 代码示例:
find . -name "stat_*_2012_05_26_log.tgz"|xargs tar -zxvf 
 

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

tar: ./stat_64_138_2012_05_26_log.tgz:归档中找不到 
tar: ./stat_10_10_75_80_2012_05_26_log.tgz:归档中找不到 
tar: ./stat_64_139_2012_05_26_log.tgz:归档中找不到 
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 {}

说明:
maxdepth表示搜索深度,1代表只搜索当前目录。

第四:

复制代码 代码示例:
for i in $(ls *.gz);do tar xvf $i;done