四种解决”bash: /bin/mv: Argument list too long”参数列表过长的办法
linux用户/系统管理员, 有些时候 遇到以下错误提示:
[user@localhost linux]$ mv * ../foo2
bash: /bin/mv: Argument list too long
方法1 : 将文件群手动划分为比较小的组合
[user@localhost foo]$ mv [a-l]* ../foo2
[user@localhost foo]$ mv [m-z]* ../foo2
方法2
1、在一个目录下删除大批量的文件时,当使用 rm -rf 或者rm *会提示参数列表过长
通过修改命令为 :find . -name \"*\" | xargs rm -rf '*',成功删除
2、需要把一个目录下的所有文件mv到另外一个目录,如果当前目录文件特别多,简单使用mv 源目录 目的目录会提示参数列表过长
通过修改命令为 :ls | xargs -t -I {} mv {} ../matchres/ 可以把当前目录下的所有文件移到 \"../matchres\"下
第 1 页 共 5 页
3、另外cp 命令也会存在这种情况,解决办法跟 mv的一样
实际操作整理:
1、把 hbtmp 目录下文件 mv到 201301目录下
find hbtmp -type f -name '201301*sms.txt' |xargs -t -I {} mv {} 201301/
2、合并201301目录文件到 hbtmp/bill201301.txt
cd 201301/
ls | xargs -t -I {} cat {} >> ../hbtmp/bill201301.txt
find hbtmp -type f -name '201301*sms.txt' -exec mv {} 201301/.\\; 提示exec缺少参数
[user@localhost foo]$ find $test2 -type f -name '*' -exec mv {} $test1/. \\;
[user@localhost foo]$ find $test2 -type f -name '*' -exec mv {} $test1/. \\
方法3创建shell函数
e.g 3.1:
function huge_mv ()
第 2 页 共 5 页
•{whileread line1; do
•mv foo/$line1 ../foo2
•done
•}
•ls -1 foo/ | huge_mv
写一个shell函数并不涉及到某种程度的复杂性,
这种方法比方法1和方法2相比更加灵活。
下面我们来扩展一下例3.1 :
e.g 3.2:
function huge_mv ()
•{whileread line1; do
•md5sum foo/$line1 >> ~/md5sums
•ls -l foo/$line1 >> ~/backup_list
第 3 页 共 5 页
•mv foo/$line1 ../foo2
•done
•}
•ls -1 foo/ | huge_mv
相比例3.1,例3.2生成了文件的md校验散列文件和名字备份,符合给自己留条后路的哲学。 另外可以根据自己的需要无限制的扩展功能。
方法4 : 终极解决方案,重新编译内核
首先在内核源码中找到 include/linux/binfmts.h文件 ,搜索到以下字段:
/*
* MAX_ARG_PAGES defines the number of pages allocated for arguments
* and envelope for the new program. 32 should suffice, this gives
* a maximum env+arg of 128kB w/4KB pages!
*/
#define MAX_ARG_PAGES 32
第 4 页 共 5 页
修改 MAX_ARG_PAGES数值为 64 或者更高即可完善的解决参数受限问题。
然后 重新编译并启用新内核即可.
Notes : 以上全部测试通过,基于bash。
第 5 页 共 5 页
因篇幅问题不能全部显示,请点此查看更多更全内容