$ ls a dir1/ # 默认cp命令是别名,添加了-i选项 $ aliascp aliascp='cp -i' $ cp a b $ cp -f a b cp: overwrite ‘b’? y # 因为cp命令别名定义了-i选项,所以即使加-f也会有提示,要使用原始命令可以加\cp转义或者使用命令绝对路径/usr/bin/cp $ \cp -f a b $ /usr/bin/cp -f a b $ cp -a a c $ cp a dir1/d # 默认目标文件为当前时间,加-a选项则保留原文件的一切属性包括时间 $ ll -rw-r--r-- 1 root root 4 Jan 14 22:13 a -rw-r--r-- 1 root root 4 Jan 14 22:17 b -rw-r--r-- 1 root root 4 Jan 14 22:13 c drwxr-xr-x 2 root root 15 Jan 14 22:17 dir1/ $ ll dir1/d -rw-r--r-- 1 root root 4 Jan 14 22:17 dir1/d
# -b选项覆盖目标文件前先备份,默认文件名加~,-S指定文件名后缀如下.bak $ cp -b a b $ cp -b -S '.bak' a c $ ls a b b~ c c.bak dir1/ # 也可以通过如下命令来创建一个.bak的备份文件,即文件名{,.bak},后缀可自定义 $ cp a{,.bak} $ ls a* a a.bak
# 复制软链接文件,默认是复制链接的原文件,加-d选项则相当于创建一个新的软链接,加-a选项则同样保留所有属性 $ ln -s a aaa $ cp aaa bbb $ cp -d aaa ccc $ cp -a aaa ddd $ ll -rw-r--r-- 1 root root 4 Jan 14 22:13 a lrwxrwxrwx 1 root root 1 Jan 14 22:27 aaa -> a -rw-r--r-- 1 root root 4 Jan 14 22:27 bbb lrwxrwxrwx 1 root root 1 Jan 14 22:28 ccc -> a lrwxrwxrwx 1 root root 1 Jan 14 22:27 ddd -> a
$ echo aaa > a $ echo bbb > b $ ls a b b~ c c.bak # -n选项目标文件已存在则跳过 $ cp -n a b $ more b bbb # -p选项同步复制源文件的所有者和时间戳属性 $ cp -p a b $ more b aaa $ ll a b -rw-r--r-- 1 root root 4 Jan 14 22:47 a -rw-r--r-- 1 root root 4 Jan 14 22:47 b # -u选项只有在源文件比较新时才会复制,以下是b文件比a文件时间要新,所以不会复制 $ echo bbb > b $ cp -u a b $ more b bbb $ ll a b -rw-r--r-- 1 root root 4 Jan 14 22:47 a -rw-r--r-- 1 root root 4 Jan 14 22:49 b # 更新a文件的时间戳,然后重新复制 $ touch a $ cp -v a b ‘a’ -> ‘b’ $ more b aaa
# -r选项递归复制目录,-a选项也可以直接复制目录并保留属性 $ cp dir1 dir2 cp: omitting directory ‘dir1’ $ cp -r dir1 dir2 $ cp -a dir1 dir3 $ ll -d dir*/ drwxr-xr-x 2 root root 97 Jan 14 22:46 dir1/ drwxr-xr-x 2 root root 97 Jan 14 22:51 dir2/ drwxr-xr-x 2 root root 97 Jan 14 22:46 dir3/ # cp支持同时复制多个源文件或目录到一个已存在的目标目录.即源可以有多个,但目标只能有一个且必须为目录 $ cp -r a b c dir1 dir2 $ cp a b c d cp: target ‘d’ is not a directory $ cp a b c dir22 cp: target ‘dir22’ is not a directory