如何修复“参数列表太长”错误?

How to fix ' Argument list too long' error?

我执行了此命令以从文件夹 train 中的大量文件(约 3000 个)中删除所有出现的“#”,

perl -pi -e "s/#//g" /Users/Kian/Desktop/Acsegment/espslabs/train/*

但是我得到了这个错误:/bin/bash: /usr/bin/perl: Argument list too long

任何人都可以提出避免此错误的方法吗?

将 globing 留给 perl 而不是 bash,后者有局限性,

perl -pi -e 'BEGIN{ @ARGV = glob(pop) } s/#//g' "/Users/Kian/Desktop/Acsegment/espslabs/train/*"

或者全局目录中什么时候有空格,

perl -MFile::Glob=bsd_glob -pi -e 'BEGIN{ @ARGV = bsd_glob(pop) } s/#//g' "/Users/Kian/Desktop/Acsegment/espslabs/train/*"

这就是 xargs 的意义所在。

ls /Users/Kian/Desktop/Acsegment/espslabs/train |
   xargs perl -i -pe's/#//g'

find也可以,而且select可以更灵活地修改哪些文件。

find /Users/Kian/Desktop/Acsegment/espslabs/train \
   -type f -maxdepth 1 \
   -exec perl -i -pe's/#//g' {} +

当然,您也可以用 Perl 生成文件列表。

perl -i -pe'BEGIN { @ARGV = map glob, @ARGV } s/#//g' \
    '/Users/Kian/Desktop/Acsegment/espslabs/train/*'

但是你必须在路径中转义空格,除非你使用 bsd_glob

perl -i -pe'
   use File::Glob qw( bsd_glob );
   BEGIN { @ARGV = map bsd_glob($_), @ARGV }
   s/#//g
' '/Users/Kian/Desktop/Acsegment/espslabs/train/*'