How does the mv command work with external drives? The Next CEO of Stack OverflowHow can the 'mail' command be used?How can I remove the Mac recovery partition from an external drive?How do I write-protect a partition of a USB drive on OSX that can work cross-platform?Fixing my external hard drive's partition mapExternal hard drive : Problems were found with the partition mapIs it possible or likely for malware or a virus to be transferred by plugging a USB hard drive into my Mac?can i use migration assistant to migrate files to a secondary drive?Mounting an external hard disk clone that shares the same partition GUIDs as the source/host hard diskMake Time Machine use two drives from TerminalWhat is the most efficient and reliable method for transfering/copying a large number of files from one external hard drive to another?

Received an invoice from my ex-employer billing me for training

How to subset dataframe based on a "not equal to" criteria applied to a large number of columns?

What can we do to stop prior company from asking us questions?

How do we know the LHC results are robust?

Would a galaxy be visible from outside, but nearby?

On model categories where every object is bifibrant

How to count occurrences of text in a file?

Between two walls

Help understanding this unsettling image of Titan, Epimetheus, and Saturn's rings?

What flight has the highest ratio of time difference to flight time?

Can I equip Skullclamp on a creature I am sacrificing?

How can I get through very long and very dry, but also very useful technical documents when learning a new tool?

Why do airplanes bank sharply to the right after air-to-air refueling?

Different harmonic changes implied by a simple descending scale

Do I need to enable Dev Hub in my PROD Org?

What exact does MIB represent in SNMP? How is it different from OID?

What does "Its cash flow is deeply negative" mean?

Why am I allowed to create multiple unique pointers from a single object?

Is it ever safe to open a suspicious html file (e.g. email attachment)?

Is it professional to write unrelated content in an almost-empty email?

At which OSI layer a user-generated data resides?

Extending anchors in TikZ

Why did we only see the N-1 starfighters in one film?

How to make a variable always equal to the result of some calculations?



How does the mv command work with external drives?



The Next CEO of Stack OverflowHow can the 'mail' command be used?How can I remove the Mac recovery partition from an external drive?How do I write-protect a partition of a USB drive on OSX that can work cross-platform?Fixing my external hard drive's partition mapExternal hard drive : Problems were found with the partition mapIs it possible or likely for malware or a virus to be transferred by plugging a USB hard drive into my Mac?can i use migration assistant to migrate files to a secondary drive?Mounting an external hard disk clone that shares the same partition GUIDs as the source/host hard diskMake Time Machine use two drives from TerminalWhat is the most efficient and reliable method for transfering/copying a large number of files from one external hard drive to another?










1















On the same drive I assume it would change something like a FAT table to repoint to the location of files.



Question



When going to a different drive (maybe even partition) does the mv command first copy, then remove the old files - in order to prevent data loss if an exception occured ?










