2.2 任务2 熟练使用文件目录类命令

文件目录类命令是对文件和目录进行各种操作的命令。

2.2.1 子任务1 熟练使用浏览目录类命令

1. pwd命令

pwd命令用于显示用户当前所处的目录。如果用户不知道自己当前所处的目录,就必须使用它。例如:

 [root@RHEL7-1 etc]# pwd 
 /etc 

2. cd命令

cd命令用来在不同的目录中进行切换。用户在登录系统后,会处于用户的家目录($HOME)中,该目录一般以/home开始,后跟用户名,这个目录就是用户的初始登录目录(root用户的家目录为/root)。如果用户想切换到其他的目录中,就可以使用cd命令,后跟想要切换的目录名。例如:

 [root@RHEL7-1 etc]# cd       //改变目录位置至用户登录时的工作目录
 [root@RHEL7-1 ~]# cd dir1   //改变目录位置至当前目录下的dir1子目录下
 [root@RHEL7-1 dir1]# cd ~   //改变目录位置至用户登录时的工作目录(用户的家目录) 
 [root@RHEL7-1 ~]# cd ..        //改变目录位置至当前目录的父目录
 [root@RHEL7-1 /]# cd         //改变目录位置至用户登录时的工作目录
 [root@RHEL7-1 ~]# cd ../etc   //改变目录位置至当前目录的父目录下的etc 子目录下
 [root@RHEL7-1 etc]# cd /dir1/subdir1 //利用绝对路径表示改变目录到 /dir1/ 
subdir1目录下

说明:在Linux系统中,用“.”代表当前目录;用“..”代表当前目录的父目录;用“~”代表用户的个人家目录(主目录)。例如,root用户的个人主目录是/root,则不带任何参数的“cd”命令相当于“cd ~”,即将目录切换到用户的家目录。

3. ls命令

ls命令用来列出文件或目录信息。该命令的语法为

 ls  [参数]  [目录或文件] 

ls命令的常用参数选项如下。

•-a:显示所有文件,包括以“。”开头的隐藏文件。

•-A:显示指定目录下所有的子目录及文件,包括隐藏文件。但不显示“。”和“..”。

•-c:按文件的修改时间排序。

•-C:分成多列显示各行。

•-d:如果参数是目录,则只显示其名称而不显示其下的各个文件。往往与“-l”选项一起使用,以得到目录的详细信息。

•-l:以长格形式显示文件的详细信息。

•-i:在输出的第一列显示文件的i节点号。

例如:

 [root@RHEL7-1 ~]#ls    //列出当前目录下的文件及目录
 [root@RHEL7-1 ~]#ls -a    //列出包括以“.”开始的隐藏文件在内的所有文件
 [root@RHEL7-1 ~]#ls -t    //依照文件最后修改时间的顺序列出文件
 [root@RHEL7-1 ~]#ls -F    //列出当前目录下的文件名及其类型
 //以/ 结尾表示为目录名,以* 结尾表示为可执行文件,以@结尾表示为符号连接
 [root@RHEL7-1 ~]#ls -l  //列出当前目录下所有文件的权限、所有者、文件大小、修改时
间及名称
 [root@RHEL7-1 ~]#ls -lg //同上,并显示出文件的所有者工作组名
 [root@RHEL7-1 ~]#ls -R  //显示出目录下以及其所有子目录的文件名 

2.2.2 子任务2 熟练使用浏览文件类命令

1. cat命令

cat命令主要用于滚屏显示文件内容或是将多个文件合并成一个文件。该命令的语法为

 cat [参数] 文件名

cat命令的常用参数选项如下。

•-b:对输出内容中的非空行标注行号。

•-n:对输出内容中的所有行标注行号。

通常使用cat命令查看文件内容,但是cat命令的输出内容不能够分页显示,要查看超过一屏的文件内容,需要使用more或less等其他命令。如果在cat命令中没有指定参数,则cat会从标准输入(键盘)中获取内容。

例如,要查看/soft/file1文件内容的命令为

 [root@RHEL7-1 ~]#cat  /soft/file1 

