Filehandles, αρχεία, κατάλογοι
unlink#
Αφαιρεί μία ή περισσότερες εγγραφές καταλόγου που ονομάζουν αρχεία.
Η unlink ζητά από τον πυρήνα να καταργήσει τον σύνδεσμο μεταξύ κάθε ονόματος της LIST και του αρχείου στο οποίο αναφέρεται. Αν αυτός ο σύνδεσμος ήταν ο τελευταίος και καμία διεργασία δεν κρατά ακόμη το αρχείο ανοιχτό, ο αποθηκευτικός χώρος του αρχείου ανακτάται· διαφορετικά το αρχείο παραμένει στον δίσκο, χωρίς όνομα αλλά προσβάσιμο μέσω οποιουδήποτε ανοιχτού περιγραφέα, μέχρι να κλείσει το τελευταίο handle. Η unlink λειτουργεί σε εγγραφές καταλόγου, όχι στο περιεχόμενο αρχείων.
Σύνοψη#
unlink LIST
unlink
Τι επιστρέφεται#
Ο αριθμός των αρχείων που πραγματικά αφαίρεσε η unlink, ως ακέραιος. Σε ολική επιτυχία ισούται με scalar @LIST· σε μερική ή ολική αποτυχία είναι ο αριθμός των ονομάτων που αφαιρέθηκαν πριν και μετά εκείνα που απέτυχαν. Το μηδέν είναι έγκυρη επιστροφή «ψευδής» όταν τίποτα δεν μπόρεσε να αφαιρεθεί. Η $! τίθεται στο σφάλμα από την τελευταία αποτυχημένη κλήση - δεν σας λέει ποιο όνομα απέτυχε.
my $removed = unlink 'a', 'b', 'c';
unlink @goners;
unlink glob "*.bak";
Αν παραλειφθεί η LIST, η unlink λειτουργεί στο μεμονωμένο όνομα αρχείου στην $_.
Καθολική κατάσταση που επηρεάζει#
Εντοπισμός ποιο αρχείο απέτυχε#
Η unlink επιστρέφει πλήθος, όχι κατάσταση ανά αρχείο, και επικαλύπτει την $! σε κάθε επανάληψη. Για να αποδώσετε σφάλματα σε μεμονωμένα ονόματα, καλέστε unlink μία φορά ανά αρχείο:
foreach my $file (@goners) {
unlink $file
or warn "could not unlink $file: $!";
}
Η μορφή ανά αρχείο επίσης σας επιτρέπει να συνεχίσετε μετά από αποτυχία, πράγμα που η μορφή λίστας κάνει έμμεσα αλλά σιωπηρά.
Κατάλογοι#
Η unlink δεν αφαιρεί καταλόγους. Στο Linux επιστρέφει 0 και θέτει την $! σε EISDIR όταν της ζητηθεί. Το δυαδικό perl αναγνωρίζει μια επιλογή γραμμής εντολών -U που, σε συνδυασμό με εκτέλεση ως superuser, αίρει τον έλεγχο - αλλά ακόμη και τότε το unlink ενός καταλόγου παρακάμπτει τις εγγυήσεις ακεραιότητας καταλόγων του συστήματος αρχείων και μπορεί να αλλοιώσει το link count του γονικού καταλόγου. Χρησιμοποιήστε αντί αυτής την rmdir· καλεί την rmdir(2), που είναι η σωστή κλήση συστήματος για την αφαίρεση κενής εγγραφής καταλόγου.
rmdir $dir or die "rmdir $dir: $!"; # correct
unlink $dir; # fails with EISDIR
Σημασιολογία διαγραφής κατά POSIX#
Η unlink αφαιρεί το όνομα, όχι το αρχείο. Όσο κάποια διεργασία κρατά το αρχείο ανοιχτό, τα δεδομένα του αρχείου και το inode παραμένουν έγκυρα και εκείνη η διεργασία μπορεί να συνεχίσει να διαβάζει και να γράφει μέσω του περιγραφέα της. Ο αποθηκευτικός χώρος ανακτάται μόνο όταν το τελευταίο όνομα έχει εξαφανιστεί και ο τελευταίος περιγραφέας έχει κλείσει. Αυτό είναι το ιδιωματικό μοτίβο για τη δημιουργία προσωρινού αρχείου που καθαρίζεται από μόνο του ακόμη και σε crash:
open my $fh, "+>", $path or die "open $path: $!";
unlink $path or die "unlink $path: $!";
# $fh is still usable; $path is gone from the directory.
# When $fh closes or the process exits, the storage is freed.
Είναι επίσης ο λόγος που ένα μακροπρόθεσμα τρέχον πρόγραμμα μπορεί να συνεχίσει να γράφει σε ένα αρχείο καταγραφής του οποίου το όνομα έχει αφαιρεθεί με unlink από τον διαχειριστή - οι εγγραφές πετυχαίνουν, αλλά τίποτα στον δίσκο δεν είναι ορατό κάτω από το παλιό όνομα. Η df θα αναφέρει τον χώρο ως χρησιμοποιούμενο μέχρι να κλείσει το handle.
Symbolic links#
Αν ένα όνομα στη LIST είναι symbolic link, η unlink αφαιρεί το ίδιο το link, όχι το αρχείο στο οποίο δείχνει. Ο στόχος μένει ανέπαφος ακόμη και αν το link είναι κρεμασμένο ή δείχνει σε κατάλογο. Αυτό ταιριάζει με την κλήση συστήματος unlink(2) και είναι σχεδόν πάντα αυτό που θέλετε· χρησιμοποιήστε πρώτα την readlink αν χρειάζεστε συγκεκριμένα να ενεργήσετε στον στόχο.
Παραδείγματα#
Αφαίρεση ενός αρχείου, έλεγχος του αποτελέσματος:
unlink $path
or die "cannot remove $path: $!";
Αφαίρεση πολλών και αναφορά του απολογισμού:
my @files = glob "*.tmp";
my $gone = unlink @files;
warn "removed $gone of ", scalar @files, " files\n"
if $gone != @files;
Διαγνωστικά ανά αρχείο (ο μόνος αξιόπιστος τρόπος για να ξέρετε ποιο όνομα απέτυχε):
my @failed;
for my $f (@goners) {
unlink $f or push @failed, "$f: $!";
}
die "unlink failures:\n", join("\n", @failed), "\n" if @failed;
Στηριχθείτε στην $_ σε αλυσίδα ελέγχων αρχείων:
for (glob "*.bak") {
next unless -f && -M _ > 30; # older than 30 days
unlink or warn "skip $_: $!";
}
Αυτο-καθαριζόμενο αρχείο εργασίας (ιδίωμα POSIX unlink-while-open):
open my $scratch, "+>", "/tmp/work.$$" or die $!;
unlink "/tmp/work.$$" or die $!;
# write through $scratch, no cleanup needed on exit
Οριακές περιπτώσεις#
Κενή
LIST: ηunlink ()επιστρέφει0και δεν αγγίζει την$!. Το πέρασμα κενού πίνακα συμπεριφέρεται με τον ίδιο τρόπο.Ανύπαρκτο όνομα: επιστρέφει
0για εκείνη την εγγραφή και θέτει την$!σεENOENT. Η υπόλοιπη λίστα εξακολουθεί να επεξεργάζεται.Άρνηση δικαιωμάτων: η
unlink(2)ελέγχει το δικαίωμα εγγραφής στον περιέχοντα κατάλογο, όχι στο ίδιο το αρχείο. Η αφαίρεση αρχείου στο οποίο δεν μπορείτε να γράψετε επιτρέπεται όσο μπορείτε να γράψετε στον γονικό του κατάλογο· η αφαίρεση αρχείου που σας ανήκει σε κατάλογο όπου δεν μπορείτε να γράψετε όχι. Το$!θα είναιEACCESήEPERM.Sticky κατάλογοι (
/tmp, mode1777): χρήστες χωρίς root μπορούν να αφαιρέσουν μόνο ονόματα που τους ανήκουν. Οι αποτυχίες εμφανίζονται ωςEPERM.Τιμή επιστροφής σε λογικό περιβάλλον: η
unlink @files or dieενεργοποιείται μόνο όταν απέτυχε κάθε όνομα (το πλήθος είναι0). Για να τερματίσετε σε οποιαδήποτε αποτυχία, συγκρίνετε μεscalar @filesή χρησιμοποιήστε τον βρόχο ανά αρχείο.Απασχολημένο αρχείο σε Linux: το Linux δεν αποτρέπει την
unlinkαρχείου που είναι mmap’ed, υπό εκτέλεση ή ανοιχτό - το όνομα αφαιρείται και ισχύει η σημασιολογία POSIX παραπάνω. Άλλα λειτουργικά συστήματα μπορεί να επιστρέψουνETXTBSYήEBUSY· αυτή η σελίδα καλύπτει το Linux.Taint mode: ονόματα προερχόμενα από tainted δεδομένα επιτρέπονται ως τελούμενα της
unlink· δείτε τοperlsecγια τις συνήθεις προειδοποιήσεις σχετικά με την αποδοχή μη έμπιστων διαδρομών.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
rmdir- αφαιρεί έναν κενό κατάλογο· το σωστό εργαλείο όταν το όνομα αναφέρεται σε εγγραφή καταλόγου τύπουDIRrename- μετακινεί ή ανασυνδέει ένα όνομα χωρίς να το απορρίψει, συχνά σε συνδυασμό μεunlinkκατά την ατομική αντικατάσταση αρχείουlink- δημιουργεί επιπλέον σκληρό σύνδεσμο σε αρχείο· ηunlinkείναι το αντίστροφό της για ένα όνομα τη φοράsymlink- δημιουργεί symbolic link· σημειώστε ότι ηunlinkαφαιρεί το ίδιο το symlink, όχι τον στόχο τουtruncate- συρρικνώνει αρχείο επιτόπια χωρίς να εκτελέσει unlink όταν θέλετε να ξαναχρησιμοποιήσετε το όνομα