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

时间:2015-01-14 11:52:42

标签: bash perl shell

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

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

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

有人可以建议一种避免此错误的方法吗?

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:6)

留下perl而不是有限制的bash,

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

或在globed目录中的空格,

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