linux使用gzip批量压缩某个文件夹下的文件

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

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

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

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

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

我想到以下两种方式:

一、利用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)就相当于是这样的变量。

经验分享 程序员 微信小程序 职场和发展