前面两节我们分别学习了目录操作命令和文件操作命令,那么有没有一些既可以操作目录,又可以操作文件的命令呢?
这样我们就不需要记住两套命令了。
其实还真有,今天这一章就带大家学习Linux中目录和文件都能操作的命令
最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。
这是大佬写的, 7701页的BAT大佬写的刷题笔记,让我offer拿到手软
4.1 rm命令
- 命令名称:rm
- 英文原意:remove files or directories
- 所在路径:/bin/rm
- 执行权限:所有用户
- 功能描述:删除文件或目录
1、命令格式
[root@node01 ~]# rm [选项] 文件或目录
选项:
-f: 强制删除(force)
-i: 交互删除,在删除之前会询问用户
-r: 递归删除,可以删除目录(recursive)
2、常见用法
例子1:基本用法
rm命令如果任何选项都不加,则默认执行的是“rm -i文件名”。
也就是在删除一个文件之前会先询问是否删除。
例如:
[root@node01 ~]# touch cxykk.com
[root@node01 ~]# ll
total 40
-rw-------. 1 root root 1230 Apr 18 23:23 anaconda-ks.cfg
-rw-r--r-- 1 root root 0 Apr 29 22:47 cxykk.com
...省略
[root@node01 ~]# rm cxykk.com
rm: remove regular empty file ‘cxykk.com’? y
[root@node01 ~]#
例子2:删除目录
如果需要删除目录,则需要使用“-r”选项。例如:
#递归建立测试目录
[root@node01 ~]# mkdir -p /test/cxykk.com/movie/
#默认不加“-r”选项删除
[root@node01 test]# rm /test/
#无法删除
rm: cannot remove ‘/test/’: Is a directory
[root@node01 test]# rm -r /test/
rm: descend into directory ‘/test/’? y
rm: descend into directory ‘/test/cxykk.com’? y
rm: remove directory ‘/test/cxykk.com/movie’? y
rm: remove directory ‘/test/cxykk.com’? y
rm: remove directory ‘/test/’? y
[root@node01 test]#
大家会发现,如果每级目录和每个文件都需要确认,那么在实际使用中简直是灾难!
那有没有命令可以不用确认直接删除呢?
那当然有了,不然linux运维人员不是苦逼死了
例子3:强制删除
如果要删除的目录中有1万个子目录或子文件,那么普通的rm删除最少需要确认1万次。
所以,在真正删除文件的时候,我们会选择强制删除。例如:
[root@node01 test]# mkdir -p /test/cxykk.com/movie
[root@node01 test]# rm -rf /test/
[root@node01 test]# cd /test
-bash: cd: /test: No such file or directory
[root@node01 test]#
加入了强制功能之后,删除就会变得很简单,但是需要注意:
1、数据强制删除之后无法恢复,除非依赖第三方的数据恢复工具,如extundelete等。
但要注意,数据恢复很难恢复完整的数据,一般能恢复70%~80%就很难得了。
所以,与其把宝压在数据恢复上,不如养成良好的操作习惯。
2、虽然“-rf”选项是用来删除目录的,但是删除文件也不会报错。
所以,为了使用方便,一般不论是删除文件还是删除目录,都会直接使用“-rf”选项。
4.2 cp命令
在windows中,我们如果想要复制文件,直接Ctrl+C就可以了,非常简单快捷。
但是在Linux这种非图形化界面中,想要复制文件就没有那么方便了。
这时候就要借助我们的“cp”命令了,“cp”可以理解为copy的缩写。
cp的基本信息如下:
- 命令名称:cp
- 英文原意:copy files and directories
- 所在路径:/bin/cp
- 执行权限:所有用户
- 功能描述:复制文件和目录
1、命令格式
[root@node01 ~]# cp [选项] 源文件 目标文件
选项:
-a: 相当于-dpr选项的集合,这几个选项我们一一介绍
-d: 如果源文件为软链接(对硬链接无效),则复制出的目标文件也为软链接
-i: 询问,如果目标文件已经存在,则会询问是否覆盖
-l: 把目标文件建立为源文件的硬链接文件,而不是复制源文件
-s: 把目标文件建立为源文件的软链接文件,而不是复制源文件
-p: 复制后目标文件保留源文件的属性(包括所有者、所属组、权限和时间)
-r: 递归复制,用于复制目录
最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。
这是大佬写的, 7701页的BAT大佬写的刷题笔记,让我offer拿到手软
2、常见用法
例子1:基本用法
cp命令不仅可以复制文件,还可以复制目录。我们先来看看如何复制文件,例如:
[root@node01 ~]# touch cxykk.com
[root@node01 ~]# ll
total 40
-rw-------. 1 root root 1230 Apr 18 23:23 anaconda-ks.cfg
-rw-r--r-- 1 root root 0 Apr 29 23:03 cxykk.com
...省略
[root@node01 ~]# cp cxykk.com /tmp/
#我的/tmp/因为已经存在了cxykk.com文件,所以询问我是否覆盖
cp: overwrite ‘/tmp/cxykk.com’? y
[root@node01 ~]#
有的同学说,如果我复制文件的时候,想要给他改个名字,可以改吗?
当然可以
如果需要改名复制,则命令如下:
#复制cxykk.com文件到/tmp/目录下,且重命名为www.cxykk.com
[root@node01 ~]# cp cxykk.com /tmp/www.cxykk.com
[root@node01 ~]# cd /tmp/
[root@node01 tmp]# ll
total 4
-rw-r--r-- 1 nobody root 0 Apr 29 23:03 cxykk.com
lrwxrwxrwx 1 root root 15 Apr 21 11:18 soft-link-new -> /root/soft-link
lrwxrwxrwx 1 root root 15 Apr 21 11:11 soft_link_test -> /root/soft_link
-rw-r--r-- 1 root root 15 Apr 21 10:17 test_hard
drwx------ 2 root root 6 Apr 29 22:42 vmware-root_6388-994818425
-rw-r--r-- 1 root root 0 Apr 29 23:09 www.cxykk.com
#可以看到/tmp/目录下已经有我们复制的www.cxykk.com文件了
[root@node01 tmp]#
接下来我们看看如何复制目录,其实复制目录非常简单,我们只需在复制文件的命令后加上“-r”选项即可,例如:
[root@node01 ~]# mkdir -p cxykk.com
[root@node01 ~]# ll
total 40
-rw-------. 1 root root 1230 Apr 18 23:23 anaconda-ks.cfg
drwxr-xr-x 2 root root 6 Apr 29 23:18 cxykk.com
省略...
[root@node01 ~]# cp -r /root/cxykk.com/ /tmp/
cp: cannot overwrite non-directory ‘/tmp/cxykk.com’ with directory ‘/root/cxykk.com/’
#因为我已经存在一个相同目录,所以先删除
[root@node01 ~]# rm -r /tmp/cxykk.com
rm: remove regular empty file ‘/tmp/cxykk.com’? y
[root@node01 ~]# cp -r /root/cxykk.com/ /tmp/
[root@node01 ~]# cd /tmp/
[root@node01 tmp]# ll
total 4
#可以看到已经复制成功
drwxr-xr-x 2 root root 6 Apr 29 23:20 cxykk.com
lrwxrwxrwx 1 root root 15 Apr 21 11:18 soft-link-new -> /root/soft-link
省略...
[root@node01 tmp]#
例子2:复制软链接
如果源文件不是一个普通文件,而是一个软链接文件,那么是否可以复制软链接的属性呢?
下面带大家一起来试试:
实践是检验真理的唯一标准
#建立一个测试软链接文件,如果已存在,请先使用rm -rf xxx删除
[root@node01 ~]# touch /root/cxykk.com
[root@node01 ~]# ln -s /root/cxykk.com /tmp/cxykk.com_slink
[root@node01 ~]# ll /tmp/cxykk.com_slink
lrwxrwxrwx 1 root root 15 May 6 22:37 /tmp/cxykk.com_slink -> /root/cxykk.com
#复制软链接文件,但是不加“-d”选项参数
[root@node01 ~]# cp /tmp/cxykk.com_slink /tmp/cxykk.com_slink2
[root@node01 ~]# ll /tmp/cxykk.com_slink2
-rw-r--r-- 1 root root 0 May 6 22:40 /tmp/cxykk.com_slink2
#复制软链接文件,加“-d”选项参数
[root@node01 ~]# cp -d /tmp/cxykk.com_slink /tmp/cxykk.com_slink3
[root@node01 ~]# ll /tmp/cxykk.com_slink3
lrwxrwxrwx 1 root root 15 May 6 22:41 /tmp/cxykk.com_slink3 -> /root/cxykk.com
[root@node01 ~]#
这个例子说明
如果在复制软链接文件时不使用“-d”选项,则cp命令复制的是源文件,而不是软链接文件;
只有加入了“-d”选项,才会复制软链接文件。请大家注意,“-d”选项对硬链接是无效的。:
例子3:保留源文件属性复制
在上面的例子中,细心的同学可能会发现,在执行复制命令后,目标文件的时间会变成复制命令的执行时间,而不是源文件的时间。
例如:
#复制软链接文件,加“-d”选项参数
[root@node01 ~]# cp -d /tmp/cxykk.com_slink /tmp/cxykk.com_slink3
[root@node01 ~]# ll /tmp/cxykk.com_slink3
#注意源文件的所属组和时间
#由于复制命令由root执行,所以目标文件的所属组也变成了root,而且时间变成了复制命令的时间
lrwxrwxrwx 1 root root 15 May 6 22:41 /tmp/cxykk.com_slink3 -> /root/cxykk.com
但是,当我们在执行一些特殊复制场景时,文件的时间可能是一个重要的参数,我们希望在复制的时候,能够保留源文件的属性复制,那么该怎么办呢?
办法当然也是有的, 这就需要“-p”选项参数上场了。
这个选项会保留源文件的属性,包括所有者、所属组和时间。
例如:
[root@node01 ~]# cp -p /root/cxykk.com /tmp/cxykk.com_p
[root@node01 ~]# ll /tmp/cxykk.com_p
#复制出来的文件所属组和执行时间都保留了源文件的属性
-rw-r--r-- 1 root root 0 May 6 22:35 /tmp/cxykk.com_p
[root@node01 ~]#
我们之前讲过,“-a”选项相当于“-dpr”选项,这几个选项我们已经分别讲过了。
所以,当我们使用“-a”选项时,目标文件和源文件的所有属性都一致,包括源文件的所有者、所属组、时间和软链接属性。
所以,使用“-a”选项来取代“-dpr”选项更加方便
例子4:“-l”和“-s”选项
- -l: 把目标文件建立为源文件的硬链接文件,而不是复制源文件
- -s: 把目标文件建立为源文件的软链接文件,而不是复制源文件
这两个选项和“-d”选项是不同的,“-d”选项要求源文件必须是软链接,目标文件才会复制为软链接;
而“-l”和“-s”选项的源文件只需是普通文件,目标文件就可以直接复制为硬链接和软链接。
例如:
#查看cxykk.com文件,测试文件
[root@node01 ~]# ll /root/cxykk.com
#使用“-l”选项,将目标文件复制为硬链接
[root@node01 ~]# cp /root/cxykk.com /tmp/cxykk.com_ll
#查看复制后的文件,为硬链接文件
[root@node01 ~]# ll /tmp/cxykk.com_ll
-rw-r--r-- 1 root root 0 May 6 22:58 /tmp/cxykk.com_ll
#使用“-s”选项,将目标文件复制为软链接文件
[root@node01 ~]# cp -s /root/cxykk.com /tmp/cxykk.com_ss
#查看复制后的文件,为软链接文件
[root@node01 ~]# ll /tmp/cxykk.com_ss
lrwxrwxrwx 1 root root 15 May 6 22:59 /tmp/cxykk.com_ss -> /root/cxykk.com
[root@node01 ~]#
4.3 mv命令
1、基本信息
mv是用来剪切的命令,其基本信息如下:
- 命令名称:mv
- 英文原意:move (rename) files
- 所在路径:/bin/mv
- 执行权限:所有用户
- 功能描述:移动文件或改名
最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。
这是大佬写的, 7701页的BAT大佬写的刷题笔记,让我offer拿到手软
2、命令格式
[root@node01 ~]# mv [选项] 源文件 目标文件
选项:
-f: 强制覆盖,如果目标文件已经存在,则不询问,直接强制覆盖
-i: 交互移动,如果目标文件已经存在,则询问用户是否覆盖(默认选项)
-n: 如果目标文件已经存在,则不会覆盖移动,而且不询问用户
-v: 显示详细信息
3、常见用法
例子1:移动文件或目录
#创建mv命令测试文件
[root@node01 ~]# touch cxykk.com_mv
[root@node01 ~]# ll
------. 1 root root 1230 Apr 18 23:23 anaconda-ks.cfg
-rw-r--r-- 1 root root 0 May 6 22:35 cxykk.com
-rw-r--r-- 1 root root 0 May 6 23:07 cxykk.com_mv
......省略
#移动/root/cxykk.com_mv到/tmp/目录下,且源文件会删除,类似于剪切
[root@node01 ~]# mv cxykk.com_mv /tmp
[root@node01 ~]# ll /tmp/
total 0
-rw-r--r-- 1 root root 0 May 6 22:58 cxykk.com_ll
-rw-r--r-- 1 root root 0 May 6 23:07 cxykk.com_mv
......省略
#查看源文件~当前目录下,已经没有cxykk.com_mv文件了
[root@node01 ~]# ll
total 40
-rw-------. 1 root root 1230 Apr 18 23:23 anaconda-ks.cfg
-rw-r--r-- 1 root root 0 May 6 22:35 cxykk.com
drwxr-xr-x 2 root root 6 Oct 25 2023 etc
......省略
You have new mail in /var/spool/mail/root
[root@node01 ~]#
例子2:强制移动
在windows移动文件时,是不是经常遇到下面这种提示,每次都需要我们手动点击确认才能完成移动
在Linux系统中,默认移动文件如果存在相同名称的文件,也会提示是否覆盖。
例如:
#在/tmp目录下创建一个与/root目录下同名的文件
[root@node01 ~]# touch /tmp/cxykk.com
[root@node01 ~]# ll /tmp
total 0
-rw-r--r-- 1 root root 0 May 6 23:15 cxykk.com
-rw-r--r-- 1 root root 0 May 6 22:58 cxykk.com_ll
......省略
#移动~目录下的cxykk.com文件到/tmp目录下
[root@node01 ~]# mv cxykk.com /tmp/
#询问是否覆盖,输入y覆盖,输入n不覆盖
mv: overwrite ‘/tmp/cxykk.com’? y
[root@node01 ~]#
这时如果移动的同名文件较多,则需要一个一个文件进行确认,很不方便。
如果我们确认需要覆盖已经存在的同名文件,不想一个一个确认该怎么办呢?
那就可以使用“-f”选项参数了
-f: 强制覆盖,如果目标文件已经存在,则不询问,直接强制覆盖
#在家目录下重新创建cxykk.com同名文件
[root@node01 ~]# touch cxykk.com
[root@node01 ~]# ll
total 40
-rw-------. 1 root root 1230 Apr 18 23:23 anaconda-ks.cfg
-rw-r--r-- 1 root root 0 May 6 23:20 cxykk.com
......省略
#强制覆盖移动,可以看到没有询问是否覆盖,直接覆盖成功
[root@node01 ~]# mv -f cxykk.com /tmp/
[root@node01 ~]#
例子3:不覆盖移动
既然可以强制覆盖移动,那也有需要不覆盖的移动场景。
如果需要移动几百个同名文件,但是不想覆盖,这时就需要“-n”选项的帮助了。
例如:
#在家目录下建立测试文件cxykk.com、cxykk.com_nn
[root@node01 ~]# touch cxykk.com_nn
[root@node01 ~]# touch cxykk.com
[root@node01 ~]# ll
-rw-------. 1 root root 1230 Apr 18 23:23 anaconda-ks.cfg
-rw-r--r-- 1 root root 0 May 6 23:24 cxykk.com
-rw-r--r-- 1 root root 0 May 6 23:24 cxykk.com_nn
......省略
#移动家目录下cxykk.com、cxykk.com_nn到/tmp目录下
[root@node01 ~]# mv -vn cxykk.com cxykk.com_nn /tmp/
#从移动详情中可以看出,只移动了cxykk.com_nn文件,cxykk.com并没有移动
#因为cxykk.com文件在/tmp目录下已经存在了
#“-v”选项输出详细移动信息
‘cxykk.com_nn’ -> ‘/tmp/cxykk.com_nn’
[root@node01 ~]#
补充知识:
如果想要看到详细移动日志,可以加上“-v”选项参数
例子4:改名
我们上面都是从一个目录移动到另一个目录中,如果将一个文件在同一个目录下移动会怎么样呢?
下面我们来实践一下看看
#查看家目录下cxykk.com文件
[root@node01 ~]# ll
-rw-------. 1 root root 1230 Apr 18 23:23 anaconda-ks.cfg
-rw-r--r-- 1 root root 0 May 6 23:24 cxykk.com
......省略
#在同一个目录下移动
[root@node01 ~]# mv cxykk.com cxykk.com_new
[root@node01 ~]# ll
-rw-------. 1 root root 1230 Apr 18 23:23 anaconda-ks.cfg
#可以看到cxykk.com文件不在了,变成了cxykk.com_new文件了
-rw-r--r-- 1 root root 0 May 6 23:24 cxykk.com_new
drwxr-xr-x 2 root root 6 Oct 25 2023 etc
......省略
[root@node01 ~]#
看到这里明白了吧,如果源文件和目标文件在同一个目录中,那就是改名。
所以以后在linux如果想要把一个文件改名字,知道怎么操作了吧
本文总结
目录和文件都能操作的命令是我们在日常运维中比较常用的,所以是大家重点要掌握的。
毕竟记住一个命令可以干两件事
在这里也给大家提一个小的建议,不要只看,要亲自动手实践操作感受一遍,并且运用一定的记忆技巧来记住这些命令。
比如mv命令,大家可以想到move(移动)这个单词。其他很多命令都有类似的技巧。
切勿眼高手低。我们要做到我要么不学,一旦开始学了,我就学透它,不然时间也浪费了,还没有收获
最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。
这是大佬写的, 7701页的BAT大佬写的刷题笔记,让我offer拿到手软