מטפלי קובץ קבצים ספריות

utime#

קביעת זמני גישה ושינוי על רשימת קבצים.

utime מחיל את זמן הגישה המספרי ATIME ואת זמן השינוי MTIME - שניהם שניות epoch של Unix - על כל קובץ המופיע ב־LIST. זהו הממשק ברמת Perl לקריאות המערכת utime(2) ו־utimes(2), והכלי שמאחורי פקודת touch(1) של Unix. זמן שינוי ה־inode (ctime) של כל קובץ נקבע לזמן הנוכחי כתופעת לוואי - זוהי קביעה של הקרנל, לא בחירה של Perl, ולא ניתן לדכא אותה.

תקציר#

utime ATIME, MTIME, LIST
utime undef, undef, LIST      # set both to "now" (since 5.8.0)

מה מקבלים בחזרה#

מספר הקבצים שחותמות הזמן שלהם עודכנו בהצלחה. כל קובץ שלא ניתן היה ל־touch מדולג בשקט בספירה; $! משקף את השגיאה מהקובץ הכושל האחרון בלבד. יש לבדוק את ערך ההחזרה מול scalar @files כאשר צריך לזהות כישלון חלקי:

my @files = ("a", "b", "c");
my $n = utime $atime, $mtime, @files;
warn "only $n of ", scalar @files, " files updated: $!"
    if $n != @files;

ארגומנטים#

  • ATIME - זמן הגישה החדש, בשניות מאז ה־epoch של Unix. חייב להיות מספרי; סקלרים לא־מספריים מומרים בדרך הרגילה ומחרוזת כמו "now" הופכת ל־0 (חצות 1970-01-01).

  • MTIME - זמן השינוי החדש, אותו פורמט.

  • LIST - שם קובץ אחד או יותר. במערכות התומכות ב־futimes(2) (Linux תומכת), גם מטפלי קובץ עשויים להופיע ב־LIST. מטפלי קובץ חייבים להיות מועברים כ־globs (*FH) או הפניות ל־glob (\*FH); bareword במיקום זה מתפרסר כשם קובץ, לא כמטפל.

הצורה undef, undef#

מאז Perl 5.8.0, העברת undef עבור גם ATIME וגם MTIME קוראת ל־utime(2) עם ארגומנט שני null. הקרנל אז קובע את שני הזמנים לזמן wall-clock הנוכחי, ו - באופן מכריע - צורה זו מצליחה על קבצים שהקורא אינו הבעלים שלהם, בתנאי שלקורא יש הרשאת כתיבה על הקובץ. דרישת הבעלים־או־root חלה רק על צורת חותמת־הזמן המפורשת.

for my $file (@ARGV) {
    utime undef, undef, $file
        or warn "Couldn't touch $file: $!";
}

זוהי הצורה שבה פקודת ה־touch(1) האמיתית משתמשת פנימית, וזוהי הבחירה הנכונה לסקריפט ״touch״ גנרי.

הרשאות#

שני כללים נפרדים, תלוי באיזו צורה משתמשים:

צורה

מי עשוי להצליח

utime $atime, $mtime, ...

בעל הקובץ, או root

utime undef, undef, ...

כל אחד עם הרשאת כתיבה על הקובץ

מי שאינו הבעלים המנסה את צורת חותמת־הזמן המפורשת מקבל EPERM ב־$! והקובץ נשאר ללא שינוי (זה עדיין נספר ככישלון, לא כ־no-op שקט).

דוגמאות#

touch רגיל בסגנון Unix על רשימת קבצים שאתם בעלים שלהם:

my $now = time;
utime $now, $now, @ARGV;

touch גנרי שעובד גם על קבצים שיש לכם רק גישת כתיבה אליהם:

for my $file (@ARGV) {
    utime undef, undef, $file
        or warn "Couldn't touch $file: $!";
}

העתקת חותמות זמן מקובץ אחד לאחר באמצעות stat:

my @st = stat $src or die "stat $src: $!";
utime $st[8], $st[9], $dst
    or die "utime $dst: $!";

לבצע touch על מטפל קובץ שכבר פתוח ב־Linux (צריך futimes(2)):

open my $fh, ">>", "log" or die $!;
utime undef, undef, *$fh;       # glob deref, not bareword

לקבוע קובץ שעה אחת אחורה, שימושי לבדיקות מערכת בנייה:

my $t = time - 3600;
utime $t, $t, "stale.tmp";

מקרי קצה#

  • ערבוב undef ומספר: העברת undef רק עבור אחד משני הארגומנטים הראשונים לא מפעילה את מסלול ה־״both-undef״. ה־undef מומר ל־0 (חצות epoch 1970-01-01), הערך השני בשימוש כמו שהוא, ואזהרת uninitialized נפלטת תחת use warnings. זה כמעט אף פעם לא מה שרוצים.

    use warnings;
    utime undef, time, $file;       # atime = 1970-01-01, warning
    
  • חותמות זמן לא־מספריות: ATIME ו־MTIME חייבים להיות מספריים. ערכי מחרוזת מומרים - "1700000000" עובד; "yesterday" הופך בשקט ל־0.

  • ctime תמיד זז: אין דרך לשמר את זמן שינוי ה־inode של קובץ לרוחב קריאת utime. אם נדרש זה, נדרשים כלים ברמת מערכת הקבצים או snapshot, לא Perl.

  • מטפל קובץ ב־LIST: חייב להיות glob (*FH) או הפניה ל־glob (\*FH). bareword כמו FH במיקום זה מתפרסר כשם הקובץ "FH", וסקלר מחרוזת המחזיק שם מטפל מטופל גם הוא כשם קובץ.

  • קובץ לא־קיים: נספר ככישלון ואינו מגדיל את ערך ההחזרה; $! נקבע ל־ENOENT (No such file or directory).

  • כישלון חלקי: הספירה משקפת רק הצלחות. כדי לדעת איזה קובץ נכשל, יש לעבור על הרשימה אחד־אחד.

  • סטיית שעון NFS: שעון השרת סמכותי, לא של הלקוח. הבדל ניכר בין השניים מופיע כחותמות זמן שאינן תואמות את מה ש־time על הלקוח החזיר.

  • דיוק תת־שנייה: utime של Perl פועל על שניות שלמות. מערכות קבצים וקרנלים התומכים בחותמות זמן בננו־שניות יראו את הרכיב השברי מאופס. יש לפנות ל־Time::HiRes::utime (XS) אם נדרשת רזולוציה טובה יותר.

הבדלים מ־upstream#

תואם מלא ל־upstream Perl 5.42.

ראו גם#

  • stat - לקרוא את חותמות הזמן ש־utime כותב; אלמנטים 8 (atime), 9 (mtime), ו־10 (ctime) של הרשימה המוחזרת

  • time - שניות ה־epoch הנוכחיות, המקור הרגיל גם ל־ATIME וגם ל־MTIME

  • open ו־close - מטפלי קובץ ש־utime יכול לבצע עליהם touch במערכות עם futimes(2)

  • $! - שגיאת מערכת מהקובץ הכושל האחרון כאשר ספירת ההחזרה קטנה מ־scalar @files

  • utime(2), utimes(2), futimes(2) - קריאות המערכת שבבסיס