利用cat命令还可以合并多个文件。例如,要把file1和file2文件的内容合并为file3,且file2文件的内容在file1文件的内容前面,则命令为

 [root@RHEL7-1 ~]# cat file2 file1>file3  
 //如果file3文件存在,则此命令的执行结果会覆盖file3文件中原有内容
 [root@RHEL7-1 ~]# cat file2 file1>file3  
 //如果file3文件存在,此命令的执行结果将把file2和file1文件的内容附加到file3文件中
原有内容的后面。

2. more命令

在使用cat命令时,如果文件太长,用户只能看到文件的最后一部分。这时可以使用more命令,一页一页地分屏显示文件的内容。more命令通常用于分屏显示文件内容。大部分情况下,可以不加任何参数选项执行more命令查看文件内容。执行more命令后,进入more状态,按“Enter”键可以向下移动一行,按“Space”键可以向下移动一页;按“Q”键可以退出more命令。该命令的语法为

 more  [参数]  文件名 

more命令的常用参数选项如下。

•-num:这里的num是一个数字,用来指定分页显示时每页的行数。

•+num:指定从文件的第num行开始显示。

例如:

 [root@RHEL7-1 ~]#more file1         // 以分页方式查看file1文件的内容
 [root@RHEL7-1 ~]#cat file1 | more     // 以分页方式查看file1文件的内容 

more命令经常在管道中被调用,以实现各种命令输出内容的分屏显示。上面的第二个命令就是利用shell的管道功能分屏显示file1文件的内容。关于管道的内容在项目7中有详细介绍。

3. less命令

less命令是more命令的改进版,比more命令的功能强大。more命令只能向下翻页,而less命令可以向下、向上翻页,甚至可以前后左右移动。执行less命令后,进入了less状态,按“Enter”键可以向下移动一行,按“Space”键可以向下移动一页,按“B”键可以向上移动一页,也可以用光标键向前、后、左、右移动,按“Q”键可以退出less命令。

less命令还支持在一个文本文件中进行快速查找。先按下斜杠键“/”,再输入要查找的单词或字符。less命令会在文本文件中进行快速查找,并把找到的第一个搜索目标高亮度显示。如果希望继续查找,就再次按下斜杠键“/”,再按“Enter”键即可。

less命令的用法与more基本相同,例如:

 [root@RHEL7-1 ~]#less /etc/httpd/conf/httpd.conf   // 以分页方式查看
httpd.conf文件的内容 

4. head命令

head命令用于显示文件的开头部分,默认情况下只显示文件的前10行内容。该命令的语法为

 head  [参数]  文件名 

head命令的常用参数选项如下。

•-n num:显示指定文件的前num行。

•-c num:显示指定文件的前num个字符。

例如:

 [root@RHEL7-1 ~]#head  -n  20  /etc/httpd/conf/httpd.conf   //显示
httpd.conf文件的前20行 

5. tail命令

tail命令用于显示文件的末尾部分,默认情况下,只显示文件的末尾10行内容。该命令的语法为

 tail  [参数]  文件名 

tail命令的常用参数选项如下。

•-n num:显示指定文件的末尾num行。

•-c num:显示指定文件的末尾num个字符。

•+num:从第num行开始显示指定文件的内容。

例如:

 [root@RHEL7-1 ~]#tail  -n  20  /etc/httpd/conf/httpd.conf   //显示
httpd.conf文件的末尾20行 

tail命令最强悍的功能是可以持续刷新一个文件的内容,当想要实时查看最新日志文件时,这特别有用。此时的命令格式为“tail -f文件名”:

 [root@RHEL7-1 ~]# tail -f /var/log/messages 
 May  2 21:28:24 localhost dbus-daemon: dbus[815]: [system] Activating via
 temd: service name='net.reactivated.Fprint' unit='fprintd.service' 
systemd: service name='net.reactivated.Fprint' unit='fprintd.service' 
 …… 
 May  2 21:28:24 localhost systemd: Started Fingerprint Authentication Daemon.
 May  2 21:28:28 localhost su: (to root) yangyun on pts/0 
 May  2 21:28:54 localhost journal: No devices in use, exit 

2.2.3 子任务3 熟练使用目录操作类命令

1. mkdir命令

mkdir命令用于创建一个目录。该命令的语法为

 mkdir  [参数]  目录名 

上述目录名可以为相对路径,也可以为绝对路径。

mkdir命令的常用参数选项如下。

