正常情况下,我们使用ls a* 可以显示本目录下所有以a开头的文件,但是如果文件多了,就没那么简单了。比如:
% ls *
/sbin/ls: Argument list too long.
其实遇到最多的时候是删除,通常一个rm –rf * 可以解决本目录下所有的文件,但是如果文件数量特别多,特别是上万个,那么你也会遇到“Argument list too long.”,或者中文的“参数列表过长”。
网上的解决办法很乱,有的甚至是误导,其实归根结底就三招:
1、到上一层目录解决(这招网上很少见^_^)。
2、用find神器
3、用xargs
环境:
/web/upload下有6万多个文件
/web/upload % ll | wc
60552 544961 4824590
1、上级目录大法:
本级目录不行,那就跑到上一级目录
/web/upload % ls *
/sbin/ls: Argument list too long.
/web/upload %cd /web
/web/upload %ls /web/*
/web/upload:
eclass_0043_20140508095200.xml
eclass_0094_20140504081735.xml
eclass_0043_20140508095925.xml
……
顺便说一句,tar也会遇到这个问题,如果需要向tar包中添加的第一级目录文件数过多,那么也会遇到“参数列表过长”的错误,其实最简单的解决方法就是把上一级目录添加到压缩包里面,所有的子目录中的文件,都会乘乘地束手就擒了——有点擒贼先擒王的味道,或者是遇到问题找领导!
2、find神器法
find其实是一个神器,不仅能查找文件,而且有个-exec参数,可以把查到的文件进行操作:
find ./ -name “*” –exec ls –l {} \;
解释一下:
-exec参数:可以在找到文件后,运行指定的命令,本例就是ls;命令还可以带自己的参数,本例���带了一个-l,表示显示详细信息;{}是一个占位符,代表查找到的文件;本命令本来用分号(;)结束,但是由于分号在大多数shell下都是保留字,所以需要用反斜杠做一下转义。
3、xarg法:
其实这跟find用法差不多,xarg把用管道送过来的数据当命令的参数,还是这个例子,改为xarg为:
find ./ -name “*” | xargs ls –l
xargs还有其它一些高级的应用,比如数量多的时候,可以再用-n进行分隔。
该贴由hui.chen转至本版2014-11-5 17:04:59