Chapter 3: Copying, Moving, Removing

Copy files and directories

face Robert Craven

To copy files or directories, we can use cp.

First, make sure you’re in ~/modules/shell/notes. Let’s make a backup of the (empty) file, commands.txt, called commands_backup.txt:

username@MACHINE:notes$ cp commands.txt commands_backup.txt
username@MACHINE:notes$ ls -l
total 0
-rw-r--r-- 1 username mai 0 Aug 21 11:32 commands_backup.txt
-rw-r--r-- 1 username mai 0 Aug 21 11:36 commands.txt

The basic syntax of cp is: cp <ORIGINAL FILE> <COPY OF ORIGINAL>.

In addition, the second argument can be an existing directory. In that case, the file would be copied to within the directory in question, with the same filename.

username@MACHINE:notes$ mkdir backups
username@MACHINE:notes$ cp commands.txt backups/
username@MACHINE:notes$ ls -l backups/
total 0
-rw-r--r-- 1 username mai 0 Aug 21 11:45 commands.txt

If you wish to copy an entire directory, with its contents, then use the -R flag. This copies the directory recursively—its subdirectories, subsubdirectories, and all files therein, etc.

username@MACHINE:notes$ cp -R backups backup_of_backups
username@MACHINE:notes$ ls -l
total 8
drwx------ 2 username mai 4096 Aug 21 13:23 backup_of_backups
drwx------ 2 username mai 4096 Aug 21 13:20 backups
-rw------- 1 username mai    0 Aug 21 11:32 commands_backup.txt
-rw------- 1 username mai    0 Aug 21 11:32 commands.txt
username@MACHINE:notes$ ls -l backup_of_backups
total 0
-rw------- 1 username mai 0 Aug 21 13:23 commands.txt

Exercise 7

  1. Make a new file, meetings.txt, in notes.
  2. Make a copy of this in backups/.

Wildcards

Many shell commands take a list of arguments. For instance, we could do:

username@MACHINE:notes$ touch thing.txt todo.txt
username@MACHINE:notes$ ls -l
total 8
drwx------ 2 username mai 4096 Aug 21 13:23 backup_of_backups
drwx------ 2 username mai 4096 Aug 21 13:20 backups
-rw------- 1 username mai    0 Aug 21 11:32 commands_backup.txt
-rw------- 1 username mai    0 Aug 21 11:32 commands.txt
-rw------- 1 username mai    0 Aug 21 13:59 meetings.txt
-rw------- 1 username mai    0 Aug 22 13:01 thing.txt
-rw------- 1 username mai    0 Aug 22 13:01 todo.txt

It would be possible to write:

username@MACHINE:notes$ cp thing.txt todo.txt backups/

This would copy the first two files into backup. However, it’s shorter to use a wildcard:

username@MACHINE:notes$ cp t* backups/

This will copy any file beginning with a t to the directory backups/. Similarly, if we wanted to copy all files with a .txt extension, we could write:

username@MACHINE:notes$ cp *.txt backups/

For much more about wildcards, see here.

Interactive copy

If there’s already a file in the place to which you’re copying, that file will be overwritten—you’ll lose the data! Therefore you need to be very careful with using cp. To make cp query you, interactively, about whether to overwrite files, then use cp -i:

username@MACHINE:notes$ cp -i thing.txt todo.txt
cp: overwrite 'todo.txt?' 

At this point, you can either answer y or n (with Enter).