-p:在创建目录时,如果父目录不存在,则同时创建该目录及该目录的父目录。

例如:

 [root@RHEL7-1 ~]#mkdir dir1   //在当前目录下创建dir1子目录
 [root@RHEL7-1 ~]#mkdir –p dir2/subdir2 
 //在当前目录的dir2目录中创建subdir2子目录,如果dir2目录不存在,则同时创建 

2. rmdir命令

rmdir命令用于删除空目录。该命令的语法为

 rmdir  [参数]  目录名 

上述目录名可以为相对路径,也可以为绝对路径。但所删除的目录必须为空目录。

rmdir命令的常用参数选项如下。

-p:在删除目录时,一同删除父目录,但父目录中必须没有其他目录及文件。

例如:

 [root@RHEL7-1 ~]#rmdir dir1   //在当前目录下删除dir1空子目录
 [root@RHEL7-1 ~]#rmdir -p dir2/subdir2   
 //删除当前目录中dir2/subdir2子目录,//删除subdir2目录时,如果dir2目录中无其他目录,
则一起删除

2.2.4 子任务4 熟练使用cp命令

1. cp命令的使用方法

cp命令主要用于文件或目录的复制。该命令的语法为

 cp  [参数]  源文件   目标文件 

cp命令的常用参数选项如下。

•-a:尽可能将文件状态、权限等属性照原状予以复制。

•-f:如果目标文件或目录存在,先删除它们再进行复制(即覆盖),并且不提示用户。

•-i:如果目标文件或目录存在,提示是否覆盖已有的文件。

•-R:递归复制目录,即包含目录下的各级子目录。

2. 使用cp命令的范例

复制(cp)这个指令是非常重要的,不同身份者执行这个指令会有不同的结果产生,尤其是-a、-p选项,对于不同身份来说,差异非常大。下面的练习中,有的身份为root,有的身份为一般账号(在这里用bobby这个账号),练习时请特别注意身份的差别。请观察下面的复制练习。

【例2-1】用root身份,将家目录下的.bashrc复制到/tmp下,并更名为bashrc。

 [root@RHEL7-1 ~]# cp ~/.bashrc /tmp/bashrc 
 [root@RHEL7-1 ~]# cp –i ~/.bashrc /tmp/bashrc 
 cp: overwrite `/tmp/bashrc'? n 不覆盖,y为覆盖
 # 重复做两次,由于/tmp下已经存在bashrc了,加上-i选项后, 
 # 则在覆盖前会询问使用者是否确定!可以按下n或者y来二次确认 @@

【例2-2】变换目录到/tmp,并将/var/log/wtmp复制到/tmp且观察属性。

 [root@RHEL7-1 ~]# cd    /tmp 
 [root@RHEL7-1 tmp]# cp /var/log/wtmp  . <==想要复制到当前目录,最后的“.”不要忘
 [root@RHEL7-1 tmp]#ls   -l   /var/log/wtmp wtmp 
 -rw-rw-r—1 root utmp 96384 Sep 24 11:54/var/log/wtmp 
 -rw-r—r—1 root root 96384 Sep 24 14:06 wtmp 
 # 注意上面的特殊字体,在不加任何选项复制的情况下,文件的某些属性/权限会改变
 # 这是个很重要的特性,连文件建立的时间也不一样了,要注意 

那如果你想要将文件的所有特性都一起复制过来该怎么办?可以加上-a,如下所示。

 [root@RHEL7-1 tmp]# cp    -a    /var/log/wtmp wtmp_2 
 [root@RHEL7-1 tmp]# ls   -l    /var/log/wtmp wtmp_2 
 -rw-rw-r—1 root utmp 96384 Sep 24 11:54/var/log/wtmp 
 -rw-rw-r—1 root utmp 96384 Sep 24 11:54 wtmp_2 

cp的功能很多,由于我们常常会进行一些数据的复制,所以也会常常用到这个指令。一般来说,如果复制别人的数据(当然,你必须要有read的权限)时,总是希望复制到的数据最后是自己的。所以,在预设的条件中,cp的源文件与目的文件的权限是不同的,目的文件的拥有者通常会是指令操作者本身。

举例来说,例2-2中,由于是root的身份,因此复制过来的文件拥有者与群组就改变成为root所有。由于具有这个特性,所以当我们在进行备份的时候,某些需要特别注意的特殊权限文件。例如,密码文件(/etc/shadow)以及一些配置文件,就不能直接以cp来复制,而必须要加上-a或-p等属性。

注意:如果想要复制文件给其他使用者,也必须要注意文件的权限(包含读、写、执行以及文件拥有者等),否则,其他人还是无法针对你给的文件进行修改。

【例2-3】复制/etc/这个目录下的所有内容到/tmp里面。

 [root@RHEL7-1 tmp]# cp    /etc    /tmp 
 cp:omitting directory`/etc'  <== 如果是目录则不能直接复制,要加上-r的选项
 [root@RHEL7-1 tmp]# cp     -r    /etc  /tmp 
 # 还是要再次强调:-r是可以复制目录,但是,文件与目录的权限可能会被改变
 # 所以,也可以利用“cp    -a    /etc   /tmp”命令,尤其是在备份的情况下 

