gzip可以将某个文件夹下的.gz文件批量解压,使用gzip -df *.gz就行。

gzip也可以将文件夹下的文件批量压缩,直接使用gzip *即可。不过压缩时会将原来的文件替换掉,且不能指定压缩后的目标目录。而gzip -c命令不会动原始文件,也可以指定压缩后的目标文件夹,但是一次只能处理一个文件。类似这样:

gzip -c a.txt >/home/target/a.txt.gz

那么,怎样将某个文件夹下的文件批量压缩到目标文件夹下,同时保留原始文件呢(有点类似将文件备份到指定文件夹下)?

使用gzip -c将文件一个一个压缩到目标文件夹下,需要时刻关注上一条命令是否执行完,工作效率会比较低。最好可以直接实现上面的效果。因为gzip -c可以将文件压缩到指定目录,现在的问题是能不能一条命令就搞定。

假设原始的文件里的内容如下:

我想到以下两种方式:

一、利用awk的域来储存文件名信息,拼命令行

ls *.txt|awk '{print "gzip -c "$0 "> /home/target/" $0".gz"|"/bin/bash"}'
或者
ls *.txt|awk '{print "gzip -c "$0 "> /home/target/" $0".gz"}'|/bin/bash

代码解释:在awk中用$0来存文件名,并将文件名拼到gzip命令中,最后用bash执行gzip命令。 

二、遍历查找到的文件名放入变量

for i in `find ./ -maxdepth 1 ! -name "*.gz" -type f`;do gzip -c $(basename $i) >/home/target/$(basename $i).gz;done
或者
for i in `ls *.txt`;do gzip -c $i >/home/target/$i.gz;done

代码解释: -maxdepth 1限制查找到的只能是文件,! -name "*.gz"过滤掉原来可能存在的gz文件。$(basename $i)只取$i里的纯文件名。

第二个是直接将i变量遍历文件名。

注意:in 后的命令需要加``,不然循环的时候该命令本身也会被放到变量里

以上两种方式的主要思路其实只有一条:就是将gzip -c命令中需要两次用到的文件名放到变量中,这样在用的时候直接使用该变量就行了。上面的$0和$(basename $i)就相当于是这样的变量。

执行完成后,所有符合条件的数据文件都被压缩到指定文件夹下,且原文件不会被删掉,大家如果有兴趣可以试下。如下:

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