Προς το περιεχόμενο

mv ερώτηση για σειρά μετακίνησης


Oxygene

Προτεινόμενες αναρτήσεις

Μετακινώ με την εντολή mv έναν φάκελο μεγάλο (ας τον αποκαλέσουμε εδώ ΤΕΣΤ), τόσο σε μέγεθος όσο και σε αριθμό αρχείων/υποφακέλων που περιέχει, από έναν εξωτερικό σκληρό σε έναν άλλο εξωτερικό σκληρό. Παρατηρώ ότι μέσα στον φάκελο ΤΕΣΤ που έχει δημιουργήσει στον σκληρό-προορισμό έχει ήδη μετακινήσει κάποιους υποφακέλους, συμβαίνει όμως το εξής παράξενο: οι υποφάκελοι δεν μεταφέρονται αλφαβητικά. Έτσι λοιπόν έχει μεταφέρει εώς τώρα υποφακέλους οι οποίοι αλφαβητικά βρίσκονται πιο μετά από άλλους υποφακέλους που βρίσκονται ακόμα στον σκληρό-πηγή μέσα στον φάκελο ΤΕΣΤ. Γνωρίζει κάποιος με ποια σειρά μετακινεί η mv αρχεία; Μήπως είναι εντελώς τυχαία;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

έκανα 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.

Επεξ/σία από pmav99
  • Like 1
  • Thanks 2
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Δηλαδή, αν κατάλαβα σωστά, τα αρχεία μετακινούνται με σειρά inode numbers;

BTW, οι δύο εξωτερικοί σκληροί είναι σε ext4

Επεξ/σία από Oxygene
Edit: Όντως με σειρά inode number τα μετακινεί
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Ναι αφού και τα δύο filesystems είναι ext4 το λογικό είναι να τα πηγαίνει με inode numbers.

BTW, τι πρόβλημα είχες; Ή ήταν απλά απορία;

Επεξ/σία από pmav99
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δεν υπάρχει πρόβλημα, αρκεί που τα αρχεία μεταφέρονται. Να φανταστώ ότι τα ίδια ισχύουν και για την cp, ε;

Και κάτι ακόμα: Υπάρχει τρόπος μεταφοράς/αντιγραφής με αλφαβητική σειρά; Θα μπορούσε να βοηθήσει στο να είναι πιο προβλέψιμη η μεταφορά/αντιγραφή και στην παρακολούθηση της όλης διαδικασίας...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)
Αναφορά σε κείμενο

Να φανταστώ ότι τα ίδια ισχύουν και για την 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

Γενικά έχει πάρα πολλές επιλογές

Επεξ/σία από pmav99
  • Thanks 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Απλά για πληρότητα, και αν το καταλαβαίνω σωστά, η 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».

  • Thanks 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 2 εβδομάδες αργότερα...
Δημοσ. (επεξεργασμένο)

pmav99 αγαπώ σε για τις διαφωτιστικές απαντήσεις. 

μπήκα κατά λάθος στο νήμα και εδώ και 2 ώρες διαβάζω πως γίνεται η μεταφορά αρχείων σε χαμηλό επίπεδο. 

Μερικά τα ήξερα εμπειρικά πχ την λεπτομέρεια για τα inodes, μιας και τα είχα διαβάσει για το Red Hat administrator πριν 2 χρόνια. 

 

edit για το θέμα, για μεταφορά αρχείων απο Α σε Β πάντα rsync   με ένα rm  - r /path/to/A μετά

Επεξ/σία από headbanger
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...