【例2-4】若~/.bashrc比/tmp/bashrc新才复制过来。

 [root@RHEL7-1 tmp]# cp    -u    ~/.bashrc    /tmp/bashrc 
 # -u的特性是在目标文件与来源文件有差异时,才会复制
 # 所以,常被用于“备份”的工作当中

思考:你能否使用bobby身份,完整地复制/var/log/wtmp文件到/tmp下面,并更名为bobby_wtmp呢?

参考答案:

 [bobby@RHEL7-1 ~]$ cp  -a  /var/log/wtmp  /tmp/bobby_wtmp 
[bobby@RHEL7-1 ~]$ ls  -l  /var/log/wtmp   /tmp/bobby_wtmp 

2.2.5 子任务5 熟练使用文件操作类命令

1. mv命令

mv命令主要用于文件或目录的移动或改名。该命令的语法为

 mv  [参数]  源文件或目录   目标文件或目录 

mv命令的常用参数选项如下。

•-i:如果目标文件或目录存在,则提示是否覆盖目标文件或目录。

•-f:无论目标文件或目录是否存在,直接覆盖目标文件或目录,不提示。

例如:

 //将当前目录下的testa文件移动到/usr/目录下,文件名不变
 [root@RHEL7-1 ~]# mv testa /usr/ 
 //将/usr/testa文件移动到根目录下,移动后的文件名为tt 
 [root@RHEL7-1 ~]# mv /usr/testa /tt 

2. rm命令

rm命令主要用于文件或目录的删除。该命令的语法为

 rm  [参数]  文件名或目录名 

rm命令的常用参数选项如下。

•-i:删除文件或目录时提示用户。

•-f:删除文件或目录时不提示用户。

•-R:递归删除目录,即包含目录下的文件和各级子目录。

例如:

 //删除当前目录下的所有文件,但不删除子目录和隐藏文件
 [root@RHEL7-1 ~]# mkdir /dir1;cd /dir1 
 [root@RHEL7-1 dir1]# touch aa.txt  bb.txt; mkdir subdir11;ll 
 [root@RHEL7-1 dir1]# rm * 
 // 删除当前目录下的子目录subdir11,包含其下的所有文件和子目录,并且提示用户确认
 [root@RHEL7-1 dir]# rm -iR subdir11 

3. touch命令

touch命令用于建立文件或更新文件的修改日期。该命令的语法为

 touch  [参数]  文件名或目录名   

touch命令的常用参数选项如下。

•-d yyyymmdd:把文件的存取或修改时间改为yyyy年mm月dd日。

•-a:只把文件的存取时间改为当前时间。

•-m:只把文件的修改时间改为当前时间。

例如:

 [root@RHEL7-1 ~]# touch aa   
 //如果当前目录下存在aa文件,则把aa文件的存取和修改时间改为当前时间
 //如果不存在aa文件,则新建aa文件
 [root@RHEL7-1 ~]# touch -d 20180808 aa  //将 aa 文件的存取和修改时间改为 2018
年8月8日

4. rpm命令

rpm命令主要用于对RPM软件包进行管理。RPM包是Linux的各种发行版本中应用最为广泛的软件包格式之一。学会使用rpm命令对RPM软件包进行管理至关重要。该命令的语法为

 rpm  [参数]  软件包名 

rpm命令的常用参数选项如下。

