تحديد ملكية المستخدم/المجموعة للحصول على دليل

StackOverflow https://stackoverflow.com/questions/3549180

  •  30-09-2019
  •  | 
  •  

سؤال

لديّ برنامج نصي Perl الذي سيؤدي بعض العمليات على الدلائل ، وأنتظره فقط لتشغيله على الدلائل التي يتمتع بها المستخدم الحالي (على سبيل المثال الذي ينفذه البرنامج النصي).

لقد جربت ما يلي:

...
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 )
    {
      ...
    }
}
...

الرمز يعمل للجزء الأكبر. ومع ذلك ، فإن الدعوة إلى STAT () إرجاع القيم غير المحددة. وفقًا لمستندات Perl ، أعتقد أنني أقوم بإجراء استدعاء STAT () بشكل صحيح:

* 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:

لقد جربت أيضًا أن أقوم بتثبيته Expr باستخدام اسم الملف ، وأحصل على نفس النتائج. هل أفتقد شيئًا واضحًا؟ أم أن هناك طريقة أخرى للقيام بذلك؟ أفضل حل لا يتطلب تثبيت وحدات بيرل من طرف ثالث.

هل كانت مفيدة؟

المحلول

stat إرجاع قائمة فارغة على الفشل ، والتي تحدد كل هذه المتغيرات إلى undef. يضيف or die $! بعد المكالمة لمعرفة سبب فشلها:

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

بمجرد أن تعرف سبب فشلها ، قد تكون قادرًا على معرفة كيفية إصلاحه. إذا لم يكن كذلك ، فأضف رسالة الخطأ إلى سؤالك.

نصائح أخرى

حاول إضافة بعض معالجة الأخطاء ، على سبيل المثال بعد stat:

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

إذا استغرق تشغيل البرنامج النصي الخاص بك وقتًا طويلاً ، فقد يتم نقل/إزالة بعض الدلائل (والملفات) من قبل المستخدمين (أو وظائف الخلفية).

يمكنك أيضًا اختبار ما إذا كان الملف/الدليل مملوكًا للمستخدم الحالي باستخدام -o

Stat Dirhandle هي ميزة جديدة إلى حد ما ، وإذا كنت أتذكر بشكل صحيح غير متوفر على كل منصة ... هل أنت متأكد من أن Perl يدعمها؟

قد ترغب في التركيز على الحصول على عمل expr من أجلك أولاً.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top