CP(1P) POSIX Programmer's Manual CP(1P)
PROLOG
This manual page is part of the POSIX Programmer's Manual. The Linux
implementation of this interface may differ (consult the corresponding
Linux manual page for details of Linux behavior), or the interface may
not be implemented on Linux.
NAME
cp -- copy files
SYNOPSIS
cp [-Pfip] source_file target_file
cp [-Pfip] source_file... target
cp -R [-H|-L|-P] [-fip] source_file... target
DESCRIPTION
The first synopsis form is denoted by two operands, neither of which
are existing files of type directory. The cp utility shall copy the
contents of source_file (or, if source_file is a file of type symbolic
link, the contents of the file referenced by source_file) to the desti-
nation path named by target_file.
The second synopsis form is denoted by two or more operands where the
-R option is not specified and the first synopsis form is not applica-
ble. It shall be an error if any source_file is a file of type direc-
tory, if target does not exist, or if target does not name a directory.
The cp utility shall copy the contents of each source_file (or, if
source_file is a file of type symbolic link, the contents of the file
referenced by source_file) to the destination path named by the con-
catenation of target, a single <slash> character if target did not end
in a <slash>, and the last component of source_file.
The third synopsis form is denoted by two or more operands where the -R
option is specified. The cp utility shall copy each file in the file
hierarchy rooted in each source_file to a destination path named as
follows:
* If target exists and names an existing directory, the name of the
corresponding destination path for each file in the file hierarchy
shall be the concatenation of target, a single <slash> character if
target did not end in a <slash>, and the pathname of the file rela-
tive to the directory containing source_file.
* If target does not exist and two operands are specified, the name
of the corresponding destination path for source_file shall be tar-
get; the name of the corresponding destination path for all other
files in the file hierarchy shall be the concatenation of target, a
<slash> character, and the pathname of the file relative to
source_file.
It shall be an error if target does not exist and more than two oper-
ands are specified, or if target exists and does not name a directory.
In the following description, the term dest_file refers to the file
named by the destination path. The term source_file refers to the file
that is being copied, whether specified as an operand or a file in a
file hierarchy rooted in a source_file operand. If source_file is a
file of type symbolic link:
* If the -R option was not specified, cp shall take actions based on
the type and contents of the file referenced by the symbolic link,
and not by the symbolic link itself, unless the -P option was spec-
ified.
* If the -R option was specified:
-- If none of the options -H, -L, nor -P were specified, it is
unspecified which of -H, -L, or -P will be used as a default.
-- If the -H option was specified, cp shall take actions based on
the type and contents of the file referenced by any symbolic
link specified as a source_file operand.
-- If the -L option was specified, cp shall take actions based on
the type and contents of the file referenced by any symbolic
link specified as a source_file operand or any symbolic links
encountered during traversal of a file hierarchy.
-- If the -P option was specified, cp shall copy any symbolic link
specified as a source_file operand and any symbolic links
encountered during traversal of a file hierarchy, and shall not
follow any symbolic links.
For each source_file, the following steps shall be taken:
1. If source_file references the same file as dest_file, cp may write
a diagnostic message to standard error; it shall do nothing more
with source_file and shall go on to any remaining files.
2. If source_file is of type directory, the following steps shall be
taken:
a. If the -R option was not specified, cp shall write a diagnostic
message to standard error, do nothing more with source_file,
and go on to any remaining files.
b. If source_file was not specified as an operand and source_file
is dot or dot-dot, cp shall do nothing more with source_file
and go on to any remaining files.
c. If dest_file exists and it is a file type not specified by the
System Interfaces volume of POSIX.1-2008, the behavior is
implementation-defined.
d. If dest_file exists and it is not of type directory, cp shall
write a diagnostic message to standard error, do nothing more
with source_file or any files below source_file in the file
hierarchy, and go on to any remaining files.
e. If the directory dest_file does not exist, it shall be created
with file permission bits set to the same value as those of
source_file, modified by the file creation mask of the user if
the -p option was not specified, and then bitwise-inclusively
OR'ed with S_IRWXU. If dest_file cannot be created, cp shall
write a diagnostic message to standard error, do nothing more
with source_file, and go on to any remaining files. It is
unspecified if cp attempts to copy files in the file hierarchy
rooted in source_file.
f. The files in the directory source_file shall be copied to the
directory dest_file, taking the four steps (1 to 4) listed here
with the files as source_files.
g. If dest_file was created, its file permission bits shall be
changed (if necessary) to be the same as those of source_file,
modified by the file creation mask of the user if the -p option
was not specified.
h. The cp utility shall do nothing more with source_file and go on
to any remaining files.
3. If source_file is of type regular file, the following steps shall
be taken:
a. The behavior is unspecified if dest_file exists and was written
by a previous step. Otherwise, if dest_file exists, the follow-
ing steps shall be taken:
i. If the -i option is in effect, the cp utility shall write
a prompt to the standard error and read a line from the
standard input. If the response is not affirmative, cp
shall do nothing more with source_file and go on to any
remaining files.
ii. A file descriptor for dest_file shall be obtained by per-
forming actions equivalent to the open() function defined
in the System Interfaces volume of POSIX.1-2008 called
using dest_file as the path argument, and the bitwise-
inclusive OR of O_WRONLY and O_TRUNC as the oflag argu-
ment.
iii. If the attempt to obtain a file descriptor fails and the
-f option is in effect, cp shall attempt to remove the
file by performing actions equivalent to the unlink()
function defined in the System Interfaces volume of
POSIX.1-2008 called using dest_file as the path argument.
If this attempt succeeds, cp shall continue with step 3b.
b. If dest_file does not exist, a file descriptor shall be
obtained by performing actions equivalent to the open() func-
tion defined in the System Interfaces volume of POSIX.1-2008
called using dest_file as the path argument, and the bitwise-
inclusive OR of O_WRONLY and O_CREAT as the oflag argument. The
file permission bits of source_file shall be the mode argument.
c. If the attempt to obtain a file descriptor fails, cp shall
write a diagnostic message to standard error, do nothing more
with source_file, and go on to any remaining files.
d. The contents of source_file shall be written to the file
descriptor. Any write errors shall cause cp to write a diagnos-
tic message to standard error and continue to step 3e.
e. The file descriptor shall be closed.
f. The cp utility shall do nothing more with source_file. If a
write error occurred in step 3d, it is unspecified if cp con-
tinues with any remaining files. If no write error occurred in
step 3d, cp shall go on to any remaining files.
4. Otherwise, the -R option was specified, and the following steps
shall be taken:
a. The dest_file shall be created with the same file type as
source_file.
b. If source_file is a file of type FIFO, the file permission bits
shall be the same as those of source_file, modified by the file
creation mask of the user if the -p option was not specified.
Otherwise, the permissions, owner ID, and group ID of dest_file
are implementation-defined.
If this creation fails for any reason, cp shall write a diag-
nostic message to standard error, do nothing more with
source_file, and go on to any remaining files.
c. If source_file is a file of type symbolic link, and the options
require the symbolic link itself to be acted upon, the pathname
contained in dest_file shall be the same as the pathname con-
tained in source_file.
If this fails for any reason, cp shall write a diagnostic mes-
sage to standard error, do nothing more with source_file, and
go on to any remaining files.
If the implementation provides additional or alternate access control
mechanisms (see the Base Definitions volume of POSIX.1-2008, Section
4.4, File Access Permissions), their effect on copies of files is
implementation-defined.
OPTIONS
The cp utility shall conform to the Base Definitions volume of
POSIX.1-2008, Section 12.2, Utility Syntax Guidelines.
The following options shall be supported:
-f If a file descriptor for a destination file cannot be
obtained, as described in step 3.a.ii., attempt to unlink the
destination file and proceed.
-H Take actions based on the type and contents of the file ref-
erenced by any symbolic link specified as a source_file oper-
and.
-i Write a prompt to standard error before copying to any exist-
ing non-directory destination file. If the response from the
standard input is affirmative, the copy shall be attempted;
otherwise, it shall not.
-L Take actions based on the type and contents of the file ref-
erenced by any symbolic link specified as a source_file oper-
and or any symbolic links encountered during traversal of a
file hierarchy.
-P Take actions on any symbolic link specified as a source_file
operand or any symbolic link encountered during traversal of
a file hierarchy.
-p Duplicate the following characteristics of each source file
in the corresponding destination file:
1. The time of last data modification and time of last
access. If this duplication fails for any reason, cp
shall write a diagnostic message to standard error.
2. The user ID and group ID. If this duplication fails for
any reason, it is unspecified whether cp writes a diag-
nostic message to standard error.
3. The file permission bits and the S_ISUID and S_ISGID
bits. Other, implementation-defined, bits may be dupli-
cated as well. If this duplication fails for any reason,
cp shall write a diagnostic message to standard error.
If the user ID or the group ID cannot be duplicated, the file
permission bits S_ISUID and S_ISGID shall be cleared. If
these bits are present in the source file but are not dupli-
cated in the destination file, it is unspecified whether cp
writes a diagnostic message to standard error.
The order in which the preceding characteristics are dupli-
cated is unspecified. The dest_file shall not be deleted if
these characteristics cannot be preserved.
-R Copy file hierarchies.
Specifying more than one of the mutually-exclusive options -H, -L, and
-P shall not be considered an error. The last option specified shall
determine the behavior of the utility.
OPERANDS
The following operands shall be supported:
source_file
A pathname of a file to be copied. If a source_file operand
is '-', it shall refer to a file named -; implementations
shall not treat it as meaning standard input.
target_file
A pathname of an existing or nonexistent file, used for the
output when a single file is copied. If a target_file operand
is '-', it shall refer to a file named -; implementations
shall not treat it as meaning standard output.
target A pathname of a directory to contain the copied files.
STDIN
The standard input shall be used to read an input line in response to
each prompt specified in the STDERR section. Otherwise, the standard
input shall not be used.
INPUT FILES
The input files specified as operands may be of any file type.
ENVIRONMENT VARIABLES
The following environment variables shall affect the execution of cp:
LANG Provide a default value for the internationalization vari-
ables that are unset or null. (See the Base Definitions vol-
ume of POSIX.1-2008, Section 8.2, Internationalization Vari-
ables for the precedence of internationalization variables
used to determine the values of locale categories.)
LC_ALL If set to a non-empty string value, override the values of
all the other internationalization variables.
LC_COLLATE
Determine the locale for the behavior of ranges, equivalence
classes, and multi-character collating elements used in the
extended regular expression defined for the yesexpr locale
keyword in the LC_MESSAGES category.
LC_CTYPE Determine the locale for the interpretation of sequences of
bytes of text data as characters (for example, single-byte as
opposed to multi-byte characters in arguments and input
files) and the behavior of character classes used in the
extended regular expression defined for the yesexpr locale
keyword in the LC_MESSAGES category.
LC_MESSAGES
Determine the locale used to process affirmative responses,
and the locale used to affect the format and contents of
diagnostic messages and prompts written to standard error.
NLSPATH Determine the location of message catalogs for the processing
of LC_MESSAGES.
ASYNCHRONOUS EVENTS
Default.
STDOUT
Not used.
STDERR
A prompt shall be written to standard error under the conditions speci-
fied in the DESCRIPTION section. The prompt shall contain the destina-
tion pathname, but its format is otherwise unspecified. Otherwise, the
standard error shall be used only for diagnostic messages.
OUTPUT FILES
The output files may be of any type.
EXTENDED DESCRIPTION
None.
EXIT STATUS
The following exit values shall be returned:
0 All files were copied successfully.
>0 An error occurred.
CONSEQUENCES OF ERRORS
If cp is prematurely terminated by a signal or error, files or file
hierarchies may be only partially copied and files and directories may
have incorrect permissions or access and modification times.
The following sections are informative.
APPLICATION USAGE
The set-user-ID and set-group-ID bits are explicitly cleared when files
are created. This is to prevent users from creating programs that are
set-user-ID or set-group-ID to them when copying files or to make set-
user-ID or set-group-ID files accessible to new groups of users. For
example, if a file is set-user-ID and the copy has a different group ID
than the source, a new group of users has execute permission to a set-
user-ID program than did previously. In particular, this is a problem
for superusers copying users' trees.
EXAMPLES
None.
RATIONALE
The -i option exists on BSD systems, giving applications and users a
way to avoid accidentally removing files when copying. Although the 4.3
BSD version does not prompt if the standard input is not a terminal,
the standard developers decided that use of -i is a request for inter-
action, so when the destination path exists, the utility takes instruc-
tions from whatever responds on standard input.
The exact format of the interactive prompts is unspecified. Only the
general nature of the contents of prompts are specified because imple-
mentations may desire more descriptive prompts than those used on his-
torical implementations. Therefore, an application using the -i option
relies on the system to provide the most suitable dialog directly with
the user, based on the behavior specified.
The -p option is historical practice on BSD systems, duplicating the
time of last data modification and time of last access. This volume of
POSIX.1-2008 extends it to preserve the user and group IDs, as well as
the file permissions. This requirement has obvious problems in that the
directories are almost certainly modified after being copied. This vol-
ume of POSIX.1-2008 requires that the modification times be preserved.
The statement that the order in which the characteristics are dupli-
cated is unspecified is to permit implementations to provide the maxi-
mum amount of security for the user. Implementations should take into
account the obvious security issues involved in setting the owner,
group, and mode in the wrong order or creating files with an owner,
group, or mode different from the final value.
It is unspecified whether cp writes diagnostic messages when the user
and group IDs cannot be set due to the widespread practice of users
using -p to duplicate some portion of the file characteristics, indif-
ferent to the duplication of others. Historic implementations only
write diagnostic messages on errors other than [EPERM].
Earlier versions of this standard included support for the -r option to
copy file hierarchies. The -r option is historical practice on BSD and
BSD-derived systems. This option is no longer specified by POSIX.1-2008
but may be present in some implementations. The -R option was added as
a close synonym to the -r option, selected for consistency with all
other options in this volume of POSIX.1-2008 that do recursive direc-
tory descent.
The difference between -R and the removed -r option is in the treatment
by cp of file types other than regular and directory. It was implemen-
tation-defined how the - option treated special files to allow both
historical implementations and those that chose to support -r with the
same abilities as -R defined by this volume of POSIX.1-2008. The origi-
nal -r flag, for historic reasons, did not handle special files any
differently from regular files, but always read the file and copied its
contents. This had obvious problems in the presence of special file
types; for example, character devices, FIFOs, and sockets.
When a failure occurs during the copying of a file hierarchy, cp is
required to attempt to copy files that are on the same level in the
hierarchy or above the file where the failure occurred. It is unspeci-
fied if cp shall attempt to copy files below the file where the failure
occurred (which cannot succeed in any case).
Permissions, owners, and groups of created special file types have been
deliberately left as implementation-defined. This is to allow systems
to satisfy special requirements (for example, allowing users to create
character special devices, but requiring them to be owned by a certain
group). In general, it is strongly suggested that the permissions,
owner, and group be the same as if the user had run the historical
mknod, ln, or other utility to create the file. It is also probable
that additional privileges are required to create block, character, or
other implementation-defined special file types.
Additionally, the -p option explicitly requires that all set-user-ID
and set-group-ID permissions be discarded if any of the owner or group
IDs cannot be set. This is to keep users from unintentionally giving
away special privilege when copying programs.
When creating regular files, historical versions of cp use the mode of
the source file as modified by the file mode creation mask. Other
choices would have been to use the mode of the source file unmodified
by the creation mask or to use the same mode as would be given to a new
file created by the user (plus the execution bits of the source file)
and then modify it by the file mode creation mask. In the absence of
any strong reason to change historic practice, it was in large part
retained.
When creating directories, historical versions of cp use the mode of
the source directory, plus read, write, and search bits for the owner,
as modified by the file mode creation mask. This is done so that cp can
copy trees where the user has read permission, but the owner does not.
A side-effect is that if the file creation mask denies the owner per-
missions, cp fails. Also, once the copy is done, historical versions of
cp set the permissions on the created directory to be the same as the
source directory, unmodified by the file creation mask.
This behavior has been modified so that cp is always able to create the
contents of the directory, regardless of the file creation mask. After
the copy is done, the permissions are set to be the same as the source
directory, as modified by the file creation mask. This latter change
from historical behavior is to prevent users from accidentally creating
directories with permissions beyond those they would normally set and
for consistency with the behavior of cp in creating files.
It is not a requirement that cp detect attempts to copy a file to
itself; however, implementations are strongly encouraged to do so. His-
torical implementations have detected the attempt in most cases.
There are two methods of copying subtrees in this volume of
POSIX.1-2008. The other method is described as part of the pax utility
(see pax). Both methods are historical practice. The cp utility pro-
vides a simpler, more intuitive interface, while pax offers a finer
granularity of control. Each provides additional functionality to the
other; in particular, pax maintains the hard-link structure of the
hierarchy, while cp does not. It is the intention of the standard
developers that the results be similar (using appropriate option combi-
nations in both utilities). The results are not required to be identi-
cal; there seemed insufficient gain to applications to balance the dif-
ficulty of implementations having to guarantee that the results would
be exactly identical.
The wording allowing cp to copy a directory to implementation-defined
file types not specified by the System Interfaces volume of
POSIX.1-2008 is provided so that implementations supporting symbolic
links are not required to prohibit copying directories to symbolic
links. Other extensions to the System Interfaces volume of POSIX.1-2008
file types may need to use this loophole as well.
FUTURE DIRECTIONS
None.
SEE ALSO
mv, find, ln, pax
The Base Definitions volume of POSIX.1-2008, Section 4.4, File Access
Permissions, Chapter 8, Environment Variables, Section 12.2, Utility
Syntax Guidelines
The System Interfaces volume of POSIX.1-2008, open(), unlink()
COPYRIGHT
Portions of this text are reprinted and reproduced in electronic form
from IEEE Std 1003.1, 2013 Edition, Standard for Information Technology
-- Portable Operating System Interface (POSIX), The Open Group Base
Specifications Issue 7, Copyright (C) 2013 by the Institute of Electri-
cal and Electronics Engineers, Inc and The Open Group. (This is
POSIX.1-2008 with the 2013 Technical Corrigendum 1 applied.) In the
event of any discrepancy between this version and the original IEEE and
The Open Group Standard, the original IEEE and The Open Group Standard
is the referee document. The original Standard can be obtained online
at http://www.unix.org/online.html .
Any typographical or formatting errors that appear in this page are
most likely to have been introduced during the conversion of the source
files to man page format. To report such errors, see https://www.ker-
nel.org/doc/man-pages/reporting_bugs.html .
IEEE/The Open Group 2013 CP(1P)