管理过多的文件
用户的某个目录下有非常多的文件,当用户使用ls列示所有文件或使用mv * 命令想把所有文件移至另一目录时,系统报错,相应操作无法进行。错误信息为:”Arguments too long”或”Array list too long”。
该错误的产生是由于/usr/include/sys/limits.h文件中ARG_MAX参数对应值的限制,最大值为24576,并且无法改变此限制。因此当某目录下的文件数超过24576时,可以使用下面的命令列示、删除或移动所有的文件:
1. 列示文件:
#find
2. 删除文件,如:
#find ./ -name “*.log” -mtime +1|xargs [-n1] rm
or(注意,xargs后面是大写的i)
# find ./ -name “*.log” -mtime +1|xargs -I{} rm {}
or移动所有文件至目标目录:
#find -name “*” | xargs -I{} mv {} destinationdir
批量更新文件
有的时候,我们需要批量的更新所有的文件,但是shell中一个语句一般实现不了这样的要求,我们可以采用perl帮忙,如更新所有文件内容
perl -e ’s#\/u01\/data_archvie#\/u02\/logs\/admin#i’ -pi.bak `(find . -type f )`
这里-e的部分表示更新,#是分界符,-pi表示产生对应的备份文件
其中,find是可以根据自己的需要扩展的。
补充测试
就第一个问题,很多平台上都有这样的情况的,如linux,其他unix等,不过linux可以很方便的修改之后重新编译内核。我在5.3上做了一个测试,看样子有些东西与以前有差别了,现在ls是不会报这样的错误,起码在10万个文件的时候还没有报,同样,find -exec的方法也是可以的了。
- i=1
- while (($i<=100000))
- do
- touch test$i.log
- i=$(($i + 1))
- done
#ls -l|wc
100000 940953 7555769
rm是报错的,而且,这个错误从#define ARG_MAX 24576这个定义的值就开始报了,如果修改这个值,肯定是要重新编译内核的了。
#rm *.log
ksh: /usr/bin/rm: 0403-027 The parameter list is too long.
mv同样是报错的
#mv *.log tmp/
ksh: /usr/bin/mv: 0403-027 The parameter list is too long.
现在,find -exec方法也是可以的,除了rm可以使用这个方法,mv也可以使用-exec的方法
#find . -name “*.log” -exec rm {} \;
删除成功


