批量处理文件权限:解决‘/usr/bin/chmod: Argument list too long’的有效方法

embedded/2024/10/22 9:18:04/

批量处理文件权限:解决‘/usr/bin/chmod: Argument list too long’的有效方法

  • 错误原因
  • 解决方案
    • 1. 分批处理
    • 2. 使用`xargs`
    • 3. 增加`ARG_MAX`限制
    • 4. 使用脚本
  • 结论

在Linux系统中,有时你可能会遇到这样的错误消息:“/usr/bin/chmod: Argument list too long”。这个错误通常发生在尝试使用chmod命令更改大量文件或目录的权限时,由于命令行参数的总长度超过了系统限制。本文将详细介绍这个问题的原因以及几种可能的解决方案。

在这里插入图片描述

错误原因

在Linux和类Unix系统中,每个进程都有一个最大命令行长度限制。这个限制是由内核参数ARG_MAX定义的,它规定了单个命令行可以包含的最大字符数(包括所有参数和环境变量)。当尝试执行的命令(如chmod)所包含的参数总长度超过这个值时,就会出现“Argument list too long”的错误。

解决方案

1. 分批处理

方法:将大量的文件或目录分批处理,每次处理一小部分。

示例
假设你需要更改/path/to/files/目录下所有文件的权限,你可以使用find命令结合-exec选项来分批执行chmod

find /path/to/files/ -type f -exec chmod 644 {} +

这里的+符号表示find命令会将尽可能多的文件参数一起传递给chmod,但不会超过系统限制。这是一种相对高效且安全的方式来处理大量文件。

2. 使用xargs

方法:使用find命令配合xargs工具来分批次执行chmod

示例

find /path/to/files/ -type f -print0 | xargs -0 chmod 644

这里,-print0选项确保文件名以null字符分隔(这对于包含空格或特殊字符的文件名特别有用),而xargs -0则确保这些文件名正确地传递给chmod

3. 增加ARG_MAX限制

方法:理论上,可以通过调整内核参数来增加ARG_MAX的值,但这通常不推荐,因为它需要重启系统,并且可能影响到系统的稳定性和安全性。

步骤

  1. 查看当前的ARG_MAX值:
    sysctl kernel.arg_max
    
  2. 临时增加ARG_MAX(重启后失效):
    sudo sysctl -w kernel.arg_max=新值
    
  3. 永久更改(需要编辑/etc/sysctl.conf并添加相应设置,然后重启):
    kernel.arg_max = 新值
    

注意:增加ARG_MAX可能会导致其他系统问题,因此只有在非常必要的情况下才考虑此方法,并且最好是在了解可能的影响后。

4. 使用脚本

方法:编写一个简单的脚本,通过循环和条件判断来处理大量文件。

示例

#!/bin/bash
for file in /path/to/files/*; dochmod 644 "$file"
done

这个脚本会逐个处理每个文件,虽然可能比较慢,但避免了命令行长度超限的问题。

结论

遇到“/usr/bin/chmod: Argument list too long”错误时,最安全和最常用的方法是利用find命令配合-execxargs来分批处理文件。这些方法不仅有效,而且避免了修改系统级参数可能带来的风险。在处理大量文件时,始终要注意不要超出系统限制,并确保操作的效率和安全性。


http://www.ppmy.cn/embedded/129519.html

相关文章

Kube-apiserver出现“Unable to authenticate the request”错误的解决方案

项目场景: 之前使用工具一键部署K8S集群,并在集群部署一些服务。某天突然发现服务无法访问。 问题描述 1、执行kubectl get node节点状态均为NotReady 2、执行kubectl logs pod_name -n namespace时出现报错Internal error occurred: Authorization er…

SysTick 校准寄存器-SKEW-TENMS

在Cortex M0 权威指南里对这个寄存器说的还算清楚,SysTick 是通用的CPU 核心模块,所以M3、M4 上这些寄存器也差不多: NOREF 就是“NO无 REF 参考时钟”,如果值是1,表示没有外部参考时钟,SysTick 只能用CPU…

点云处理中的三种近邻搜索方法:K近邻、体素内近邻和半径内近邻搜索

在计算机图形学、机器人学和三维点云处理领域,如何高效地查找特定点附近的邻居点是一个非常重要的问题。常见的近邻搜索方法包括 K近邻搜索(K Nearest Neighbor Search)、体素内近邻搜索(Voxel-Based Neighbor Search)…

Java知识巩固(七)

目录 面向对象 面向对象三大特征 封装 继承 多态 多态 深拷贝和浅拷贝区别了解吗?什么是引用拷贝? 浅拷贝 深拷贝 面向对象 万物皆为对象,也就是描述某个事物解决问题的过程中所发生的事情。 面向对象三大特征 封装 封装是指把一个对象的状态信息&…

爬虫学习——26.JS逆向(2)

AES与DES DES对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者。 和信息的接收者在进行信息的传输与处理时,必须共同持有该密钥(称为对称密码),是一种对称加密算法。一般来说加密用的是encrypt()函数,解密用的是decrypt()函数。 AE…

PCL 基于距离阈值去除错误对应关系

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 获取初始对应点对 2.1.2 基于距离的对应关系筛选函数 2.1.3 可视化函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与项目实战案例汇总…

【进阶OpenCV】 (11)--DNN板块--实现风格迁移

文章目录 DNN板块一、DNN特点二、DNN函数流程三、实现风格迁移1. 图像预处理2. 加载星空模型3. 输出处理 总结 DNN板块 DNN模块是 OpenCV 中专门用来实现 DNN(Deep Neural Networks,深度神经网络) 模块的相关功能,其作用是载入别的深度学习框架(如 TensorFlow、Caf…

判断大小端

这个代码可以用来判断电脑字节序储存方(电脑储存方式由硬件决定),下面我们来看代码 那么今天分享就到这里,谢谢大家!