Pregunta

Tengo un script de perl que realizar algunas operaciones en los directorios, y sólo espero que se ejecute en directorios para el cual el usuario actual (por ejemplo. El usuario que ejecuta la secuencia de comandos) tendrá la propiedad.

He intentado lo siguiente:

...
my $user = getlogin();
opendir(HANDLE, $path) or die ("No such directory: $path");
foreach my $directory (readdir HANDLE)
{
    opendir(WORKING_DIR_HANDLE, "$path/$directory") or die ("!!!!!!!");
    my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat(WORKING_DIR_HANDLE);
    my $owner = getpwuid($uid);
    if( $owner eq $user )
    {
      ...
    }
}
...

El código funciona en su mayor parte. Sin embargo, el llamado a stat () devuelve valores no definidos. De acuerdo con la documentación de Perl, creo que estoy haciendo la llamada stat () correctamente:

* stat FILEHANDLE
* stat EXPR
* stat DIRHANDLE
* stat

 Returns a 13-element list giving the status info for a file, either the file opened via
 FILEHANDLE or DIRHANDLE, or named by EXPR. If EXPR is omitted, it stats $_ . Returns the 
 empty list if stat fails. Typically used as follows:

También he intentado apenas pasing que una EXPR usando el nombre del archivo, y obtener los mismos resultados. Solo estoy perdiendo algo obvio? ¿O hay otra manera de hacer esto? Yo preferiría una solución que no requiere la instalación de terceros módulos Perl.

¿Fue útil?

Solución

stat devuelve una lista vacía en caso de fallo, el cual establece todas aquellas variables que no def. Añadir or die $! después de la llamada para averiguar por qué ha fallado:

my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks)
   = stat(WORKING_DIR_HANDLE) or die $!;

Una vez que sepa por qué ha fallado, puede ser capaz de averiguar cómo solucionarlo. Si no es así, a continuación, añadir el mensaje de error a su pregunta.

Otros consejos

Trate de añadir un poco de manejo de errores, por ejemplo, después de stat:

if ($!) {
   warn "WRN: $path/$directory: $!";
   next;
}

Si su script toma mucho tiempo en ejecutarse, algunos directorios (y archivos) se pueden mover / eliminado por los usuarios (o trabajos en segundo plano).

También puede comprobar si el archivo / directorio es propiedad del usuario actual mediante el uso de -o

DIRHANDLE stat es una característica bastante nuevo, y si no recuerdo mal está disponible en todas las plataformas ... ¿está seguro de sus Perl lo apoya?

Es posible que desee centrarse en conseguir EXPR stat trabajar por primera vez.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top