|
Chapter 18 Linking, Renaming, and Copying Files
|
|
Some versions of cp
have a -r
(recursive) flag.
It copies all the files in a directory
tree - that is, all the files in a directory and its subdirectories.
NOTE:
One of our UNIX systems has a cp
without a -r
option.
But it also has an
rcp
(1.33
)
command that does
have -r
.
rcp
can copy to any machine, not just remote machines.
When I need cp -r
on that host, I use rcp -r
.
The first argument(s) to cp -r
can be directory(s)-or, if you name any
file(s), they'll be copied just the way they would without the -r
.
The last argument should be a directory.
So, you can use cp -r
in two ways:
Those two methods are really doing the same thing.
They're both copying the tail of the first pathname(s) to the end of the last
pathname.
Here's how to do the copy shown in
Figure 18.1
.
This copies the directory /home/jane
, with all its files and
subdirectories, and creates a subdirectory named jane
in the
current directory .
(1.21
)
:
% cd /work/bkup
% cp -r /home/jane .
How can you copy the contents of the subdirectory called data
and all
its files (but not the subdirectory itself) into a
duplicate directory named data.bak
?
First create the destination
directory.
That's because the last argument to cp -r
must be a directory that
already exists:
% cd /home/jane
% mkdir data.bak
% cp -r data/* data.bak
That doesn't copy any files in data
whose names start with a dot
(.
).
There's
a way (15.5
)
to do that though.
To copy the subdirectories Sep
and
Oct
and their files, as well as the file Output
, from
the directory /home/jim/calendar
into the current directory (.
):
[..]*
|
% cp -r /home/jim/calendar/[SO]* .
|
If you use the C shell or bash
, you can copy just the directories by using the
handy
curly brace operators (9.5
)
:
% cp -r /home/jim/calendar/{Sep,Oct} .
Some gotchas:
Symbolic and hard links (18.4
)
are copied as files.
That can be good because, at the destination, a symbolic link might
point to the wrong place.
It can be bad if the link pointed to a really big file;
the copy can take a lot of disk space.
(In
Figure 18.1
notice that the symbolic link in jane
's home
directory was converted to a file named .setup
with a copy of the
contents of generic
.)
On many UNIXes, the copy will be dated at the time you made the copy and
may have its permissions set by your
umask
(22.4
)
.
If you want the copy to have the original
modification time and permissions,
add the -p
option.
cp -r
will go into an endless loop if you name a directory in
the list to copy from and also as the destination directory.
For example, let's say you're copying everything from the current directory
into an existing subdirectory named backup
, like this:
% cp -r * backup
Unless your cp -r
works differently from the ones I've tried, it
will create backup/backup
, and backup/backup/backup
, and so on.
To avoid that, replace the *
wildcard with other less-"wild"
wildcards.
You can also match everything except the destination directory name by
using
the ksh
!
operator, the tcsh
^
operator (15.2
)
,
or
the nom
script (15.9
)
.
|
|