1. 问题描述:
Linux下在使用cp,mv,rm、zip等命令时经常会碰到“Argument list too long”的错误,这主要是因为这些命令的参数太长,即:文件个数过多导致的。
基础解法
2. 解决方案:
方法1:通过命令,find
和xargs
来解决。
方法2:通过命令,find
和exec
来解决。
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函数 ,来实现指定文件夹下的文件的rm
、cp
、zip
、mv
等命令。
(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 错误解决方法汇总