No sé muy bien dónde puede estar el error... podrían ser los últimos paréntesis, o la mezcla de comillas en el one-liner.
De todas maneras... ¿por qué haces eso? Estás ejecutando un proceso Perl por cada archivo que quieres modificar... eso es muy ineficiente...
Mira... con unos pequeños cambios, lo tienes resuelto:
Using perl Syntax Highlighting
#!usr/bin/perl
# usage samcleanser.pl [full dir path]
# Alfumao, 2012.
use v5.10;
use strict;
use warnings;
use autodie; # «Mejor morir que regresar con deshonor» --Proberbio Kinglon
# print "Enter your directory path:\n"; #carpeta
# chomp(my $path = <STDIN>);
my $path = shift @ARGV;
say $path;
chdir $path;
opendir(TEMP, "." );
while (my $file = readdir TEMP) {
if (my($name) = $file =~ /(\w+[.]\w+[.]sam)/ ) {
say "cleaning $name";
open my $FI, '<', $name;
open my $FO, '>', "$name.part";
while (my $linea = <$FI>) {
next if '@' eq substr $linea, 0, 1; # no ponemos la línea si el primer carácter es '@'
print $FO $linea;
}
close $FI;
close $FO;
rename "$name.part", $name; # rename cambia el nombre y sobreescribe el original
}
}
closedir TEMP;
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Este programa realiza la misma función, pero es mucho más rápido, ya que no ejecuta un nuevo proceso por cada archivo. Y las operaciones que realiza son las mismas que con el operador -i: abre un archivo nuevo donde va guardando los cambios y al final hace un rename() para dejar solo con el nombre original (bueno, no es exactamente así el orden en que -i funciona, pero las operaciones son las mismas).
En cuanto a si es más rápido hacerlo con Bash... pues yo sospecho que los tiempos serán los mismos, ya que las operaciones serán las mismas, y dependemos del cuello de botella que marca el sistema de ficheros.
Eso sí, el programa en Bash quedará más largo (mucho más) si intentas imitar las operaciones que hace este programa. Solo fíjate en la cantidad de código que
autodie nos ahorra...