如何使用find和xargs完成高效的操作

最近从网上下了一批PSD资源文件。文件大多以ZIP格式保存。这要是按照原先的操作方式,我肯定一个一个的打开然后解压(用的是windows平台,能累死人)。后来在windows上搭建了cgwin环境,所以就想到用Linux的方式来完成操作,方便快捷。

至于cgwin的概念还有环境的搭建,这里就不介绍了,去官网下载安装,有问题就去Google吧。

进入终端,来到相应的目录,最开始我想到的方式是

1
ls -l *.zip | xargs unzip

发现不行,因为xargs命令是一次性将所有的结果全部传给了unzip。这样unzip是无法正常解压的。要限制每次传给unzip的参数数量。这里使用xargs的参数-n。其用法类似于下面:

1
2
3
4
5
6
7
8
echo '1,2,3,4' |xargs -n1
1
2
3
4
echo '1,2,3,4'|xargs -n2
1 2
3 4

其实就是明确每次传给后面命令参数的数量。
那么命令改写成:

1
ls -l *.zip | xargs -n1 unzip

这里又出现了一个问题,xargs是以空格识别分辨每个结果的,如果文件名当中有空格,那么会出错。这里解决方法是放弃ls命令,使用find.
find命令中,有个参数-print0,用man find查看命令手册可以看到下面这句话

-print0
True; print the full file name on the standard ofollowed by a null character (instead of the newline character that -print uses). This allows file names that contain neor other types of white space to be correctly inter-preted by programs that process the find output. This corresponds to the -0 option of xargs.

也就是说使用-print0并配合xargs的-0参数,可以有效的处理文件名中含有空格的情况,那么改善后的命令就是

1
find . -name '*.zip' -print0 |xargs -n1 -0 unzip

至此便可以高效并正确的批量处理zip文件了。

  1. 其实在windows上运行cgwin速度还不是很理想。听说最近windows10已经开始支持bash了。不知道目前稳定性如何,等再过段时间可以试试。

  2. 其实使用find命令配合xargs可以做的事情是在是太多了。但是有些深层册的东西还是很有意思的,可以看看我的这篇文章对find,xargs,grep和管道的一些深入理解