使用ls命令查看目录文件时出现参数列表过长错误的解决问询
问题描述
在使用ls命令检查文件时,某个目录下的命令可正常执行:
infile=/Volumes/malrosie/data/satellite/chlor_a/cmems/mapped/4km/daily/*.nc ls -l $infile | tail -n 1
返回结果:
-rw-r--r-- 1 malrosie staff 91748221 Nov 12 2021 /Volumes/malrosie/data/satellite/chlor_a/cmems/mapped/4km/daily/20210630_d-ACRI-L4-CHL-MULTI_4KM-GLO-REP.nc
但切换到daily_crop目录执行逻辑相同的命令时报错:
infile1=/Volumes/malrosie/data/satellite/chlor_a/cmems/mapped/4km/daily_crop/*.nc ls -l $infile1 | tail -n 1
错误信息:
bash: /bin/ls: Argument list too long
错误原因
daily_crop目录下的.nc文件数量过多,当Shell解析*.nc通配符时,会将其展开为所有匹配的文件名列表,这个列表的总长度超过了系统定义的单个命令参数列表最大限制(由ARG_MAX参数控制),导致ls无法处理过长的参数,因此抛出该错误。
解决方法
使用
find命令替代:find可逐个处理文件,不受参数列表长度限制,要获取最后一个文件的信息可执行:find /Volumes/malrosie/data/satellite/chlor_a/cmems/mapped/4km/daily_crop/ -maxdepth 1 -name "*.nc" -ls | tail -n 1说明:
-maxdepth 1限制仅查找当前目录(不递归子目录);-name "*.nc"匹配目标文件;-ls输出类似ls -l的格式,最后通过tail -n 1提取最后一行结果。通过Shell循环遍历:用循环逐个遍历文件,记录最后一个文件后再查看其信息:
last_file="" for file in /Volumes/malrosie/data/satellite/chlor_a/cmems/mapped/4km/daily_crop/*.nc; do last_file="$file" done ls -l "$last_file"说明:循环会遍历所有匹配的
.nc文件,每次更新last_file为当前文件,循环结束后last_file即为目录中最后一个匹配的文件,再用ls -l查看详情。调整系统参数(不推荐):虽然可以修改系统的
ARG_MAX参数来提升限制,但这会影响整个系统的稳定性,可能引发未知问题,非必要情况不建议操作。
内容的提问来源于stack exchange,提问作者user11385237
相关产品推荐
相关产品推荐