•-qa:查询系统中安装的所有软件包。

•-q:查询指定的软件包在系统中是否安装。

•-qi:查询系统中已安装软件包的描述信息。

•-ql:查询系统中已安装软件包里所包含的文件列表。

•-qf:查询系统中指定文件所属的软件包。

•-qp:查询RPM包文件中的信息,通常用于在未安装软件包之前了解软件包中的信息。

•-i:用于安装指定的RPM软件包。

•-v:显示较详细的信息。

•-h:以“#”显示进度。

•-e:删除已安装的RPM软件包。

•-U:升级指定的RPM软件包。软件包的版本必须比当前系统中安装的软件包的版本高才能正确升级。如果当前系统中并未安装指定的软件包,则直接安装。

•-F:更新软件包。

拓展阅读

5. diff命令、n命令、gzip和gunzip命令、tar命令

例如:

 [root@RHEL7-1 ~]#rpm -qa|more        //显示系统安装的所有软件包列表
 [root@RHEL7-1 ~]#rpm -q selinux-policy  //查询系统是否安装了selinux-policy 
 [root@RHEL7-1 ~]#rpm -qi selinux-policy    //查询系统已安装的软件包的描述信息
 [root@RHEL7-1 ~]#rpm -ql selinux-policy    //查询系统已安装的软件包里所包含的文
件列表             
 [root@RHEL7-1 ~]#rpm -qf /etc/passwd //查询passwd文件所属的软件包
 [root@server1 ~]#cd /iso/Packages 
 [root@RHEL7-1 Packages]# rpm -ivh httpd-2.0.52-9.ent.i386.rpm  //安装软件包,
并以“#”显示安装进度和安装的详细信息
 [root@RHEL7-1 Packages ]# rpm -Uvh httpd-2.2.15-26.el6.x86_64.rpm  //升级软件包
 [root@RHEL7-1 Packages ]#rpm -e httpd-2.2.15-26.el6.x86_64  //卸载httpd软件包 

注意:卸载软件包时不加扩展名.rpm,如果使用命令:rpm -e httpd- 2.2.15-26.el6.x86_64–nodeps,则表示不检查依赖性。

5. whereis命令

whereis命令用来寻找命令的可执行文件所在的位置。该命令的语法为

 whereis  [参数]  命令名称 

whereis命令的常用参数选项如下。

•-b:只查找二进制文件。

•-m:只查找命令的联机帮助手册部分。

•-s:只查找源代码文件。

例如:

 //查找命令rpm 的位置
 [root@RHEL7-1 ~]# whereis rpm   
 rpm: /bin/rpm /etc/rpm /usr/lib/rpm /usr/include/rpm /usr/share/man/man8/rpm.8.gz 

6. whatis命令

whatis命令用于获取命令简介。它从某个程序的使用手册中抽出一行简单的介绍性文件,帮助用户迅速了解这个程序的具体功能。该命令的语法为

 whatis  命令名称 

例如:

 [root@RHEL7-1 ~]# whatis ls 
 ls            (1)  - list directory contents 

7. find命令

find命令用于文件查找。它的功能非常强大。该命令的语法为

 find  [路径]   [匹配表达式] 

find命令的匹配表达式主要有以下几种类型。

•-name filename:查找指定名称的文件。

•-user username:查找属于指定用户的文件。

•-group grpname:查找属于指定组的文件。

•-print:显示查找结果。

•-size n:查找大小为n块的文件,一块为512B。符号“+n”表示查找大小大于n块的文件;符号“-n”表示查找大小小于n块的文件;符号“nc”表示查找大小为n个字符的文件。

•-inum n:查找索引节点号为n的文件。

•-type:查找指定类型的文件。文件类型有:b(块设备文件)、c(字符设备文件)、d(目录)、p(管道文件)、l(符号链接文件)、f(普通文件)。

•-atime n:查找n天前被访问过的文件。“+n”表示超过n天前被访问的文件;“-n”表示未超过n天前被访问的文件。

•-mtime n:类似于atime,但检查的是文件内容被修改的时间。

•-ctime n:类似于atime,但检查的是文件索引节点被改变的时间。

•-perm mode:查找与给定权限匹配的文件,必须以八进制的形式给出访问权限。

•-newer file:查找比指定文件新的文件,即最后修改时间离现在较近。

•-exec command {} \;:对匹配指定条件的文件执行command命令。

•-ok command {} \;:与exec相同,但执行command命令时请求用户确认。

例如:

 [root@RHEL7-1 ~]# find  .  -type  f  -exec  ls  -l  {}  \; 
 //在当前目录下查找普通文件,并以长格形式显示
 [root@RHEL7-1 ~]# find  /logs  -type  f  -mtime 5  -exec  rm  {}  \; 
 //在/logs目录中查找修改时间为5天以前的普通文件,并删除。保证/logs目录存在
 [root@RHEL7-1 ~]# find  /etc  -name  "*.conf" 
 //在/etc/目录下查找文件名以“.conf”结尾的文件
 [root@RHEL7-1 ~]# find  .  -type  f  -perm 755  -exec  ls {}  \; 
 //在当前目录下查找权限为755的普通文件并显示  

注意:由于find命令在执行过程中将消耗大量资源,所以建议以后台方式运行。

8. locate命令

这个命令是用户在Linux系统中用来查找文件的命令。就像在Windows中搜索一样,如果你忘了存储文件的位置或它的名字,这是非常有用的。

例如,如果你有一个关于区块链用例的文档,但是忘了标题,就可以输入locate-blockchain或者通过用星号分隔单词来查找“blockchain use cases”,或者星号(*)。相关示例如下。

 locate -i*blockchain*use*cases* 

9. grep命令

grep命令用于查找文件中包含有指定字符串的行。该命令的语法为

 grep  [参数]   要查找的字符串   文件名 

grep命令的常用参数选项如下。

•-v:列出不匹配的行。

•-c:对匹配的行计数。

•-l:只显示包含匹配模式的文件名。

•-h:抑制包含匹配模式的文件名的显示。

•-n:每个匹配行只按照相对的行号显示。

•-i:对匹配模式不区分大小写。

在grep命令中,字符“^”表示行的开始,字符“$”表示行的结尾。如果要查找的字符串中带有空格,可以用单引号或双引号括起来。

例如:

 [root@RHEL7-1 ~]# grep -2 root /etc/passwd 
 //在文件passwd中查找包含字符串“root”的行,如果找到,显示该行及该行前后各2行的内容
 [root@RHEL7-1 ~]# grep "^root$" /etc/passwd 
 //在passwd文件中搜索只包含“root”4个字符的行 

提示:grep和find命令的差别在于grep是在文件中搜索满足条件的行,而find是在指定目录下根据文件的相关信息查找满足指定条件的文件。

10. dd命令

dd命令用于按照指定大小和个数的数据块来复制文件或转换文件,格式为“dd [参数]”。

dd命令是一个比较重要而且比较有特色的一个命令,它能够让用户按照指定大小和个数的数据块来复制文件的内容。当然如果愿意的话,还可以在复制过程中转换其中的数据。Linux系统中有一个名为/dev/zero的设备文件,因为这个文件不会占用系统存储空间,但却可以提供无穷无尽的数据,所以可以使用它作为dd命令的输入文件,来生成一个指定大小的文件。dd命令的参数及其作用如表2-1所示。

表2-1 dd命令的参数及其作用

例如,我们可以用dd命令从/dev/zero设备文件中取出两个大小为560MB的数据块,然后保存成名为file1的文件。在理解了这个命令后,以后就能随意创建任意大小的文件了(做配额测试时很有用)

 [root@RHEL7-1 ~]# dd if=/dev/zero of=file1 count=2 bs=560M 
 记录了2+0 的读入
 记录了2+0 的写出
 1174405120字节(1.2 GB)已复制,1.12128 s,1.0 GB/s 

dd命令的功能也绝不仅限于复制文件这么简单。如果您想把光驱设备中的光盘制作成iso格式的镜像文件,在Windows系统中需要借助于第三方软件才能做到,但在Linux系统中可以直接使用dd命令来压制出光盘镜像文件,将它变成一个可立即使用的iso镜像:

 [root@RHEL7-1 ~]# dd if=/dev/cdrom of=RHEL-server-7.0-x86_64.iso 
 7311360+0 records in 
 7311360+0 records out 
 3743416320 bytes (3.7 GB) copied, 370.758 s, 10.1 MB/s