由于参数过多,Perl 命令未执行,我该如何修复它以允许更多参数?

Perl command not executing because of too many arguments, how can I fix it to allow more arguments?

我正在尝试使用这个命令:

perl -i -p -e "s/\r//" ./{folderName}/*.txt

问题是我在这个文件夹中有很多 .txt 文件,我想命令无法处理它...还有什么我可以尝试或做的事情来解决这个问题吗?

我得到的错误是:"Argument list too long"

我已成功使用此命令处理较小的文件夹大小(较少的 .txt 文件)并且工作正常。

GNU:

find {folder_name} -maxdepth 1 -name '*.txt' -exec perl -i -pe's/\r//' {} +

更便携:

find {folder_name} -maxdepth 1 -name '*.txt' -print | xargs perl -i -pe's/\r//'

echo {folder_name}/*.txt | xargs perl -i -pe's/\r//'

find {folder_name} -maxdepth 1 -name '*.txt' -exec perl -i -pe's/\r//' {} \;

备注

  • None 的解决方案支持以 -.

  • 开头的 {folder_name}
  • 前两个便携式解决方案不支持其中包含某些特殊字符的文件名。 (但您不太可能首先在文件名中找到这些字符。)

  • GNU 解决方案和前两个可移植解决方案将尽可能多的文件名传递给 perl(尽量减少 perl 启动的次数),而第三个便携式解决方案为每个参数启动一个 perl 进程。

  • echo 是一个 shell 内置函数,因此它不受系统对传递给实用程序的参数数量的限制。

shell 上的输入参数有限制。 这可以通过命令下面的 运行 找到。

getconf ARG_MAX

如果参数数量更多,那么您可以使用其他方法,如管道或 for 循环。

例如

for txt in ./{folderName}/*.txt ; do perl -i -p -e "s/\r//" "$txt"; done

或使用管道

echo ./{folderName}/*.txt | xargs perl -i -p -e "s/\r//" 

echo 的解释,@ikegami 提出为什么 echo 不会给出 "too many argument"

原因是 echo 是内置命令,不会将参数传递给新进程。