请选择 进入手机版 | 继续访问电脑版

[LINUX] linux批量操作时提示Argument list too long办理 方法

[复制链接]
查看114 | 回复12 | 2021-9-5 03:24:12 | 显示全部楼层 |阅读模式

第一种环境 :

在现实 利用 过程中,若一个目次 下文件或文件夹太多,在实验 “*” 下令 时 会提示Argument list too long,如rm -rf /tmp/*下令 下。
办理 方案:

 

  1. 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目次 下的全部 文件,文件数目 比较多。

  1. ls -lt /tmp | wc -l
  2. 385412
复制代码

利用

  1. rm *
复制代码
后,体系 提示错误
  1. Argument list too long
复制代码

缘故因由 是在linux下,试图传太多参数给一个体系 下令 (ls *; cp *; rm *; cat *; etc..)时,就会出现 Argument list too long错误。

办理 方法如下:
利用 find -exec 遍历,然后实验 删除便可。

  1. 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:
 

  1. function huge_mv ()
  2. {whileread line1; do
  3. md5sum foo/$line1 >> ~/md5sums
  4. ls -l foo/$line1 >> ~/backup_list
  5. mv foo/$line1 ../foo2
  6. done
  7. }
  8. 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 或者更高即可美满 的办理 参数受限题目 。
然后 重新编译并启用新内核即可。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

avatar 牛股行天下烁 | 2021-9-13 02:19:32 | 显示全部楼层
无图无真相!
回复

使用道具 举报

avatar 屎壳郎秧 | 2021-9-22 23:36:05 | 显示全部楼层
赞一个!
回复

使用道具 举报

avatar 小菊花之米 | 2021-10-13 07:51:26 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的源码论坛他的站点都是商业源码,还是免费下载的那种!特别好用。访问地址:http://www.mxswl.com 猫先森网络
回复

使用道具 举报

avatar 大龙山草 | 2021-10-15 05:21:32 | 显示全部楼层
看帖不回帖的人就是耍流氓,我回复了!
回复

使用道具 举报

avatar 准藏智虽 | 2021-10-15 21:41:33 | 显示全部楼层
今天过得很不爽!
回复

使用道具 举报

白富美?高富帅?
回复

使用道具 举报

上次给admin楼主开的药,你都吃完了?
回复

使用道具 举报

看了这么多帖子,第一次看看到这么有内涵的!
回复

使用道具 举报

收藏了,改天让朋友看看!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则