26

If I wanted to stay on the same file system, couldn't I just specify an output path for the same file system?

Or is it to prevent accidentally leaving the current file system?

3
  • 1
    -x in a different context: unix.stackexchange.com/a/358331/30851 but same for cp: -x skips things, if you are migrating filesystems and would like it to be a complete copy, consider mounting in a way that gives you the full picture. Nov 28, 2018 at 13:51
  • 1
    You could ask the same about many flags, eg -i: "why not just specify a destination that doesn't exist"?
    – JigglyNaga
    Nov 28, 2018 at 14:58
  • 1
    @JigglyNaga I was thinking that as well. But -x was not phrased well in the documentation and far less obvious.
    – neverMind9
    Nov 28, 2018 at 18:53

2 Answers 2

60

It limits where files are copied from, not where they’re copied to. It’s useful with recursive copies, to control how cp descends into subdirectories. Thus

cp -xr / blah

will only copy the root file system, not any of the other file systems mounted.

See the cp -x documentation (although its distinction is subtle).

4
  • 3
    Oh yes, you might not want to copy network shares under /mnt. Nor a remote RCS repository mounted under your home drive.
    – mckenzm
    Nov 29, 2018 at 4:23
  • 1
    @mckenzm Also because /mnt is only a human convention sometimes enforced by a distro's setup but not a requirement of the OS. I sometimes have network filesystems mounted under /var/somewebsite/www/sessions to implement load balancing web servers
    – slebetman
    Nov 29, 2018 at 15:00
  • Indeed, this kind of flag prevents accidentally copying huge network shares or removable media that you forgot you had mounted. And you don't need to give --exclude options to manually block each of them. Very useful with rsync.
    – Lassi
    Nov 29, 2018 at 15:08
  • 4
    It also avoids copying file systems such as /dev, /proc, /sys etc. which you typically don’t want to read “en masse”. Nov 29, 2018 at 15:09
29

The -x flag to cp is a GNU extension. When copying a single file, this option will have no effect, but when copying a whole file hierarchy, the -x option prevents the copying of files and directories that do not live on the same filesystem as the original source.

For example, on a filesystem with mount points at /usr and /usr/local, using cp -xR /usr /some-dest would not copy the hierarchy under /usr/local.

There are other utilities with an -x option with similar semantics, such as du and find (the flag is called -xdev for find), and rsync.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.