cvmachine.com - 申博开户网

查找: 您的方位主页 > 网络频道 > 阅览资讯:怎样处理linux批量操作时提示Argumenr list too long的问题?

怎样处理linux批量操作时提示Argumenr list too long的问题?

2017-08-24 13:37:42 来历:www.cvmachine.com 【

怎样处理linux批量操作时提示Argumenr list too long的问题?

第一种状况:

在实际运用进程中,若一个目录下文件或文件夹太多,在履行“*” 指令时 会提示Argument list too long,如rm -rf /tmp/*指令下。
处理计划:

ls | xargs ­n 10 rm ­rf ls

SSH履行以上指令,输出一切的文件名(用空格切割) xargs便是将ls的输出,每10个为一组(以空格为分隔符),作为rm ­rf的参数 也便是说将一切文件名10个为一组,由rm ­rf删去。

第二种状况:

rm、cp、mv是unix下面常用到的档案处理指令,当咱们需求删去许多的log档案,假如档案数太多就会呈现此消息【/bin/rm: Argument list too long】

处理办法如下:
例如要删去 /tmp/*.log
则履行【ls /tmp/*.log | xargs rm -f】这样就能够萝^__^,其他cp,mv同理!

第三种状况:

今天需求删去/tmp目录下的一切文件,文件数量比较多。

ls -lt /tmp | wc -l 
385412 

运用 rm * 后,体系提示过错 Argument list too long
原因是在linux下,企图传太多参数给一个体系指令(ls *; cp *; rm *; cat *; etc..)时,就会呈现 Argument list too long过错。

处理办法如下:
运用find -exec 遍历,然后履行删去便可。

sudo find /tmp -type f -exec rm {} \; 

在linux中删去许多文件时,直接用rm会呈现:-bash: /bin/rm: 参数列表过长,的过错。

这时能够用find指令来结合运用。

例:
1、rm * -rf 改为:
find . -name "*" | xargs rm -rf '*' 就行了。

2、rm test* -rf 改为:
find . -name "test*" | xargs rm -rf "test*"

mv时报参数列表过长,
for i in *.m;do mv $i ${i%.m};done
所以求助于google,探究进程就省掉了,直接说处理办法吧:
ls dir1 | xargs -t -I {} mv {} dir2/{}
这儿的一对大括号是原文给的比方里用的,后来看了参数的用法,其实那对大括号是能够用恣意字符串替换的,比方:
ls dir1 | xargs -t -I asdf mv asdf dir2/asdf
效果和大括号那一版是彻底相同的,便是看起来有点儿不严厉。
需求阐明的是,上面xargs的第二个参数,是大写的i,读作”爱“的那个字母,不是小写的L。至于参数的意义嘛,我忘了。

Linux下 报错“指令参数列表过长”,在用mv指令一次移动3万多个文件时失利了,原始指令相似这样:”mv $(ls dir1) dir2“。过错提示的中心思想是:”你这参数也太TM多了吧“。
依照LZ主意大约能够这么做:find /dir1/ -maxdepth 1 | xargs -i mv {} /dir2/
假如参数过长,运用tar比较简略
tar -C /dir1/ -cf - . | tar -xf - -C /dir2/

所以求助于google,探究进程就省掉了,直接说处理办法吧:
ls dir1 | xargs -t -I {} mv {} dir2/{}
这儿的一对大括号是原文给的比方里用的,后来看了参数的用法,其实那对大括号是能够用恣意字符串替换的,比方:
ls dir1 | xargs -t -I asdf mv asdf dir2/asdf
效果和大括号那一版是彻底相同的,便是看起来有点儿不严厉。
需求阐明的是,上面xargs的第二个参数,是大写的i,读作”爱“的那个字母,不是小写的L。至于参数的意义嘛,我忘了。


别的4种办法
作为一个linux用户/体系管理员, 有些时分你会遇到以下过错提示:

[user@localhost foo]$ mv * ../foo2
bash: /bin/mv: Argument list too long

“Argument list too long”参数列表过长过错常常发作在用户在一行简略指令中供给了过多的参数而导致,常常在ls *, cp *, rm * 等中呈现。
依据问题的原因以下供给了四种办法,能够依据自己的状况酌情选用
办法1 : 将文件群手动划分为比较小的组合
e.g 1:

[user@localhost foo]$ mv [a-l]* ../foo2
[user@localhost foo]$ mv [m-z]* ../foo2

这是最基本的办法,仅仅简略的使参数数量契合要求,这种办法运用规模有限,只适用于文件列表中的姓名散布比较均匀,别的这也是个初级用户能够考虑的处理计划,不过需求许多重复指令和对文件名散布的调查与猜想。

办法2 : 运用find指令
e.g 2:

[user@localhost foo]$ find $foo -type f -name '*' -exec mv {}$foo2/. \;
办法2经过find指令,将文件清单输出到mv指令,使其一次处理一个,这样就彻底避免了过量参数的存在,别的经过不同的参数,能够指定除了称号以外的时刻戳,权限,以及inode等匹配形式。
办法2的缺陷在于比较消耗时刻。

办法3 : 创立shell函数
e.g 3.1:

function huge_mv ()
{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
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
修正 MAX_ARG_PAGES数值为 64 或许更高即可完善的处理参数受限问题。
然后 从头编译并启用新内核即可。


本文地址:http://www.cvmachine.com/a/question/91515.html
Tags: 批量 操作 linux
修正:申博开户网
关于咱们 | 联络咱们 | 友情链接 | 网站地图 | Sitemap | App | 回来顶部