El error está en que '\)' está pegado a la comilla doble, por lo que find no lo interpreta como un argumento más.
Using perl Syntax Highlighting
#!/usr/bin/env perl
my $t = -1;
my @files = qx(find . -type f \\( -iname "*.pl" -o -iname "*.txt" \\) -mtime $t -ls | awk '{print \$8 ":" \$9 ":" \$10 ":" \$11}');
print "@files";
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
De todas maneras, esto es muy ineficiente: estás llamando a dos comandos externos (find y awk) que, perfectamente, podrías hacer con el propio Perl.
Empezando por el find...
Perl viene con un programa que se llama find2perl, que sirve para traducir comandos find en programas Perl (de ahí le viene el nombre :) )
Entonces, si ejecutamos
Using bash Syntax Highlighting
find2perl find . -type f \( -iname "*.pl" -o -iname "*.txt" \) -mtime -1 -ls
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
nos entrega a la salida estándar un programa así:
Using perl Syntax Highlighting
#! /usr/bin/perl -w
eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
if 0; #$running_under_some_shell
use strict;
use File::Find ();
# Set the variable $File::Find::dont_use_nlink if you're using AFS,
# since AFS cheats.
# for the convenience of &wanted calls, including -eval statements:
use vars qw/*name *dir *prune/;
*name = *File::Find::name;
*dir = *File::Find::dir;
*prune = *File::Find::prune;
sub wanted;
sub ls ();
my @rwx = qw(--- --x -w- -wx r-- r-x rw- rwx);
my @moname = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
my (%uid, %user);
while (my ($name, $pw, $uid) = getpwent) {
$user{$uid} = $name unless exists $user{$uid};
}
my (%gid, %group);
while (my ($name, $pw, $gid) = getgrent) {
$group{$gid} = $name unless exists $group{$gid};
}
# Traverse desired filesystems
File::Find::find({wanted => \&wanted}, 'find', '.');
exit;
sub wanted {
my ($dev,$ino,$mode,$nlink,$uid,$gid);
(($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
-f _ &&
(
/^.*\.pl\z/si
||
/^.*\.txt\z/si
) &&
(int(-M _) < 1) &&
ls;
}
sub sizemm {
my $rdev = shift;
sprintf("%3d, %3d", ($rdev >> 8) & 0xff, $rdev & 0xff);
}
sub ls () {
my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
$atime,$mtime,$ctime,$blksize,$blocks) = lstat(_);
my $pname = $name;
$blocks
or $blocks = int(($size + 1023) / 1024);
my $perms = $rwx[$mode & 7];
$mode >>= 3;
$perms = $rwx[$mode & 7] . $perms;
$mode >>= 3;
$perms = $rwx[$mode & 7] . $perms;
substr($perms, 2, 1) =~ tr/-x/Ss/ if -u _;
substr($perms, 5, 1) =~ tr/-x/Ss/ if -g _;
substr($perms, 8, 1) =~ tr/-x/Tt/ if -k _;
if (-f _) { $perms = '-' . $perms; }
elsif (-d _) { $perms = 'd' . $perms; }
elsif (-l _) { $perms = 'l' . $perms; $pname .= ' -> ' . readlink($_); }
elsif (-c _) { $perms = 'c' . $perms; $size = sizemm($rdev); }
elsif (-b _) { $perms = 'b' . $perms; $size = sizemm($rdev); }
elsif (-p _) { $perms = 'p' . $perms; }
elsif (-S _) { $perms = 's' . $perms; }
else { $perms = '?' . $perms; }
my $user = $user{$uid} || $uid;
my $group = $group{$gid} || $gid;
my ($sec,$min,$hour,$mday,$mon,$timeyear) = localtime($mtime);
if (-M _ > 365.25 / 2) {
$timeyear += 1900;
} else {
$timeyear = sprintf("%02d:%02d", $hour, $min);
}
printf "%5lu %4ld %-10s %3d %-8s %-8s %8s %s %2d %5s %s\n",
$ino,
$blocks,
$perms,
$nlink,
$user,
$group,
$size,
$moname[$mon],
$mday,
$timeyear,
$pname;
1;
}
Coloreado en 0.004 segundos, usando
GeSHi 1.0.8.4
¿Que es enorme para lo que queremos? Pues sí, pero... si tenemos el fuente, ahora podemos modificarlo para nuestro problema en particular, que trata de sacar la fecha y nombre de los archivos.
Solo tenemos que modificar el último printf() de la función ls() para que saque los campos que nos interesan, y ya está. Y nos ahorramos el llamar a awk.
Seguimos con awk... ya hemos dicho que no tenemos que hacer nada porque modificando el printf() lo tenemos resuelto, pero en otras ocasiones sí que nos vemos obligado a usarlo.
Bueno, en Perl, todo lo que hace awk se puede imitar bastante bien. En nuestro caso, un comando como
awk '{print \$8 ":" \$9 ":" \$10 ":" \$11}'lo podemos escribir como
Using perl Syntax Highlighting
my @campos = split;
print join(":", @campos[8..11]), "\n";
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
y nos ahorramos una llamada externa a awk, que siempre es algo muy costoso desde el punto de vista del ordenador.