当前位置:   article > 正文

复制、删除与移动:cp、rm和mv命令_你能使用admin身份 ,完整的复制/var/log/wtmp 文件到/tmp下 并更名为bobby

你能使用admin身份 ,完整的复制/var/log/wtmp 文件到/tmp下 并更名为bobby_wt

复制、删除与移动:cp、rm和mv命令

cp命令

cp(copy),主要用来复制文件或目录
语法

[root@study ~]# cp [-adfilprsu] 来源文件(source) 目标文件(destination)
[root@study ~]# cp [options] source1 source2 source3 .... directory
  • 1
  • 2
选项与参数含义
-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
-udestination 比 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 来二次确认
  • 1
  • 2
  • 3
  • 4
  • 5

范例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
# 注意观察上面,在不加任何选项的情况下,文件的某些属性/权限会改变,这是个很重要的特性!要注意。还有,连文件创建的时间也不一样了
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

如果想要将文件的所有特性都一起复制,可以加上-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
  • 1
  • 2
  • 3
  • 4

注意:如果是目录则不能直接复制,要加上 -r 的选项,比如
范例3:复制 /etc/ 这个目录下的所有内容到 /tmp 下面

[root@study tmp]# cp /etc/ /tmp
cp: omitting directory `/etc' 

[root@study tmp]# cp -r /etc/ /tmp

  • 1
  • 2
  • 3
  • 4
  • 5

还是要再次的强调! -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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

使用 -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
  • 1

-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 <
# 是链接文件!
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

原本复制的是链接文件,但是却将链接文件的实际文件复制过来了。也就是说,如果没有加上任何选项时,cp复制的是原始文件,而非链接文件的属性

若要复制链接文件的属性,就得要使用-d的选项了!如上面的cp -d bashrc_slink bashrc_slink_2

范例7:将主文件夹的 .bashrc 和.bash_history 复制到 /tmp 下面

[root@study tmp]# cp ~/.bashrc ~/.bash_history /tmp
  • 1

可以将多个数据一次复制到同一个目录去!最后面一定是目录

光说不练假把式
大展身手吧:用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
  • 1
  • 2
  • 3
  • 4

由于 dmtsai 的身份并不能随意修改文件的拥有者与群组,因此虽然能够复制wtmp的相关权限与时间等属性, 但是与拥有者、群组相关的,原本 dmtsai 身份无法进行的动作,即使加上-a 选项,也是无法达成完整复制权限的。

所以,使用cp指令复制时,你必须要清楚的了解到:

  • 是否需要完整的保留来源文件的信息?
  • 来源文件是否为链接文件 (symbolic link file)?
  • 来源文件是否为特殊的文件,例如 FIFO, socket 等?
  • 来源文件是否为目录?

rm命令

Linux rm命令用于删除一个文件或者目录

语法:rm [options] name…

参数

参数含义
-i询问模式,删除前逐一询问确认
-fforce,即使原档案属性设为唯读,亦直接删除,无需逐一确认
-r将目录及以下之档案亦逐一删除

范例1:将刚刚在 cp 的范例中创建的 bashrc 删除掉

[root@study ~]# cd /tmp
[root@study tmp]# rm -i bashrc
rm: remove regular file `bashrc'? y
  • 1
  • 2
  • 3

加上 -i 的选项就会主动询问,避免你删除到错误的文件名。

范例2:通过万用字符*的帮忙,将/tmp下面开头为bashrc的文件名通通删除:

[root@study tmp]# rm -i bashrc*
  • 1

注意星号*,代表的是 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 中断
.....(中间省略).....
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

因为身份是 root ,默认已经加入了 -i 的选项,所以你要一直按 y 才会删除。
如果不想要继续按 y ,可以按下“ [ctrl]-c ”来结束 rm 的工作。
这是一种保护的动作,如果确定要删除掉此目录而不要询问,可以这样做:

[root@study tmp]# \rm -r /tmp/etc
  • 1

在指令前加上反斜线,可以忽略掉 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-
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

删除当前目录下的所有文件及目录(谨慎使用!删库跑路)

rm -r  * 
  • 1

文件一旦通过rm命令删除,则无法恢复,所以必须格外小心地使用该命令。

mv命令

Linux mv命令用来为文件或目录改名、或将文件或目录移入其它位置

语法

mv [options] source dest
mv [options] source... directory
  • 1
  • 2

参数说明

参数含义
-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
  • 1
  • 2
  • 3
  • 4

范例2:将刚刚的目录名称更名为 mvtest2

[root@study tmp]# mv mvtest mvtest2
  • 1

其实在 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
  • 1
  • 2
  • 3

注意,如果有多个来源文件或目录,则最后一个目标文件一定是“目录”也就是说,将所有的数据移动到该目录的意思。

参考《鸟哥的 Linux 私房菜:基础版》.pdf。整理不易
学习永无止境

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/83086
推荐阅读
相关标签
  

闽ICP备14008679号