Oxygene Δημοσ. 25 Σεπτεμβρίου 2018 Δημοσ. 25 Σεπτεμβρίου 2018 Μετακινώ με την εντολή mv έναν φάκελο μεγάλο (ας τον αποκαλέσουμε εδώ ΤΕΣΤ), τόσο σε μέγεθος όσο και σε αριθμό αρχείων/υποφακέλων που περιέχει, από έναν εξωτερικό σκληρό σε έναν άλλο εξωτερικό σκληρό. Παρατηρώ ότι μέσα στον φάκελο ΤΕΣΤ που έχει δημιουργήσει στον σκληρό-προορισμό έχει ήδη μετακινήσει κάποιους υποφακέλους, συμβαίνει όμως το εξής παράξενο: οι υποφάκελοι δεν μεταφέρονται αλφαβητικά. Έτσι λοιπόν έχει μεταφέρει εώς τώρα υποφακέλους οι οποίοι αλφαβητικά βρίσκονται πιο μετά από άλλους υποφακέλους που βρίσκονται ακόμα στον σκληρό-πηγή μέσα στον φάκελο ΤΕΣΤ. Γνωρίζει κάποιος με ποια σειρά μετακινεί η mv αρχεία; Μήπως είναι εντελώς τυχαία;
pmav99 Δημοσ. 25 Σεπτεμβρίου 2018 Δημοσ. 25 Σεπτεμβρίου 2018 (επεξεργασμένο) έκανα 2 posts και το forum τα ενώνει. Στο δεύτερο είναι η απάντηση ---------------------------------------------------------------------------------------- tl;dr Αν, είναι πρακτικό το πρόβλημα και έχεις μείνει με μερικά αρχεία στο src και μερικά αρχεία στο dest και ψάχνεις να βγάλεις άκρη, τότε rsync is your friend An όχι, τότε δεν έχω ιδέα και νομίζω ότι θα χρειαστεί είτε να ρωτήσεις IRC/stack-exchange ή να διαβάσεις τον κώδικα των mv/cp ---- Αν δεν κάνω λάθος, αν είσαι εντός του ίδιου filesystem τότε η εντολή mv είναι atomic δηλαδή ή θα πετύχει ολόκληρη ή θα αποτύχει ολόκληρη. Δεν θα έχεις δηλαδή μεταφορά μερικών μόνο αρχείων/φακέλων. Επίσης, εντός του ίδιου filesystem η εντολή mv είναι πρακτικά ένα rename, δεν δημιουργούνται δηλαδή νέα αρχεία (άρα και τα inodes μένουν σταθερά). Πχ mkdir -p src/dir{1,2,3} stat src/dir1 | grep inode mv src dest stat dest/dir1 | grep inode Αν όμως πας να κάνεις μεταφορά σε άλλο filesystem (πχ από το /home στο /tmp το οποίο υποθέτω ότι έχεις σε ramfs) τότε το inode θα είναι διαφορετικό mv dest /tmp stat /tmp/dest/dir1 | grep inode Σχετικά με το πως γίνεται η μεταφορά οι info pages λένε: Αναφορά σε κείμενο $ info mv It first uses some of the same code that’s used by ‘cp -a’ to copy the requested directories and files, then (assuming the copy succeeded) it removes the originals. If the copy fails, then the part that was copied to the destination partition is removed. If you were to copy three directories from one partition to another and the copy of the first directory succeeded, but the second didn’t, the first would be left on the destination partition and the second and third would be left on the original partition. Δεν έχει δηλαδή πληροφορίες σχετικά με τη σειρά που γίνεται η μεταφορά, αλλά λέει ότι χρησιμοποιείται ο κώδικας της cp. Ίσως να βοηθήσει αν τρέξεις τη mv με strace μπροστά (πχ strace mv src dest) ή να δοκιμάσεις να βγάλεις άκρη με τον κώδικα των mv/cp https://github.com/coreutils/coreutils/blob/master/src/mv.c https://github.com/coreutils/coreutils/blob/master/src/cp.c Διάβασε και αυτό: https://superuser.com/questions/259097/what-happens-if-mv-is-interrupted ---------------------------------------------- New answer ---------------------------------------------- Νομίζω το βρήκα. Η mv καλεί την movefile η οποία καλεί την do_move η οποία καλεί την copy η οποία καλεί την copy_internal η οποία καλεί την copy_dir η οποία καλεί την savedir H savedir έχει το εξής signature: /* Return a freshly allocated string containing the file names in directory DIR, separated by '\0' characters; the end is marked by two '\0' characters in a row. Return NULL (setting errno) if DIR cannot be opened, read, or closed. */ char *savedir (char const *, enum savedir_option); H κλήση της savedir που μας ενδιαφέρει είναι η εξής: name_space = savedir (src_name_in, SAVEDIR_SORT_FASTREAD); Τα available savedir_options εξαρτώνται από το αν έχει οριστεί η D_INO_IN_DIRENT: enum savedir_option { SAVEDIR_SORT_NONE, SAVEDIR_SORT_NAME, #if D_INO_IN_DIRENT SAVEDIR_SORT_INODE, SAVEDIR_SORT_FASTREAD = SAVEDIR_SORT_INODE #else SAVEDIR_SORT_FASTREAD = SAVEDIR_SORT_NONE #endif }; Το οποίο σημαίνει ότι όταν δεν έχει οριστεί, τότε δεν υπάρχει κανένα είδος sorting ενώ όταν έχει οριστεί χρησιμοποιούνται τα inode numbers για να καθορίσουν τη σειρά. Προφανώς το D_INO_IN_DIRENT δηλώνει αν το struct dirent περιέχει το d_ino ή όχι αλλά δεν έχω ιδέα πότε δεν συμβαίνει κάτι τέτοιο. Φαντάζομαι ότι θα έχει να κάνει με το filesystem. BTW, νομίζω είναι λογικό να μη γίνεται sorting βάσει του ονόματος γιατί θα έδινε ένα μικρό overhead. Επεξ/σία 25 Σεπτεμβρίου 2018 από pmav99 1 2
Oxygene Δημοσ. 25 Σεπτεμβρίου 2018 Μέλος Δημοσ. 25 Σεπτεμβρίου 2018 (επεξεργασμένο) Δηλαδή, αν κατάλαβα σωστά, τα αρχεία μετακινούνται με σειρά inode numbers; BTW, οι δύο εξωτερικοί σκληροί είναι σε ext4 Επεξ/σία 25 Σεπτεμβρίου 2018 από Oxygene Edit: Όντως με σειρά inode number τα μετακινεί
pmav99 Δημοσ. 25 Σεπτεμβρίου 2018 Δημοσ. 25 Σεπτεμβρίου 2018 (επεξεργασμένο) Ναι αφού και τα δύο filesystems είναι ext4 το λογικό είναι να τα πηγαίνει με inode numbers. BTW, τι πρόβλημα είχες; Ή ήταν απλά απορία; Επεξ/σία 25 Σεπτεμβρίου 2018 από pmav99
Oxygene Δημοσ. 25 Σεπτεμβρίου 2018 Μέλος Δημοσ. 25 Σεπτεμβρίου 2018 Δεν υπάρχει πρόβλημα, αρκεί που τα αρχεία μεταφέρονται. Να φανταστώ ότι τα ίδια ισχύουν και για την cp, ε; Και κάτι ακόμα: Υπάρχει τρόπος μεταφοράς/αντιγραφής με αλφαβητική σειρά; Θα μπορούσε να βοηθήσει στο να είναι πιο προβλέψιμη η μεταφορά/αντιγραφή και στην παρακολούθηση της όλης διαδικασίας...
pmav99 Δημοσ. 25 Σεπτεμβρίου 2018 Δημοσ. 25 Σεπτεμβρίου 2018 (επεξεργασμένο) Αναφορά σε κείμενο Να φανταστώ ότι τα ίδια ισχύουν και για την cp, ε; Φαντάζομαι πως ναι καθώς καλούν τις ίδιες συναρτήσεις Αν χρειάζεσαι κάτι πιο high level, θα σου πρότεινα να χρησιμοποιείς rsync. Το οποίο σου επιτρέπει να διακόψεις και να συνεχίσεις αργότερα, κάνει report για το progress και ελέγχει τα checksums των αντιγραμμένων αρχείων. Πχ κάτι τέτοιο: rsync --archive --no-compress --progress --partial --human-readable --verbose SOURCE DESTINATION Compression χρειάζεται μόνο για remote transfers για αυτό και το έβγαλα. Αν το source ή το destination είναι remotely τότε πάντα --compress Αν τα χρειάζεσαι μπορείς να δώσεις και --hard-links --acls --xattrs Γενικά έχει πάρα πολλές επιλογές Επεξ/σία 25 Σεπτεμβρίου 2018 από pmav99 1
Oxygene Δημοσ. 26 Σεπτεμβρίου 2018 Μέλος Δημοσ. 26 Σεπτεμβρίου 2018 Super διαφωτιστικός, ευχαριστώ πολύ
pmav99 Δημοσ. 27 Σεπτεμβρίου 2018 Δημοσ. 27 Σεπτεμβρίου 2018 Απλά για πληρότητα, και αν το καταλαβαίνω σωστά, η D_INO_IN_DIRENT τελικά δεν πρέπει να έχει να κάνει με το filesystem αλλά με το λειτουργικό. Ο τρόπος με τον οποίο το λειτουργικό αποφασίζει κατά το compilation αν το D_INO_IN_DIRENT έχει οριστεί ή όχι, είναι μέσω αυτού του macro Αναφορά σε κείμενο dirent.h is the header in the C POSIX library for the C programming language that contains constructs that facilitate directory traversing. The function is not part of the C standard, but is considered "pseudo-standard" and is usually portable between platforms. Δηλαδή, ανάλογα με το ποια εκδοχή του *nix χρησιμοποιούμε για να κάνουμε compile τα coreutils υπάρχει περίπτωση το struct dirent το οποίο ορίζεται μέσα στην dirent.h να μην περιέχει το d_ino. Πρακτικά μιλώντας λοιπόν, φαντάζομαι ότι σε linux το d_ino είναι πάντοτε παρόν και κατά συνέπεια η cp και η mv χρησιμοποιούν πάντα το inode number. Προφανώς(;), σε όλα τα filesystems στα οποία υποστηρίζεται write χρησιμοποιείται εξορισμού η ίδια dirent.h που χρησιμοποιεί ο kernel μας και για αυτό και δεν υπάρχουν προβλήματα. ΥΓ. Το dirent βγαίνει από το «directory entry». 1
headbanger Δημοσ. 11 Οκτωβρίου 2018 Δημοσ. 11 Οκτωβρίου 2018 (επεξεργασμένο) pmav99 αγαπώ σε για τις διαφωτιστικές απαντήσεις. μπήκα κατά λάθος στο νήμα και εδώ και 2 ώρες διαβάζω πως γίνεται η μεταφορά αρχείων σε χαμηλό επίπεδο. Μερικά τα ήξερα εμπειρικά πχ την λεπτομέρεια για τα inodes, μιας και τα είχα διαβάσει για το Red Hat administrator πριν 2 χρόνια. edit για το θέμα, για μεταφορά αρχείων απο Α σε Β πάντα rsync με ένα rm - r /path/to/A μετά Επεξ/σία 11 Οκτωβρίου 2018 από headbanger
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα