Determinar la propiedad de usuario / grupo para un directorio
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.
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.