【发布时间】: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
谁能建议一种方法来避免这个错误?
【问题讨论】:
我执行了这个命令,从文件夹 train 中的大量文件(大约 3000 个)中删除所有出现的“#”,
perl -pi -e "s/#//g" /Users/Kian/Desktop/Acsegment/espslabs/train/*
但我收到此错误:/bin/bash: /usr/bin/perl: Argument list too long
谁能建议一种方法来避免这个错误?
【问题讨论】:
这就是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/*'
【讨论】:
将 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/*"
【讨论】: