系统命令的参数列表有一个最大限制-该限制是特定于发行版的,具体取决于MAX_ARG_PAGES
编译内核时的值,并且如果不重新编译内核就无法更改。
由于外壳处理团块的方式,当您使用相同的参数(“ * .jpg”)时,这将影响大多数系统命令。由于glob首先由shell处理,然后发送给命令,因此该命令:
cp -uf *.jpg /targetdir/
与您编写的shell基本相同:
cp -uf 1.jpg 2.jpg ... n-1.jpg n.jpg /targetdir/
如果您要处理很多jpeg,那么很快就会变得难以处理。根据命名约定和实际需要处理的文件数,可以一次在目录的另一个子集上运行cp命令:
cp -uf /sourcedir/[a-m]*.jpg /targetdir/
cp -uf /sourcedir/[n-z]*.jpg /targetdir/
这可能行得通,但确切的效果取决于您可以将文件列表分解为方便的,可混淆的块。
易爆 我喜欢那个词。
某些命令(例如find和xargs)可以处理大型文件列表,而无需创建麻烦的参数列表。
find /sourcedir/ -name '*.jpg' -exec cp -uf {} /targetdir/ \;
-exec参数将为find找到的每个文件运行一次命令行的其余部分,将{}替换为找到的每个文件名。由于cp命令一次只能在一个文件上运行,因此参数列表限制不是问题。
由于必须分别处理每个文件,因此速度可能很慢。使用xargs可以提供更有效的解决方案:
find /sourcedir/ -name '*.jpg' -print0 | xargs -0 cp -uf -t /destdir/
xargs可以获取find所提供的完整文件列表,并将其分解为可管理大小的参数列表,然后在每个子列表上运行cp。
当然,也可以重新编译内核,为设置更大的值MAX_ARG_PAGES
。但是重新编译内核比我愿意在这个答案中解释的工作还要多。