您的当前位置:首页正文

linux下ls mv命令参数列表过长的解决办法

2024-10-18 来源:威能网


四种解决”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 页

因篇幅问题不能全部显示,请点此查看更多更全内容