报错“Argument list too long”的解决办法
Tags: Argument list too longLinuxOS故障处理
Linux下使用cp
,mv
,rm
等命令时经常会碰到“Argument list too long”错误,这主要是因为这些命令的参数太长,即文件个数过多。
“Argument list too long”这个问题的解决主要会用到两个命令,find
和xargs
。
rm命令
在linux中删除大量文件时,直接用rm会出现:“-bash: /bin/rm: Argument list too long” 的错误。
1 2 | [oracle@bmsdbs adump]$ rm -rf orcl_ora_1* -bash: /bin/rm: Argument list too long |
这时可以用find命令来结合使用。
例:
1、rm -rf *
改为:
1 | find . -name "*" | xargs rm -rf '*' |
2、rm test* -rf
改为:
1 | find . -name "test*" | xargs rm -rf "test*" |
示例
问题:要删除test
文件夹下以jpg
结尾的文件。
- 命令1为:
1 | find ./test/ -name "*.jpg" | xargs -i rm {} |
- 命令2为:
1 | find ./test/ -name "*.jpg" -exec rm {} \; |
mv命令
mv时报参数列表过长,
1 | for i in *.m; do mv $i ${i%.m};done |
直接说解决方法吧:
1 | ls dir1 | xargs -t -I {} mv {} dir2/{} |
大括号是可以用任意字符串替换的,比如:
1 | ls dir1 | xargs -t -I asdf mv asdf dir2/asdf |
效果和大括号那一版是完全一样的,就是看起来有点儿不严肃。
cp命令
问题:要拷贝test
文件夹下以jpg
结尾的文件到train
目录。
- 命令1为:
1 | find ./test/ -name "*.jpg" | xargs -i cp {} train |
- 命令2为:
1 | find ./test/ -name "*.jpg" -exec cp {} train \; |
命令解析
find test/ -name "*.jpg"
是指在test
文件夹下查找名为*.jpg
的文件。
xargs
命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具。-i
会将xargs
的内容赋值给{}
。
-exec
参数后面是指执行其后面的命令,-exec
以;
为结尾,由于各个系统中分号的意义不同,因此用\
进行转义,即\;
,{}
会被find
命令的结果替换。