Home > Articles

  • Print
  • + Share This
This chapter is from the book

Copying and Moving

Course Objectives Covered

  1. Executing Commands at the Command Line (3036)

  2. Common Command Line Tasks (3036)

  1. Copying and Moving Files and Directories (3036)

  2. Creating Directories (3036)

  3. Deleting Files and Directories (3036)

System administration would be so much easier if nothing ever moved or changed. Unfortunately, it is very rare for anything to stay static any more, and changes take place at a nonstop pace. Linux offers two powerful utilities for copying and moving files: cp and mv, respectively, and a third utility—dd—that combines features of both.

cp

cp works with both files and directories and can move multiple entities at a time using wildcards. After the name of the utility, you must specify the source, followed by the target. The simplest use of all can be illustrated as follows:

$ ls -l fileone onefile
ls: onefile: No such file or directory
-rw-r--r--  1  root  root  85  Aug 22 10:26
  fileone
$
$ cp fileone onefile
$ ls -l fileone onefile
-rw-r--r--  1  root  root  85  Aug 22 10:26
  fileone
-rw-r--r--  1  edulaney  users  85  Aug 30 16:18
  onefile
$ 

Notice that the original entry (source) remains unchanged, but now there is a second entry (target) as well. On the second entry, the contents are identical, but the date and time are those of the present (when cp was executed), not those of the source. Notice as well that the owner and group of the new file became that of the user executing the command. This is the same action that would take place if you were creating the target file completely from scratch.

NOTE

To be able to copy a file—create a new entity equal in content to another—you need only read permission to the source.

The -p option can be used to force as many of the old variables to remain the same. It preserves what it can in terms of attributes:

$ ls -l fileone nextfile
ls: nextfile: No such file or directory
-rw-r--r--  1  root  root  85  Aug 22 10:26  fileone
$
$ cp -p fileone nextfile
$ ls -l fileone nextfile
-rw-r--r--  1  root  root  85  Aug 22 10:26
  fileone
-rw-r--r--  1  edulaney  users  85  Aug 22 10:26
  nextfile
$ 

Notice that the date and time associated with the source were kept, but the owner and group still must change.

When you do a copy operation, the utility first checks to see if the source file exists. If it does, whatever file is specified as the target is created (with a size of zero), and the contents of the source are copied. The emphasis here is on the fact that the target is always created—regardless of whether it existed before or not. Here's an illustration:

$ ls -l fileone filetwo
-rw-r--r--  1  root  root  85  Aug 22 10:26
  fileone
-rw-r--r--  1  root  root  16432  Aug 28 13:43
  filetwo
$
$ cp fileone filetwo
$ ls -l fileone filetwo
-rw-r--r--  1  root  root  85  Aug 22 10:26
  fileone
-rw-r--r--  1  edulaney  users  85  Aug 30 16:18
  filetwo
$ 

The original contents of filetwo have been lost, except for any backup tape versions, as filetwo is created to be a copy of fileone. There is a -i (as in inquire) option, which can be used to always ask if you really want to erase the contents of the target file if it already exists:

$ ls -l fileone filetwo
-rw-r--r--  1  root  root  85  Aug 22 10:26
  fileone
-rw-r--r--  1  root  root  16432  Aug 28 13:43
  filetwo
$
$ cp -i fileone filetwo
cp: overwrite 'filetwo'? 

At the prompt, you can enter "y" to perform the operation, or anything else to stop it.

You can copy a number of files from one directory to another so long as the last item on the command line is a valid directory path into which the files will be copied:

$ ls -l /usr/home/sdulaney
-rw-r--r--  1  root  root  85  Aug 22 10:26  exit
$
$ cd /usr/home/examples
$ ls -l s* q*
-rw-r--r--  1  root  root  585  Aug 23 12:16
  questions
-rw-r--r--  1  root  root  1985  Aug 24 15:17
  samples
-rw-r--r--  1  root  root  8501  Aug 25 18:30
  snapshot01.gif
$ cp s* q* /usr/home/sdulaney
$ cd ../sdulaney
$ ls -l
-rw-r--r--  1  root  root  85  Aug 22 10:26  exit
-rw-r--r--  1  root  root  585  Aug 31 22:50
  questions
-rw-r--r--  1  root  root  1985  Aug 31 22:50
  samples
-rw-r--r--  1  root  root  8501  Aug 31 22:50
  snapshot01.gif
$

To move an entire directory from one location to another, use the -r or -R option to recursively move the directory as well as any subdirectories and files beneath it. Other options that can be used include -f to force a copy without any prompting (the opposite, so to speak, of -i); -u to copy only when the source file is more recent (updated) than the target; and -v for verbose mode (show all operations, rather than perform them silently).

Lastly, the -P option will reproduce the entire path to a file in another location—creating directories and subdirectories as needed to do so.

mv

The move utility (mv) can be used for several operations. At the risk of being overly simplistic, this includes the ability to

  1. Rename a file

  2. Rename a directory

  3. Move a file from one directory to another

  4. Move a subdirectory from one directory to another

  5. Move an entity to another partition or media

The simplest operation is to rename a file in its current directory:

$ ls -l file*
-rw-r--r--  1  root  root  85  Aug 22 10:26
  fileone
-rw-r--r--  1  root  root  16432  Aug 28 13:43
  filetwo
$
$ mv fileone filethree
$ ls -l file*
-rw-r--r--  1  root  root  85  Aug 22 10:26
  filethree
-rw-r--r--  1  root  root  16432  Aug 28 13:43
  filetwo
$

The dates, permissions, and everything else associated with fileone stay with filethree. This is because when a file is moved within the same directory (or even on the same partition), all that changes is the information about the name—no physical operation takes place; only the descriptor is changed. The move has become a simple rename operation.

