mv

mv moves files and directories from one place to another. Moving a file within the same directory, under a new name, is how you rename it.

mv [options] source dest
mv [options] source... directory
mv [options] -t directory source...
$ mv draft.txt report.txt                 # rename
$ mv report.txt notes.txt /home/jack/done/ # move into a directory

A move is either a rename or a copy-and-delete #

mv does its job in one of two ways, and which one decides what happens to the file's security.

Within one file system, a move is a rename. Nothing is copied: the file stays exactly where it physically is, and only its name and directory entry change. The file keeps its inode, and so it keeps its security descriptor unchanged — every owner, access rule, audit rule, and timestamp is exactly as before. A rename does not re-evaluate inheritance; a file does not pick up new rules just because it landed in a new directory.

Across file systems, a move is a copy followed by a delete. When the destination is on a different file system, mv cannot just rename — it copies the data to a new file on the destination, then removes the original. That new file is a genuinely new object, so, exactly as with cp, it gets a fresh security descriptor inherited from the destination directory unless you ask otherwise.

So: rename a file and its security is untouched; move it to another file system and the copy starts fresh.

Preserving security on a cross-file-system move #

For the copy-and-delete case, mv carries the same --preserve family that cp does — an identical set of options, behaving the same way. They let a cross-file-system move carry the source's owner, access rules, timestamps, and other attributes onto the new file instead of taking the destination directory's inherited default.

The full --preserve reference — the attribute list, --sd, --sd-explicit, --preserve-all, --no-preserve, and what happens when a preserve cannot be honoured — is on the cp page. Everything there applies to mv unchanged.

On a same-file-system move the --preserve options have nothing to do: a rename already keeps every attribute, because it is the same file.

Overwriting an existing destination #

By default mv overwrites an existing destination. These options change that. When more than one of -i, -f, -n is given, the last one wins.

OptionEffect
-i, --interactiveAsk before overwriting an existing file.
-f, --forceDo not prompt before overwriting.
-n, --no-clobberNever overwrite an existing file.
-u, --update[=WHICH]Overwrite only when the source is newer. WHICH can be all, none, or older.
-b, --backup[=CONTROL]Make a backup of the destination before overwriting it.

Other options #

OptionEffect
-t, --target-directory=DIRMove every source into DIR.
-T, --no-target-directoryTreat dest as a plain file even if it is a directory.
--strip-trailing-slashesStrip any trailing slashes from each source argument.
-v, --verbosePrint each file as it is moved.
--debugExplain in detail how each file was moved. Implies -v.
--progressShow a progress bar.

Exit status #

CodeMeaning
0Every file was moved successfully.
1A file could not be moved.

Edit this page