赞
踩
cp(copy),主要用来复制文件或目录
语法
[root@study ~]# cp [-adfilprsu] 来源文件(source) 目标文件(destination)
[root@study ~]# cp [options] source1 source2 source3 .... directory
选项与参数 | 含义 |
---|---|
-a | 相当于 -dr --preserve=all 的意思,至于 dr 请参考下列说明;(常用),参考范例2 |
-d | 若来源文件为链接文件的属性(link file),则复制链接文件属性而非文件本身; |
-f | 为强制(force)的意思,若目标文件已经存在且无法打开,则移除后再尝试一次; |
-i | 若目标文件(destination)已经存在时,在覆盖时会先询问动作的进行(常用)参考范例1 |
-l | 进行硬式链接(hard link)的链接文件创建,而非复制文件本身;参考范例4 |
-p | 连同文件的属性(权限、用户、时间)一起复制过去,而非使用默认属性(备份常用); |
-r | 递回持续复制,用于目录的复制行为;(常用),参考范例3 |
-s | 复制成为符号链接文件 (symbolic link),亦即“捷径”文件;参考范例4 |
-u | destination 比 source 旧才更新 destination,或 destination 不存在的情况下才复制。参考范例5 |
–preserve=all | 除了 -p 的权限相关参数外,还加入 SELinux 的属性, links, xattr 等也复制了 |
最后需要注意的,如果来源文件有两个以上,则最后一个目的文件一定要是目录才行
cp指令,不同身份者执行这个指令会有不同的结果产生,尤其是-a, -p选项, 对于不同身份来说,差异则非常的大。下面的练习中,有的身份为root有的身份为一般帐号 (在这里我用 dmtsai 这个帐号), 练习时请特别注意身份的差别。
范例1:用root身份,将主文件夹下的 .bashrc 复制到 /tmp 下,并更名为 bashrc
[root@study ~]# cp ~/.bashrc /tmp/bashrc
[root@study ~]# cp -i ~/.bashrc /tmp/bashrc
cp: overwrite `/tmp/bashrc'? n <==n不覆盖,y为覆盖
# 重复作两次动作,由于 /tmp 下面已经存在 bashrc 了,加上-i选项后,
# 则在覆盖前会询问使用者是否确定!可以按下 n 或者 y 来二次确认
范例2:变换目录到/tmp,并将/var/log/wtmp复制到/tmp且观察属性:
# 切换到/tmp目录
[root@study ~]# cd /tmp
# 复制到目前的目录,最后的 . 不要忘
[root@study tmp]# cp /var/log/wtmp .
[root@study tmp]# ls -l /var/log/wtmp wtmp
-rw-rw-r--. 1 root utmp 28416 Jun 11 18:56 /var/log/wtmp
-rw-r--r--. 1 root root 28416 Jun 11 19:01 wtmp
# 注意观察上面,在不加任何选项的情况下,文件的某些属性/权限会改变,这是个很重要的特性!要注意。还有,连文件创建的时间也不一样了
如果想要将文件的所有特性都一起复制,可以加上-a,如下所示:
[root@study tmp]# cp -a /var/log/wtmp wtmp_2
[root@study tmp]# ls -l /var/log/wtmp wtmp_2
-rw-rw-r--. 1 root utmp 28416 Jun 11 18:56 /var/log/wtmp
-rw-rw-r--. 1 root utmp 28416 Jun 11 18:56 wtmp_2
注意:如果是目录则不能直接复制,要加上 -r 的选项,比如
范例3:复制 /etc/ 这个目录下的所有内容到 /tmp 下面
[root@study tmp]# cp /etc/ /tmp
cp: omitting directory `/etc'
[root@study tmp]# cp -r /etc/ /tmp
还是要再次的强调! -r 是可以复制目录,但是,文件与目录的权限可能会被改变
所以,也可以利用 cp -a /etc /tmp
来下达指令喔!尤其是在备份的情况下。
范例4:将范例一复制的 bashrc 创建一个链接文件 (symbolic link)
[root@study tmp]# ls -l bashrc
-rw-r--r--. 1 root root 176 Jun 11 19:01 bashrc < # 先观察一下文件情况
[root@study tmp]# cp -s bashrc bashrc_slink
[root@study tmp]# cp -l bashrc bashrc_hlink
[root@study tmp]# ls -l bashrc*
-rw-r--r--. 2 root root 176 Jun 11 19:01 bashrc # 与原始文件不太一样了,链接数由1--2
-rw-r--r--. 2 root root 176 Jun 11 19:01 bashrc_hlink
lrwxrwxrwx. 1 root root 6 Jun 11 19:06 bashrc_slink -> bashrc
使用 -l 及 -s 都会创建所谓的链接文件(link file),但是这两种链接文件却有不一样的情况。 -l 是实体链接(hard link),而 -s 则是符号链接(symbolic link), 简单来说,bashrc_slink 是一个“捷径”,这个捷径会链接到bashrc去!所以你会看到文件名右侧会有个指向(->)的符号。
bashrc_hlink文件与bashrc的属性与权限完全一样,与尚未进行链接前的差异则是第二栏的link数由1变成2了。
范例5:若 ~/.bashrc 比 /tmp/bashrc 新才复制过来
[root@study tmp]# cp -u ~/.bashrc /tmp/bashrc
-u 的特性,是在目标文件与来源文件有差异时,才会复制。所以,比较常被用于“备份”的工作当中。
范例6:将范例4造成的 bashrc_slink 复制成为 bashrc_slink_1 与bashrc_slink_2
[root@study tmp]# cp bashrc_slink bashrc_slink_1
[root@study tmp]# cp -d bashrc_slink bashrc_slink_2
[root@study tmp]# ls -l bashrc bashrc_slink*
-rw-r--r--. 2 root root 176 Jun 11 19:01 bashrc
lrwxrwxrwx. 1 root root 6 Jun 11 19:06 bashrc_slink -> bashrc
-rw-r--r--. 1 root root 176 Jun 11 19:09 bashrc_slink_1 <
#与原始文件相同
lrwxrwxrwx. 1 root root 6 Jun 11 19:10 bashrc_slink_2 -> bashrc <
# 是链接文件!
原本复制的是链接文件,但是却将链接文件的实际文件复制过来了。也就是说,如果没有加上任何选项时,cp复制的是原始文件,而非链接文件的属性
若要复制链接文件的属性,就得要使用-d的选项了!如上面的cp -d bashrc_slink bashrc_slink_2
。
范例7:将主文件夹的 .bashrc 和.bash_history 复制到 /tmp 下面
[root@study tmp]# cp ~/.bashrc ~/.bash_history /tmp
可以将多个数据一次复制到同一个目录去!最后面一定是目录
光说不练假把式
大展身手吧:用dmtsai 的身份,完整的复制/var/log/wtmp文件到/tmp下面,并更名为dmtsai_wtmp
[dmtsai@study ~]$ cp -a /var/log/wtmp /tmp/dmtsai_wtmp
[dmtsai@study ~]$ ls -l /var/log/wtmp /tmp/dmtsai_wtmp
-rw-rw-r--. 1 dmtsai dmtsai 28416 6月 11 18:56 /tmp/dmtsai_wtmp
-rw-rw-r--. 1 root utmp 28416 6月 11 18:56 /var/log/wtmp
由于 dmtsai 的身份并不能随意修改文件的拥有者与群组,因此虽然能够复制wtmp的相关权限与时间等属性, 但是与拥有者、群组相关的,原本 dmtsai 身份无法进行的动作,即使加上-a 选项,也是无法达成完整复制权限的。
所以,使用cp指令复制时,你必须要清楚的了解到:
Linux rm命令用于删除一个文件或者目录
语法:rm [options] name…
参数:
参数 | 含义 |
---|---|
-i | 询问模式,删除前逐一询问确认 |
-f | force,即使原档案属性设为唯读,亦直接删除,无需逐一确认 |
-r | 将目录及以下之档案亦逐一删除 |
范例1:将刚刚在 cp 的范例中创建的 bashrc 删除掉
[root@study ~]# cd /tmp
[root@study tmp]# rm -i bashrc
rm: remove regular file `bashrc'? y
加上 -i 的选项就会主动询问,避免你删除到错误的文件名。
范例2:通过万用字符*的帮忙,将/tmp下面开头为bashrc的文件名通通删除:
[root@study tmp]# rm -i bashrc*
注意星号*,代表的是 0 到无穷多个任意字符。
范例3:将 cp 范例中所创建的 /tmp/etc/ 这个目录删除掉
[root@study tmp]# rmdir /tmp/etc
rmdir: failed to remove '/tmp/etc': Directory not empty # 删不掉,因为这不是空的目录。
[root@study tmp]# rm -r /tmp/etc
rm: descend into directory `/tmp/etc'? y
rm: remove regular file `/tmp/etc/fstab'? y
rm: remove regular empty file `/tmp/etc/crypttab'? # 按下 [crtl]+c 中断
.....(中间省略).....
因为身份是 root ,默认已经加入了 -i 的选项,所以你要一直按 y 才会删除。
如果不想要继续按 y ,可以按下“ [ctrl]-c ”来结束 rm 的工作。
这是一种保护的动作,如果确定要删除掉此目录而不要询问,可以这样做:
[root@study tmp]# \rm -r /tmp/etc
在指令前加上反斜线,可以忽略掉 alias 的指定选项。至于 alias 我们在bash再谈。
谨慎使用。你不要删错了。删除 /etc 系统是会挂掉的。
范例4:删除一个带有 - 开头的文件
[root@study tmp]# touch ./-aaa-
# [touch](../Text/index.html#touch)这个指令可以创建空文件。
[root@study tmp]# ls -l
-rw-r--r--. 1 root root 0 Jun 11 19:22 -aaa-
# 文件大小为0,所以是空文件
[root@study tmp]# rm -aaarm: invalid option -- 'a'
# 因为 "-" 是选项!所以系统误判了!
Try 'rm ./-aaa-' to remove the file `-aaa-'.
# 新的 bash 有给建议的
Try 'rm --help' for more information.
[root@study tmp]# rm ./-aaa-
删除当前目录下的所有文件及目录(谨慎使用!删库跑路)
rm -r *
文件一旦通过rm命令删除,则无法恢复,所以必须格外小心地使用该命令。
Linux mv命令用来为文件或目录改名、或将文件或目录移入其它位置。
语法
mv [options] source dest
mv [options] source... directory
参数说明:
参数 | 含义 |
---|---|
-i | 若指定目录已有同名文件,则先询问是否覆盖旧文件 |
-f: | 在mv操作要覆盖某已有的目标文件时不给任何指示 |
-u | 若目标文件已经存在,且 source 比较新,才会更新 (update) |
mv参数设置与运行结果
命令格式 | 运行结果 |
---|---|
mv 文件名 文件名 | 将源文件名改为目标文件名 |
mv 文件名 目录名 | 将文件移动到目标目录 |
mv 目录名 目录名 | 目标目录已存在,将源目录移动到目标目录;目标目录不存在则改名 |
mv 目录名 文件名 | 出错 |
范例1:复制一文件,创建一目录,将文件移动到目录中
[root@study ~]# cd /tmp
[root@study tmp]# cp ~/.bashrc bashrc
[root@study tmp]# mkdir mvtest
[root@study tmp]# mv bashrc mvtest
范例2:将刚刚的目录名称更名为 mvtest2
[root@study tmp]# mv mvtest mvtest2
其实在 Linux 下面有一个专门更改文件名的指令rename,该指令专职进行多个文件名的同时更名,并非针对单一文件名变更,与mv不同。这里不做介绍,请man rename自行了解。
范例3:再创建两个文件,再全部移动到 /tmp/mvtest2 当中
[root@study tmp]# cp ~/.bashrc bashrc1
[root@study tmp]# cp ~/.bashrc bashrc2
[root@study tmp]# mv bashrc1 bashrc2 mvtest2
注意,如果有多个来源文件或目录,则最后一个目标文件一定是“目录”也就是说,将所有的数据移动到该目录的意思。
参考《鸟哥的 Linux 私房菜:基础版》.pdf。整理不易
学习永无止境
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。