美文网首页
【Linux】Linux argument list too l

【Linux】Linux argument list too l

作者: Bogon | 来源:发表于2022-06-18 09:13 被阅读0次

    问题1: 在某个文件夹执行命令完全卡死

    在某个文件夹执行命令完全卡死,(ctrl+z,ctrl+c等都不能用),表现为:

    1. 在文件夹执行ls等命令卡死

    2. 在服务器任何地方执行df -h与du -sh卡死(sudo fdisk -l管用)

    3. cd 文件夹卡死

    只好关闭当前shell,重新登录。

    产生原因:
    该文件夹中有一个服务挂载在该文件夹某一目录下,因突然关机等异常情况导致该服务无限制等待,机器重启后也不能正常连接。

    解决方法:
    查看与该文件夹相应的服务挂载情况:mount -l | grep 有问题文件夹名,如mount -l | grep "/root/bakup"

    image.png

    umount -l 文件夹,此刻,再访问文件夹即可使用命令了!

    问题2: 目录下文件太多,执行命令报错 arguments too long

    作为一个linux用户/系统管理员, 有些时候你会遇到以下错误提示:

    ls  /path/to/
    rm  -rf  /path/to/
    

    bash: /bin/ls: Argument list too long
    bash: /bin/rm: Argument list too long

    产生原因:
    “Argument list too long”参数列表过长错误经常发生在用户在一行简单命令中提供了过多的参数而导致,经常在ls *, cp *, rm * 等中出现,一般是因为受到 shell 参数个数限制所致

    解决方法:

    方法1 : 将文件群手动划分为比较小的组合

    mv [a-l]*  /path/to/foo/
    mv [m-z]*  /path/to/foo/
    

    这是最基本的方法,只是简单的使参数数量符合要求,这种方法应用范围有限,只适用于文件列表中的名字分布比较均匀,另外这也是个初级用户可以考虑的解决方案,不过需要很多重复命令和对文件名分布的观察与猜测。

    方法2 : 使用find命令

    find  /path/to/foo/   -name "*.jpg"   -type f  -exec  rm -rf  {}  \;
    
    find /path/to/bar/  -type f  -name '201301*sms.txt'   |xargs  -t -I {}  mv {}  /path/to/fooo/
    

    -exec command
    Execute command; true if 0 status is returned. All following arguments to find are taken to be arguments to the command until an argument consisting of #;' is encountered. The string {}' is replaced by the current file name being processed everywhere it occurs in the arguments to the command, not just in arguments where it is alone, as in some versions of find. Both of these constructions might need to be escaped (with a ') or quoted to protect them from expansion by the shell. The command is executed in the starting directory.

    通过find命令,将文件清单输出到rm命令,使其一次处理一个,这样就完全避免了过量参数的存在,另外通过不同的参数,可以指定除了名称以外的时间戳,权限,以及inode等匹配模式。

    方法3: 使用xargs命令

    用xargs 命令将文件以每 100 个为一组为单位处理

    cd  /path/to/foo/
    ls *.jpg  |  xargs -n 100    rm -rf
    
    

    xargs 命令会将文件以每 100 个为一组做 rm 处理。

    方法4: 使用 ls 结合 awk 操作

    可以使用 awk 一次删除一个的方式进行删除,但必须先进入该目录下。

    cd  /path/to/bar/
    ls -l |  awk  '{ print "rm -f ",$9}' |  sh
    

    参考

    Linux 命令 argument list too long 错误解决
    https://blog.51cto.com/u_14782715/5082973
    https://blog.csdn.net/fdipzone/article/details/41558461

    Linux删除文件出现/bin/rm: Argument list too long解决方法
    https://southcat.net/1481.html

    Linux下经过 rm -f 删除大量文件时报错:Argument list too long
    http://www.javashuo.com/article/p-pucmuhoh-v.html

    Linux文件系统十问
    https://mp.weixin.qq.com/s/pOKjwl3ONPMPSRF6RSmvaw

    新建一个空文件占用多少磁盘空间?
    https://mp.weixin.qq.com/s/9YeUEnRnegplftpKlW4ZCA

    文件过多时ls命令为什么会卡住?
    https://mp.weixin.qq.com/s/g-fFoYsBJkonV3ezdGDJKA

    相关文章

      网友评论

          本文标题:【Linux】Linux argument list too l

          本文链接:https://www.haomeiwen.com/subject/oajkvrtx.html