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״ גנרי.
הרשאות#
שני כללים נפרדים, תלוי באיזו צורה משתמשים:
צורה | מי עשוי להצליח |
|---|---|
| בעל הקובץ, או root |
| כל אחד עם הרשאת כתיבה על הקובץ |
מי שאינו הבעלים המנסה את צורת חותמת־הזמן המפורשת מקבל 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וגם ל־MTIMEopenו־close- מטפלי קובץ ש־utimeיכול לבצע עליהם touch במערכות עםfutimes(2)$!- שגיאת מערכת מהקובץ הכושל האחרון כאשר ספירת ההחזרה קטנה מ־scalar @filesutime(2),utimes(2),futimes(2)- קריאות המערכת שבבסיס