【问题标题】:How to fix ' Argument list too long' error?如何修复“参数列表太长”错误?
【发布时间】:2015-03-12 14:25:27
【问题描述】:

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

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

但我收到此错误:/bin/bash: /usr/bin/perl: Argument list too long

谁能建议一种方法来避免这个错误?

【问题讨论】:

    标签: bash perl shell


    【解决方案1】:

    这就是xargs 的全部意义所在。

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

    find也可以,而且可以更灵活地选择要修改的文件。

    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/*'
    

    【讨论】:

      【解决方案2】:

      将 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/*"
      

      【讨论】:

      • 感谢您的回复 Сухой27,我尝试了您的解决方案,但我再次收到同样的错误。
      猜你喜欢
      • 2015-06-25
      • 1970-01-01
      • 1970-01-01
      • 2019-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-08
      相关资源
      最近更新 更多