NOTE

As simplistic as it may sound, always remember that when you copy a file, you leave the original intact and create something that did not exist before—thus a new set of attributes is created for the new entity. When you move a file, however, the default action is a rename—you are changing only the name of the original entity and not creating anything new.

One way to put it in perspective is that if you copy a file that is 9MB in size, it will take longer than if you copy a file that is 9 bytes in size. With move being used as a rename, it will take the same amount of time to do the operation regardless of the size of the file.

As with the copy operation, if you attempt to move a file to a name that already exists, the contents of the target are lost. Here's an illustration:

$ ls -l file*
-rw-r--r--  1  root  root  85  Aug 22 10:26
  fileone
-rw-r--r--  1  root  root  16432  Aug 28 13:43
  filetwo
$ mv fileone filetwo
$ ls -l file*
-rw-r--r--  1  root  root  85  Aug 22 10:26
  filetwo
$ 

The -i option (as in inquiry or interactive) can be used to prompt before overwriting, and the opposite of it is -f (for force), which is the default operation. The -u option will only do the move if the source file is newer, and -v turns on verbose mode. The -b option makes a backup of the target file, if it exists, with a tilde as the last character—essentially performing a pseudo-copy operation:

$ ls -l help*
-rw-r--r--  1  root  root  85  Aug 22 10:26
  helpfile
$ mv -b helpfile helpfiletwo
$ ls -l help*
-rw-r--r--  1  root  root  85  Aug 22 10:26
  helpfiletwo
$ 
$ ls -l file*
-rw-r--r--  1  root  root  85  Aug 22 10:26
  fileone
-rw-r--r--  1  root  root  16432  Aug 28 13:43
  filetwo
$ mv -b fileone filetwo
$ ls -l file*
-rw-r--r--  1  root  root  85  Aug 22 10:26
  filetwo
-rw-r--r--  1  root  root  16432  Aug 28 13:43
  filetwo~
$ 

In the first instance, there was not an existing file with the target name present, so the -b option was ignored. In the second instance, a file by the name of the target was in existence, so the original target file is renamed with a tilde (~) as the last character.

NOTE

The -b option can also be used with cp to perform the same action during a copy as it does with mv.

dd

The device-to-device (dd) utility is used to copy a file from one device to another. It goes beyond that in functionality, however, for it can convert a file during the copy process from one format to another. It can convert from EBCDIC to ASCII (and reverse), change uppercase to lowercase (and reverse as well), and work with bytes, blocks, or keywords.

The most common use for dd is copying files to and from removable media, and you must use arguments that can include

  • bs—block file size

  • if—input file

  • of—output file

Removing Files and Directories

When files are no longer needed, they can be removed from the system with the rm (remove) command. Be careful using this command, for Linux offers no undelete command or function like those found in other operating systems.

$ ls -l file*
-rw-r--r--  1  root  root  85  Aug 22 10:26
  fileone
-rw-r--r--  1  root  root  16432  Aug 28 13:43
  filetwo
$ rm fileone
$ ls -l file*
-rw-r--r--  1  root  root  16432  Aug 28 13:43
  filetwo
$ 

When used with the -i option, a prompt appears before each file to be deleted. Pressing Y deletes the file, and pressing any other character skips the file.

$ ls -l t*
-rw-r--r--  1  root  root  85  Aug 22 10:26
  today
-rw-r--r--  1  root  root  16432  Aug 28 13:43
  tuesday
$ rm -i t*
rm: remove 'today'?

The -f option forces deletion, and -v puts the utility in verbose mode. The -r or -R option recursively deletes directories (including subdirectories and files beneath). In order to delete a file, you have to have write permissions within the directory where it resides.

NOTE

Write permission is only required on the directory from which you are deleting the file—not on the file itself.

A safer utility, rmdir, can be used to delete directories that have nothing beneath them. It will only delete empty directories and cannot be used for directories that have files or subdirectories beneath them. The only option that can be used with rmdir is -p to remove parent directories (if empty).

$ ls -R kdulaney
kdulaney:
docs

kdulaney/docs:
attempt
$ 
$ rmdir kdulaney
rmdir: kdulaney: Directory not empty
$ 

Because there is a file (attempt) within kdulaney/docs, and a subdirectory (docs) beneath kdulaney, the directory kdulaney cannot be deleted with the rmdir utility. There are three possible ways to accomplish the task:

  1. Use the rm -r command.

  2. Delete attempt with rm, and then delete docs with rmdir, and—finally—delete kdulaney with rmdir.

  3. Delete attempt with rm, and then delete kdulaney/docs with rmdir -p.

NOTE

Because rmdir can only delete empty directories, it is naturally a safer utility to use than rm for cleaning a system.

Making Directories

Now that you've learned how to copy, move, and delete directories, the only order of business left is to make a directory, which you can do by using the mkdir command. Used without options, it creates a child directory (subdirectory) in the current directory. There are two options that work with it as well:

  • -m—To specify permissions other than the default for the new directory (covered in a later chapter)

  • -p—To create a parent and child in one command

Here are some examples of the utility:

$ pwd
/usr/home
$ mkdir edulaney
$

This created the subdirectory edulaney beneath /usr/home(/usr/home/edulaney).

$ pwd
/usr/home
$ mkdir kdulaney/docs
mkdir: cannot make directory 'kdulaney/docs': No such file or
  directory
$
$ mkdir -p kdulaney/docs
$ cd kdulaney
$ cd docs
$

In the first attempt, the utility fails as you cannot create multiple directories by default. If you use the -p option, however, the multiple directories are created.

  • + Share This
  • 🔖 Save To Your Account