share|improve this question


























    1















    On the same drive I assume it would change something like a FAT table to repoint to the location of files.



    Question



    When going to a different drive (maybe even partition) does the mv command first copy, then remove the old files - in order to prevent data loss if an exception occured ?










    share|improve this question
























      1












      1








      1








      On the same drive I assume it would change something like a FAT table to repoint to the location of files.



      Question



      When going to a different drive (maybe even partition) does the mv command first copy, then remove the old files - in order to prevent data loss if an exception occured ?










      share|improve this question














      On the same drive I assume it would change something like a FAT table to repoint to the location of files.



      Question



      When going to a different drive (maybe even partition) does the mv command first copy, then remove the old files - in order to prevent data loss if an exception occured ?







      macos command-line external-disk






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked 1 hour ago









      JacksonkrJacksonkr

      15218




      15218




















          2 Answers
          2






          active

          oldest

          votes


















          3














          OS X's mv is based on the BSD source code. You can find the source code to the mv command online. Using https://github.com/freebsd/freebsd/blob/master/bin/mv/mv.c as a reference, you can see that they do indeed first try to rename the file and then if it is crossing filesystems, it does a cp followed by a rm.



           /*
          * If rename fails because we're trying to cross devices, and
          * it's a regular file, do the copy internally; otherwise, use
          * cp and rm.
          */
          if (lstat(from, &sb))
          warn("%s", from);
          return (1);

          return (S_ISREG(sb.st_mode) ?
          fastcopy(from, to, &sb) : copy(from, to));
          }





          share|improve this answer























          • The source code snippet you link to actually do not have something to do with the detecting a cross-filesystem move or actually doing a cp followed by a rm. It is only the comment that describes this behavior - the actual code for it is really before the comment. The code after the comment already assumes that it is a cross-device move, and determines whether the source is a regular file to be copied internally, or something else that is moved using calls to the external programs cp and mv.

            – jksoegaard
            1 hour ago











          • @jksoegaard - Correct. I was highlighting the section of code from the linked source code that directly addressed the question being posed.

            – ParanoidGeek
            13 mins ago


















          1














          Yes, you're right in thinking that moving a single file on the same file system is really just implemented as a rename operating that the file system structure is changed to update the new name/location of the file, but the file contents are not read/written to the drive again.



          When the move happens across two different file systems (drives or partitions), then the mv commands first deletes the destination (if there were an old file there already), copies over the contents of the file to the destination and then finally removes the source file.



          The behavior is explained in the manual for mv on macOS:




          As the rename(2) call does not work across file systems, mv uses cp(1) and rm(1) to accomplish the move. The effect is equivalent to:



          rm -f destination_path &&



          cp -pRP source_file destination &&



          rm -rf source_file




          In regards to the other answer that compares this behavior with the FreeBSD source code - the mv command on macOS is actually a bit different than on FreeBSD. In particular it makes sure that extended attributes and resource forks are moved over correctly and do not disappear when moving across file system boundaries.



          You can read the actual macOS source for mv here:



          https://opensource.apple.com/source/file_cmds/file_cmds-272.220.1/mv/mv.c.auto.html



          You'll see that it is similar in structure as the FreeBSD version, but contains various Apple specific enhancement. In addition to the functionality regarding extended attributes and resource forks as described above, it also has performance enhancements for use with Xsan (distributed file system).



          You'll find in the code that first a rename is attempted:



          if (!rename(from, to)) 
          if (vflg)
          printf("%s -> %sn", from, to);
          return (0);



          If this rename() fails, the code checks why it failed. Especially it checks for the error number EXDEV, which means that the rename would have crossed file systems, and thus cannot be done:



          if (errno == EXDEV) 
          struct statfs sfs;
          char path[PATH_MAX];

          /* Can't mv(1) a mount point. */
          if (realpath(from, path) == NULL)
          warnx("cannot resolve %s: %s", from, path);
          return (1);

          if (!statfs(path, &sfs) && !strcmp(path, sfs.f_mntonname))
          warnx("cannot rename a mount point");
          return (1);

          else
          warn("rename %s to %s", from, to);
          return (1);



          Note here that this code aborts the move in case that the source contains unresolvable symbolic links, or if it is actually a mount point - and also generally if the rename() fails for other reasons than EXDEV.



          Only in case that rename() fails with error number EXDEV, and not for the above mentioned reasons, the following code is run:



          /*
          * If rename fails because we're trying to cross devices, and
          * it's a regular file, do the copy internally; otherwise, use
          * cp and rm.
          */
          if (lstat(from, &sb))
          warn("%s", from);
          return (1);

          return (S_ISREG(sb.st_mode) ?
          fastcopy(from, to, &sb) : copy(from, to));


          This code branches out to do the move between file systems in two different ways depending on whether or not the source to be moved is actually a regular file - or it is something else. "Something else" is usually a directory, a symbolic link, a device node or similar.



          In case of a regular file, it uses fastcopy() which simply opens the source and destion files, read()s the data from the source and write()s them to the destination. Unlike the FreeBSD version, the fastcopy() function uses fcopyfile() to copy over ACLs and extended attributes from the source to the destination.



          In case of something that is not a regular file, it simply spawns external commands to perform the move: "cp" for copying and "rm" for deleting.






          share|improve this answer

























            Your Answer








            StackExchange.ready(function()
            var channelOptions =
            tags: "".split(" "),
            id: "118"
            ;
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function()
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled)
            StackExchange.using("snippets", function()
            createEditor();
            );

            else
            createEditor();

            );

            function createEditor()
            StackExchange.prepareEditor(
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: false,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: null,
            bindNavPrevention: true,
            postfix: "",
            imageUploader:
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            ,
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            );



            );













            draft saved

            draft discarded


















            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fapple.stackexchange.com%2fquestions%2f355169%2fhow-does-the-mv-command-work-with-external-drives%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown

























            2 Answers
            2






            active

            oldest

            votes








            2 Answers
            2






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            3














            OS X's mv is based on the BSD source code. You can find the source code to the mv command online. Using https://github.com/freebsd/freebsd/blob/master/bin/mv/mv.c as a reference, you can see that they do indeed first try to rename the file and then if it is crossing filesystems, it does a cp followed by a rm.



             /*
            * If rename fails because we're trying to cross devices, and
            * it's a regular file, do the copy internally; otherwise, use
            * cp and rm.
            */
            if (lstat(from, &sb))
            warn("%s", from);
            return (1);

            return (S_ISREG(sb.st_mode) ?
            fastcopy(from, to, &sb) : copy(from, to));
            }





            share|improve this answer























            • The source code snippet you link to actually do not have something to do with the detecting a cross-filesystem move or actually doing a cp followed by a rm. It is only the comment that describes this behavior - the actual code for it is really before the comment. The code after the comment already assumes that it is a cross-device move, and determines whether the source is a regular file to be copied internally, or something else that is moved using calls to the external programs cp and mv.

              – jksoegaard
              1 hour ago











            • @jksoegaard - Correct. I was highlighting the section of code from the linked source code that directly addressed the question being posed.

              – ParanoidGeek
              13 mins ago















            3














            OS X's mv is based on the BSD source code. You can find the source code to the mv command online. Using https://github.com/freebsd/freebsd/blob/master/bin/mv/mv.c as a reference, you can see that they do indeed first try to rename the file and then if it is crossing filesystems, it does a cp followed by a rm.



             /*
            * If rename fails because we're trying to cross devices, and
            * it's a regular file, do the copy internally; otherwise, use
            * cp and rm.
            */
            if (lstat(from, &sb))
            warn("%s", from);
            return (1);

            return (S_ISREG(sb.st_mode) ?
            fastcopy(from, to, &sb) : copy(from, to));
            }





            share|improve this answer























            • The source code snippet you link to actually do not have something to do with the detecting a cross-filesystem move or actually doing a cp followed by a rm. It is only the comment that describes this behavior - the actual code for it is really before the comment. The code after the comment already assumes that it is a cross-device move, and determines whether the source is a regular file to be copied internally, or something else that is moved using calls to the external programs cp and mv.

              – jksoegaard
              1 hour ago











            • @jksoegaard - Correct. I was highlighting the section of code from the linked source code that directly addressed the question being posed.

              – ParanoidGeek
              13 mins ago













            3












            3








            3







            OS X's mv is based on the BSD source code. You can find the source code to the mv command online. Using https://github.com/freebsd/freebsd/blob/master/bin/mv/mv.c as a reference, you can see that they do indeed first try to rename the file and then if it is crossing filesystems, it does a cp followed by a rm.



             /*
            * If rename fails because we're trying to cross devices, and
            * it's a regular file, do the copy internally; otherwise, use
            * cp and rm.
            */
            if (lstat(from, &sb))
            warn("%s", from);
            return (1);

            return (S_ISREG(sb.st_mode) ?
            fastcopy(from, to, &sb) : copy(from, to));
            }





            share|improve this answer













            OS X's mv is based on the BSD source code. You can find the source code to the mv command online. Using https://github.com/freebsd/freebsd/blob/master/bin/mv/mv.c as a reference, you can see that they do indeed first try to rename the file and then if it is crossing filesystems, it does a cp followed by a rm.



             /*
            * If rename fails because we're trying to cross devices, and
            * it's a regular file, do the copy internally; otherwise, use
            * cp and rm.
            */
            if (lstat(from, &sb))
            warn("%s", from);
            return (1);

            return (S_ISREG(sb.st_mode) ?
            fastcopy(from, to, &sb) : copy(from, to));
            }






            share|improve this answer












            share|improve this answer



            share|improve this answer










            answered 1 hour ago









            ParanoidGeekParanoidGeek

            25114




            25114












            • The source code snippet you link to actually do not have something to do with the detecting a cross-filesystem move or actually doing a cp followed by a rm. It is only the comment that describes this behavior - the actual code for it is really before the comment. The code after the comment already assumes that it is a cross-device move, and determines whether the source is a regular file to be copied internally, or something else that is moved using calls to the external programs cp and mv.

              – jksoegaard
              1 hour ago











            • @jksoegaard - Correct. I was highlighting the section of code from the linked source code that directly addressed the question being posed.

              – ParanoidGeek
              13 mins ago

















            • The source code snippet you link to actually do not have something to do with the detecting a cross-filesystem move or actually doing a cp followed by a rm. It is only the comment that describes this behavior - the actual code for it is really before the comment. The code after the comment already assumes that it is a cross-device move, and determines whether the source is a regular file to be copied internally, or something else that is moved using calls to the external programs cp and mv.

              – jksoegaard
              1 hour ago











            • @jksoegaard - Correct. I was highlighting the section of code from the linked source code that directly addressed the question being posed.

              – ParanoidGeek
              13 mins ago
















            The source code snippet you link to actually do not have something to do with the detecting a cross-filesystem move or actually doing a cp followed by a rm. It is only the comment that describes this behavior - the actual code for it is really before the comment. The code after the comment already assumes that it is a cross-device move, and determines whether the source is a regular file to be copied internally, or something else that is moved using calls to the external programs cp and mv.

            – jksoegaard
            1 hour ago





            The source code snippet you link to actually do not have something to do with the detecting a cross-filesystem move or actually doing a cp followed by a rm. It is only the comment that describes this behavior - the actual code for it is really before the comment. The code after the comment already assumes that it is a cross-device move, and determines whether the source is a regular file to be copied internally, or something else that is moved using calls to the external programs cp and mv.

            – jksoegaard
            1 hour ago













            @jksoegaard - Correct. I was highlighting the section of code from the linked source code that directly addressed the question being posed.

            – ParanoidGeek
            13 mins ago





            @jksoegaard - Correct. I was highlighting the section of code from the linked source code that directly addressed the question being posed.

            – ParanoidGeek
            13 mins ago













            1














            Yes, you're right in thinking that moving a single file on the same file system is really just implemented as a rename operating that the file system structure is changed to update the new name/location of the file, but the file contents are not read/written to the drive again.



            When the move happens across two different file systems (drives or partitions), then the mv commands first deletes the destination (if there were an old file there already), copies over the contents of the file to the destination and then finally removes the source file.



            The behavior is explained in the manual for mv on macOS:




            As the rename(2) call does not work across file systems, mv uses cp(1) and rm(1) to accomplish the move. The effect is equivalent to:



            rm -f destination_path &&



            cp -pRP source_file destination &&



            rm -rf source_file




            In regards to the other answer that compares this behavior with the FreeBSD source code - the mv command on macOS is actually a bit different than on FreeBSD. In particular it makes sure that extended attributes and resource forks are moved over correctly and do not disappear when moving across file system boundaries.



            You can read the actual macOS source for mv here:



            https://opensource.apple.com/source/file_cmds/file_cmds-272.220.1/mv/mv.c.auto.html



            You'll see that it is similar in structure as the FreeBSD version, but contains various Apple specific enhancement. In addition to the functionality regarding extended attributes and resource forks as described above, it also has performance enhancements for use with Xsan (distributed file system).



            You'll find in the code that first a rename is attempted:



            if (!rename(from, to)) 
            if (vflg)
            printf("%s -> %sn", from, to);
            return (0);



            If this rename() fails, the code checks why it failed. Especially it checks for the error number EXDEV, which means that the rename would have crossed file systems, and thus cannot be done:



            if (errno == EXDEV) 
            struct statfs sfs;
            char path[PATH_MAX];

            /* Can't mv(1) a mount point. */
            if (realpath(from, path) == NULL)
            warnx("cannot resolve %s: %s", from, path);
            return (1);

            if (!statfs(path, &sfs) && !strcmp(path, sfs.f_mntonname))
            warnx("cannot rename a mount point");
            return (1);

            else
            warn("rename %s to %s", from, to);
            return (1);



            Note here that this code aborts the move in case that the source contains unresolvable symbolic links, or if it is actually a mount point - and also generally if the rename() fails for other reasons than EXDEV.



            Only in case that rename() fails with error number EXDEV, and not for the above mentioned reasons, the following code is run:



            /*
            * If rename fails because we're trying to cross devices, and
            * it's a regular file, do the copy internally; otherwise, use
            * cp and rm.
            */
            if (lstat(from, &sb))
            warn("%s", from);
            return (1);

            return (S_ISREG(sb.st_mode) ?
            fastcopy(from, to, &sb) : copy(from, to));


            This code branches out to do the move between file systems in two different ways depending on whether or not the source to be moved is actually a regular file - or it is something else. "Something else" is usually a directory, a symbolic link, a device node or similar.



            In case of a regular file, it uses fastcopy() which simply opens the source and destion files, read()s the data from the source and write()s them to the destination. Unlike the FreeBSD version, the fastcopy() function uses fcopyfile() to copy over ACLs and extended attributes from the source to the destination.



            In case of something that is not a regular file, it simply spawns external commands to perform the move: "cp" for copying and "rm" for deleting.






            share|improve this answer





























              1














              Yes, you're right in thinking that moving a single file on the same file system is really just implemented as a rename operating that the file system structure is changed to update the new name/location of the file, but the file contents are not read/written to the drive again.



              When the move happens across two different file systems (drives or partitions), then the mv commands first deletes the destination (if there were an old file there already), copies over the contents of the file to the destination and then finally removes the source file.



              The behavior is explained in the manual for mv on macOS:




              As the rename(2) call does not work across file systems, mv uses cp(1) and rm(1) to accomplish the move. The effect is equivalent to:



              rm -f destination_path &&



              cp -pRP source_file destination &&



              rm -rf source_file




              In regards to the other answer that compares this behavior with the FreeBSD source code - the mv command on macOS is actually a bit different than on FreeBSD. In particular it makes sure that extended attributes and resource forks are moved over correctly and do not disappear when moving across file system boundaries.



              You can read the actual macOS source for mv here:



              https://opensource.apple.com/source/file_cmds/file_cmds-272.220.1/mv/mv.c.auto.html



              You'll see that it is similar in structure as the FreeBSD version, but contains various Apple specific enhancement. In addition to the functionality regarding extended attributes and resource forks as described above, it also has performance enhancements for use with Xsan (distributed file system).



              You'll find in the code that first a rename is attempted:



              if (!rename(from, to)) 
              if (vflg)
              printf("%s -> %sn", from, to);
              return (0);



              If this rename() fails, the code checks why it failed. Especially it checks for the error number EXDEV, which means that the rename would have crossed file systems, and thus cannot be done:



              if (errno == EXDEV) 
              struct statfs sfs;
              char path[PATH_MAX];

              /* Can't mv(1) a mount point. */
              if (realpath(from, path) == NULL)
              warnx("cannot resolve %s: %s", from, path);
              return (1);

              if (!statfs(path, &sfs) && !strcmp(path, sfs.f_mntonname))
              warnx("cannot rename a mount point");
              return (1);

              else
              warn("rename %s to %s", from, to);
              return (1);



              Note here that this code aborts the move in case that the source contains unresolvable symbolic links, or if it is actually a mount point - and also generally if the rename() fails for other reasons than EXDEV.



              Only in case that rename() fails with error number EXDEV, and not for the above mentioned reasons, the following code is run:



              /*
              * If rename fails because we're trying to cross devices, and
              * it's a regular file, do the copy internally; otherwise, use
              * cp and rm.
              */
              if (lstat(from, &sb))
              warn("%s", from);
              return (1);

              return (S_ISREG(sb.st_mode) ?
              fastcopy(from, to, &sb) : copy(from, to));


              This code branches out to do the move between file systems in two different ways depending on whether or not the source to be moved is actually a regular file - or it is something else. "Something else" is usually a directory, a symbolic link, a device node or similar.



              In case of a regular file, it uses fastcopy() which simply opens the source and destion files, read()s the data from the source and write()s them to the destination. Unlike the FreeBSD version, the fastcopy() function uses fcopyfile() to copy over ACLs and extended attributes from the source to the destination.



              In case of something that is not a regular file, it simply spawns external commands to perform the move: "cp" for copying and "rm" for deleting.






              share|improve this answer



























                1












                1








                1







                Yes, you're right in thinking that moving a single file on the same file system is really just implemented as a rename operating that the file system structure is changed to update the new name/location of the file, but the file contents are not read/written to the drive again.



                When the move happens across two different file systems (drives or partitions), then the mv commands first deletes the destination (if there were an old file there already), copies over the contents of the file to the destination and then finally removes the source file.



                The behavior is explained in the manual for mv on macOS:




                As the rename(2) call does not work across file systems, mv uses cp(1) and rm(1) to accomplish the move. The effect is equivalent to:



                rm -f destination_path &&



                cp -pRP source_file destination &&



                rm -rf source_file




                In regards to the other answer that compares this behavior with the FreeBSD source code - the mv command on macOS is actually a bit different than on FreeBSD. In particular it makes sure that extended attributes and resource forks are moved over correctly and do not disappear when moving across file system boundaries.



                You can read the actual macOS source for mv here:



                https://opensource.apple.com/source/file_cmds/file_cmds-272.220.1/mv/mv.c.auto.html



                You'll see that it is similar in structure as the FreeBSD version, but contains various Apple specific enhancement. In addition to the functionality regarding extended attributes and resource forks as described above, it also has performance enhancements for use with Xsan (distributed file system).



                You'll find in the code that first a rename is attempted:



                if (!rename(from, to)) 
                if (vflg)
                printf("%s -> %sn", from, to);
                return (0);



                If this rename() fails, the code checks why it failed. Especially it checks for the error number EXDEV, which means that the rename would have crossed file systems, and thus cannot be done:



                if (errno == EXDEV) 
                struct statfs sfs;
                char path[PATH_MAX];

                /* Can't mv(1) a mount point. */
                if (realpath(from, path) == NULL)
                warnx("cannot resolve %s: %s", from, path);
                return (1);

                if (!statfs(path, &sfs) && !strcmp(path, sfs.f_mntonname))
                warnx("cannot rename a mount point");
                return (1);

                else
                warn("rename %s to %s", from, to);
                return (1);



                Note here that this code aborts the move in case that the source contains unresolvable symbolic links, or if it is actually a mount point - and also generally if the rename() fails for other reasons than EXDEV.



                Only in case that rename() fails with error number EXDEV, and not for the above mentioned reasons, the following code is run:



                /*
                * If rename fails because we're trying to cross devices, and
                * it's a regular file, do the copy internally; otherwise, use
                * cp and rm.
                */
                if (lstat(from, &sb))
                warn("%s", from);
                return (1);

                return (S_ISREG(sb.st_mode) ?
                fastcopy(from, to, &sb) : copy(from, to));


                This code branches out to do the move between file systems in two different ways depending on whether or not the source to be moved is actually a regular file - or it is something else. "Something else" is usually a directory, a symbolic link, a device node or similar.



                In case of a regular file, it uses fastcopy() which simply opens the source and destion files, read()s the data from the source and write()s them to the destination. Unlike the FreeBSD version, the fastcopy() function uses fcopyfile() to copy over ACLs and extended attributes from the source to the destination.



                In case of something that is not a regular file, it simply spawns external commands to perform the move: "cp" for copying and "rm" for deleting.






                share|improve this answer















                Yes, you're right in thinking that moving a single file on the same file system is really just implemented as a rename operating that the file system structure is changed to update the new name/location of the file, but the file contents are not read/written to the drive again.



                When the move happens across two different file systems (drives or partitions), then the mv commands first deletes the destination (if there were an old file there already), copies over the contents of the file to the destination and then finally removes the source file.



                The behavior is explained in the manual for mv on macOS:




                As the rename(2) call does not work across file systems, mv uses cp(1) and rm(1) to accomplish the move. The effect is equivalent to:



                rm -f destination_path &&



                cp -pRP source_file destination &&



                rm -rf source_file




                In regards to the other answer that compares this behavior with the FreeBSD source code - the mv command on macOS is actually a bit different than on FreeBSD. In particular it makes sure that extended attributes and resource forks are moved over correctly and do not disappear when moving across file system boundaries.



                You can read the actual macOS source for mv here:



                https://opensource.apple.com/source/file_cmds/file_cmds-272.220.1/mv/mv.c.auto.html



                You'll see that it is similar in structure as the FreeBSD version, but contains various Apple specific enhancement. In addition to the functionality regarding extended attributes and resource forks as described above, it also has performance enhancements for use with Xsan (distributed file system).



                You'll find in the code that first a rename is attempted:



                if (!rename(from, to)) 
                if (vflg)
                printf("%s -> %sn", from, to);
                return (0);



                If this rename() fails, the code checks why it failed. Especially it checks for the error number EXDEV, which means that the rename would have crossed file systems, and thus cannot be done:



                if (errno == EXDEV) 
                struct statfs sfs;
                char path[PATH_MAX];

                /* Can't mv(1) a mount point. */
                if (realpath(from, path) == NULL)
                warnx("cannot resolve %s: %s", from, path);
                return (1);

                if (!statfs(path, &sfs) && !strcmp(path, sfs.f_mntonname))
                warnx("cannot rename a mount point");
                return (1);

                else
                warn("rename %s to %s", from, to);
                return (1);



                Note here that this code aborts the move in case that the source contains unresolvable symbolic links, or if it is actually a mount point - and also generally if the rename() fails for other reasons than EXDEV.



                Only in case that rename() fails with error number EXDEV, and not for the above mentioned reasons, the following code is run:



                /*
                * If rename fails because we're trying to cross devices, and
                * it's a regular file, do the copy internally; otherwise, use
                * cp and rm.
                */
                if (lstat(from, &sb))
                warn("%s", from);
                return (1);

                return (S_ISREG(sb.st_mode) ?
                fastcopy(from, to, &sb) : copy(from, to));


                This code branches out to do the move between file systems in two different ways depending on whether or not the source to be moved is actually a regular file - or it is something else. "Something else" is usually a directory, a symbolic link, a device node or similar.



                In case of a regular file, it uses fastcopy() which simply opens the source and destion files, read()s the data from the source and write()s them to the destination. Unlike the FreeBSD version, the fastcopy() function uses fcopyfile() to copy over ACLs and extended attributes from the source to the destination.



                In case of something that is not a regular file, it simply spawns external commands to perform the move: "cp" for copying and "rm" for deleting.







                share|improve this answer














                share|improve this answer



                share|improve this answer








                edited 1 hour ago

























                answered 1 hour ago









                jksoegaardjksoegaard

                19.8k2150




                19.8k2150



























                    draft saved

                    draft discarded
















































                    Thanks for contributing an answer to Ask Different!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid


                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.

                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function ()
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fapple.stackexchange.com%2fquestions%2f355169%2fhow-does-the-mv-command-work-with-external-drives%23new-answer', 'question_page');

                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Благоевград Съдържание География | История | Население | Политика | Икономика и инфрастуктура | Здравеопазване | Образование и наука | Култура и забавления | Забележителности | Личности | Литература | Външни препратки | Бележки | Навигация42°01′18.99″ с. ш. 23°05′51″ и. д. / 42.021944° с. ш. 23.0975° и. д.*БлагоевградразширитередактиранеОфициален уебсайт на община БлагоевградНовинарски портал на Благоевград – blagoevgrad.euСайтове за БлагоевградНационален статистически институтdariknews.bgГригоровичъ, Викторъ. „Очеркъ путешествія по Европейской Турціи“. Москва, 1877.Стрезов, Георги. Два санджака от Източна Македония. Периодично списание на Българското книжовно дружество в Средец, кн. XXXVII и XXXVIII, 1891, стр. 18 – 19.Македония. Етнография и статистикаГаджанов, Димитър Г. Мюсюлманското население в Новоосвободените земи, в: Научна експедиция в Македония и Поморавието 1916, Военноиздателски комплекс „Св. Георги Победоносец“, Университетско издателство „Св. Климент Охридски“, София, 1993, стр. 244.паметник на незнайния четник&cd=18&hl=en&ct=clnk&client=firefox-a „История на днешен Благоевград“, взето от www.museumblg.com на 16 март 2010 г.„Справка за населението на град Благоевград, община Благоевград, област Благоевград, НСИ“„The population of all towns and villages in Blagoevgrad Province with 50 inhabitants or more according to census results and latest official estimates“„Ethnic composition, all places: 2011 census“История на Неврокопска епархия.Национален статистически институтМюсюлманско изповедание. Главно мюфтийствоНационален публичен регистър на храмовете в БългарияМюсюлманско изповедание. Главно мюфтийствоwww.dnes.bg Джамията в Благоевград не била паленаwww.sesc-bg.orgСписък на побратимени градовеТехническо побратимяванеГУМ грейва в цветовете на нощен Лас Вегас под името „Largo“, „МОЛ Благоевград“..., в. „Струма“grabo.bgwww.cinemaxbg.comррр4238731-067cad53a-0546-417b-a3d3-51e49b1d2232147736077147736077

                    What is the best defense strategy for Survival in Grand Theft Auto Online?What is JP used for in Grand Theft Auto Online?How do I setup a Crew HQ in Grand Theft Auto Online?How does stealth work in Grand Theft Auto Online?Is it possible to own more than 10 cars in Grand Theft Auto online?Where to find truck/trailers in Grand Theft Auto OnlineWhat are some of the best missions to do on Grand Theft Auto 5 onlineFastest Car in Grand Theft Auto V PCHow to setup a Crew vs Crew online session in Grand Theft Auto Online?Grand theft auto 5 crossplayingRestart Grand Theft Auto V Online?

                    How does Billy Russo acquire his 'Jigsaw' mask? Unicorn Meta Zoo #1: Why another podcast? Announcing the arrival of Valued Associate #679: Cesar Manara Favourite questions and answers from the 1st quarter of 2019Why does Bane wear the mask?Why does Kylo Ren wear a mask?Why did Captain America remove his mask while fighting Batroc the Leaper?How did the OA acquire her wisdom?Is Billy Breckenridge gay?How does Adrian Toomes hide his earnings from the IRS?What is the state of affairs on Nootka Sound by the end of season 1?How did Tia Dalma acquire Captain Barbossa's body?How is one “Deemed Worthy”, to acquire the Greatsword “Dawn”?How did Karen acquire the handgun?