admin管理员组

文章数量:1567540

Linux中“Argument list too long”解决方法

    • 基础解法
    • 优化策略

1. 问题描述:

Linux下在使用cp,mv,rm、zip等命令时经常会碰到“Argument list too long”的错误,这主要是因为这些命令的参数太长,即:文件个数过多导致的。

基础解法

2. 解决方案:

方法1:通过命令,findxargs来解决。

方法2:通过命令,findexec来解决。

3. 典型范例:

(1)要删除test文件夹下以.jpg结尾的文件。

# 方法一:
find test/ -name "*.jpg" | xargs -i rm {}
# 方法二:
find test/ -name "*.jpg" -exec rm {} \;

(2)要拷贝test文件夹下以jpg结尾的文件到train目录。

# 方法一:
find test/ -name "*.jpg" | xargs -i cp {} train
# 方法二:
find test/ -name "*.jpg" -exec cp {} train \;

(3)要压缩当前目录中train_xml文件夹下以.xml结尾的文件至当前目录,并命名新压缩文件为train_xml_8140.zip。

# 方法一:
find train_xml/ -name "*.jpg" | xargs -i zip train_xml_8140.zip {} 
# 方法二:
find train_xml/ -name "*.xml" -exec  zip train_xml_8140.zip {} \;

命令解析:

find test/ -name "*.jpg"是指在test文件夹下查找名为*.jpg的文件。

xargs命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具。-i会将xargs的内容赋值给{}

-exec参数后面是指执行其后面的命令,-exec;为结尾,由于各个系统中分号的意义不同,因此用\进行转义,即\;,此外,运行过程中{}会被find命令的结果替换。

个人体会:

上述方法确实可以解决“Argument list too long”的问题,但是压缩文件时运行速度明显降低,经查证原因如下:

通过find命令筛选文件列表,把符合要求的文件传递给一系列命令。

  • 优点是find命令有很强大的筛选功能,而且,也许是最重要的,这个方法只需要1行命令。
  • 唯一的缺点是, 方法2需要遍历文件,因此耗时较多。

优化策略

通过 创建shell函数 ,来实现指定文件夹下的文件的rmcpzipmv等命令。

(1) 创建shell函数: 在Sublime编辑器中,输入如下shell函数命令:

#! /bin/bash

# 在shell 中定义与使用函数
# 删除指定文件夹下的所有文件
RM_DIR='/Users/yangyang/Documents/last_train_sets/a/'   # 定义指定文件夹

cd $RM_DIR
for I in `ls`
do
rm -f $I   # 执行删除命令
done
# 压缩指定文件夹下的所有文件
RM_DIR='/Users/yangyang/Documents/last_train_sets/train_img/'  # 定义指定文件夹

cd $RM_DIR
for I in `ls`
do
zip train_img_8140.zip $I   # 执行压缩命令
done

# 移动指定文件夹a下的所有文件至目标文件夹b下
RM_DIR='/Users/yangyang/Documents/last_train_sets/a/'

cd $RM_DIR
for I in `ls`
do
mv $I '/Users/yangyang/Documents/last_train_sets/b/'
done

(2) 调用shell命令: 将上述shell函数保存为.sh格式的文件,之后再Terminal终端执行命令:sh /Users/edz/Desktop/untitled.sh(此处使用文件的绝对路径)

参考链接:
Linux中“Argument list too long”解决方法
Argument list too long 错误解决方法汇总

本文标签: 解决方法命令CPzipLinux