第二周博客作业

一、Linux发行版目录名称命名规则以及用途

1、目录结构

登录系统后,在当前命令窗口下输入命令ls /

[root@Centos8 ~]# ls /
bin   data  etc   lib    media  mnt  opt   root  sbin  sys      tmp  var
boot  dev   home  lib64  misc   net  proc  run   srv   testdir  usr

树状目录结构:
在这里插入图片描述
Linux的文件系统分层结构:FHS Filesystem Hierarchy Standard

目前最新的标准是2.3版本:http://www.pathname.com/fhs/

​​​2、目录遵循的命名规则

  • 文件和目录被组织成一个单根倒置树结构
  • 文件系统从根目录下开始,用“/”表示
  • 根文件系统(rootfs):root filesystem
  • 标准Linux文件系统(如:ext4),文件名称大小写敏感,例如:MAIL, Mail, mail, mAiL
  • 以 . 开头的文件为隐藏文件
  • 用“/”分隔路径
  • 文件名最长255个字节
  • 包括路径在内文件名称最长4095个字节
  • 蓝色–>目录 绿色–>可执行文件 红色–>压缩文件 浅蓝色–>链接文件 灰色–>其他文件
  • 除了斜杠和NUL,所有字符都有效.但使用特殊字符的目录名和文件不推荐使用,有些字符需要用引号来引用
  • 每个文件都有两类相关数据:元数据:metadata,即属性, 数据:data,即文件内容

3、文件系统目录功能

基本目录功能

  • /boot:这里存放的是启动 Linux 时使用的一些核心文件,如:内核文件(vmlinuz)、引导加载器( boot loader的、grub)放于此
  • /bin :bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令
  • /sbin :s 就是 Super User 的意思,是 Superuser Binaries (超级用户的二进制文件) 的缩写,这里存放的是系统管理员使用的系统管理程序
  • /dev :存储特殊文件(tty虚拟终端之类)和设备文件(字符设备(键盘、显示器)、块设备(硬盘、光盘))
    • b:block device,随机访问
    • c:character device,线性访问
  • /etc:etc 是 Etcetera(等等) 的缩写,这个目录用来存放所有的系统管理所需要的配置文件和子目录
  • /home:用户的主目录,在 Linux 中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的,如上图中的 alice、bob 和 eve
  • /root:root用户家目录
  • /lib:lib 是 Library(库) 的缩写这个目录里存放着系统最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件。几乎所有的应用程序都需要用到这些共享库
    • libc.so.*:动态链接的c库
    • ld*:运行时链接器/加载器
    • modules:用于存储内核模块的目录
  • /lib64:64位系统特有的存放64位共享库的路径
  • /media:linux 系统会自动识别一些设备,例如U盘、光驱等等,当识别后,Linux 会把识别的设备挂载到这个目录下。
  • /mnt:临时文件系统挂载点,系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在 /mnt/ 上,然后进入该目录就可以查看光驱里的内容了。
  • /opt:附加程序的安装位置,opt 是 optional(可选) 的缩写,这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的
  • /srv:该目录存放一些服务启动之后需要提取的数据
  • /tmp:临时文件(temporary files)(可供所有用户执行写入操作)
  • /usr:usr 是 unix shared resources(共享资源) 的缩写,这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于 windows 下的 program files 目录
    • bin:非系统启动时用到的程序
    • sbin:非系统启动时用到的系统程序
    • include:c程序的头文件(header files)
    • lib:程序依赖的库
    • lib64:程序依赖的库(64位)
    • local:用来安装本地应用程序(又一个层级目录),第三方程序
      (比如在MacOS下,brew安装的程序都会安装在usr/local/bin下)
    • share:命令man手册页,命令自带文档
      • /usr/share/dict/words 暴力破解的密码表(弱口令)
    • src:某些程序的源代码
  • /var:可变数据文件(系统日志、缓存文件)
    • log
    • cache
    • mail
  • /proc:proc 是 Processes(进程) 的缩写,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。
    这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器:
    echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
    
    • /proc/cpuinfo
    • /proc/partitions
  • /sys:这是 Linux2.6 内核的一个很大的变化。该目录下安装了 2.6 内核中新出现的一个文件系统 sysfs 。
    sysfs 文件系统集成了下面3种文件系统的信息:针对进程信息的 proc 文件系统、针对设备的 devfs 文件系统以及针对伪终端的 devpts 文件系统。
    该文件系统是内核设备树的一个直观反映。
    当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建(see also: https://www.ibm.com/developerworks/cn/linux/l-cn-sysfs/)

注意:在 Linux 系统中,有几个目录是比较重要的,平时需要注意不要误删除或者随意更改内部文件

  • /etc:这个是系统中的配置文件,如果你更改了该目录下的某个文件可能会导致系统不能启动
  • /bin, /sbin, /usr/bin,/usr/sbin:系统预设的执行文件的放置目录,比如 ls 就是在 /bin/ls 目录下。
  • /bin, /usr/bin 是给系统用户使用的指令(除root外的通用户),而/sbin、 /usr/sbin 则是给 root 使用的指令。
  • /var: 一个非常重要的目录,系统上跑了很多程序,每个程序都会有相应的日志产生,而这些日志就被记录到这个目录下,具体在 /var/log 目录下,另外 mail 的预设放置也是在这里(/var/spool/mail)。

二、描述文件的元数据信息有哪些,分别表示什么含义?如何查看?如何修改文件的时间戳信息?

参考文章:http://www.cnblogs.com/adforce/p/3522433.html

1、元数据(meta data)

概念:每个文件的属性信息,比如:文件的大小,时间,类型等,称为文件的元数据(meta data)

位置:元数据是存放在node(index node)表中。node 表中有很多条记录组成,第一条记录对应的存放了一个文件的元数据信息

元数据信息分类

第一个node表记录对应的元数据信息:

  • inode number 节点号
  • 文件类型
  • 文件的读、写、执行权限
  • 文件所有者UID
  • 文件所属组GID
  • 链接数(指向这个文件名路径名称个数)
  • 该文件的大小和不同的时间戳
  • 指向磁盘上文件的数据块指针
  • 有关文件的其他数据

2、inode概念和结构

inode概念

理解inode,要从文件储存说起。

文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。

操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个sector组成一个block。

文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元数据信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。

每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。

inode结构

在这里插入图片描述
文件系统如何存取文件:
1、根据文件名,通过Directory里的对应关系,找到文件对应的Inode number
2、再根据Inode number读取到文件的Inode table
3、再根据Inode table中的Pointer读取到相应的Blocks

这里有一个重要的内容,就是Directory,他不是我们通常说的目录,而是一个列表,记录了一个文件/目录名称对应的Inode number。如下图:
在这里插入图片描述

inode表和目录

目录是个特殊文件,目录文件的内容保存了此目录中文件的列表及inode number对应关系

  • 文件引用一个是 inode号
  • 人是通过文件名来引用一个文件
  • 一个目录是目录下的文件名和文件inode号之间的映射
    在这里插入图片描述

3、inode大小

inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息

每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。

使用df -ih查看每个硬盘分区的inode总数和已经使用的数量

[root@Centos8 ~]# df -ih
Filesystem          Inodes IUsed IFree IUse% Mounted on
devtmpfs               91K   381   90K    1% /dev
tmpfs                  98K     1   98K    1% /dev/shm
tmpfs                  98K   694   98K    1% /run
tmpfs                  98K    17   98K    1% /sys/fs/cgroup
/dev/mapper/cl-root    23M   68K   23M    1% /
/dev/mapper/cl-data    23M    10   23M    1% /data
/dev/sda1             512K   302  512K    1% /boot
tmpfs                  98K     6   98K    1% /run/user/0
[root@Centos8 ~]#

使用dumpe2fs -h /dev/hda | grep "Inode size"查看每个inode节点的大小

4、查看inode信息

每个inode都有一个号码,操作系统用inode号码来识别不同的文件。

Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号

表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:

  • 系统找到这个文件名对应的inode号码
  • 通过inode号码,获取inode信息
  • 最后,根据inode信息,找到文件数据所在的block,读出数据

示例1:使用stat命令,查看某个文件的inode详细信息

[root@Centos8 ~]# stat welcome.txt 
  File: welcome.txt
  Size: 34        	Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d	Inode: 102640660   Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2020-12-23 18:10:52.030752314 +0800
Modify: 2020-12-23 18:09:58.860749310 +0800
Change: 2020-12-23 18:09:58.860749310 +0800
 Birth: -
[root@Centos8 ~]#

示例2:使用ls -i命令,可以看到文件名对应的inode号码

[root@Centos8 ~]# ls -i welcome.txt 
102640660 welcome.txt
[root@Centos8 ~]#

示例3:使用ls -di /boot 命令,可以看到文件夹对应的inode号码

[root@Centos8 /]# ls -di /boot
128 /boot

示例4:使用df -ih命令,查看每个硬盘分区的inode总数和已经使用的数量

[root@Centos8 /]# df -ih
Filesystem          Inodes IUsed IFree IUse% Mounted on
devtmpfs               91K   381   90K    1% /dev
tmpfs                  98K     1   98K    1% /dev/shm
tmpfs                  98K   697   98K    1% /run
tmpfs                  98K    17   98K    1% /sys/fs/cgroup
/dev/mapper/cl-root    23M   68K   23M    1% /
/dev/mapper/cl-data    23M    10   23M    1% /data
/dev/sda1             512K   302  512K    1% /boot
tmpfs                  98K     6   98K    1% /run/user/0
[root@Centos8 /]# 

5、命令和inode关系

cp 命令

  • 分配一个空闲的inode号,在inode表中生成新条目
  • 在目录中创建一个目录项,将名称与inode编号关联
  • 拷贝数据生成新的文件

rm命令

  • 链接数递减,从而释放的inode号可以被重用
  • 把数据块放在空闲列表中
  • 删除目录项
  • 数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖

mv命令

  • 如果mv命令的目标和源在相同的文件系统,作为mv 命令
    用新的文件名创建对应新的目录项、删除旧目录条目对应的旧的文件名,不影响inode表(除时间戳)或磁盘上的数据位置:没有数据被移动!
  • 如果目标和源在一个不同的文件系统, mv相当于cp和rm

6、修改时间戳

示例:修改文件的时间戳

[root@Centos8 data]# stat aa.txt  ==>查看文件当前时间戳
  File: aa.txt
  Size: 11        	Blocks: 8          IO Block: 4096   regular file
Device: fd02h/64770d	Inode: 132         Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:default_t:s0
Access: 2021-02-19 09:49:54.679967033 +0800
Modify: 2021-02-19 09:49:54.679967033 +0800
Change: 2021-02-19 09:49:54.679967033 +0800
 Birth: -
[root@Centos8 data]# touch -a aa.txt ==> 修改文件的atime,发现ctime跟着一起改变,因为ctime是元数据信息,包括了文件的时间等
[root@Centos8 data]# stat aa.txt 
  File: aa.txt
  Size: 11        	Blocks: 8          IO Block: 4096   regular file
Device: fd02h/64770d	Inode: 132         Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:default_t:s0
Access: 2021-02-19 09:59:39.924951729 +0800
Modify: 2021-02-19 09:49:54.679967033 +0800
Change: 2021-02-19 09:59:39.924951729 +0800 
 Birth: -
[root@Centos8 data]# touch -c aa.txt ==>修改文件ctime
[root@Centos8 data]# stat aa.txt 
  File: aa.txt
  Size: 11        	Blocks: 8          IO Block: 4096   regular file
Device: fd02h/64770d	Inode: 132         Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:default_t:s0
Access: 2021-02-19 10:00:07.095951019 +0800
Modify: 2021-02-19 10:00:07.095951019 +0800
Change: 2021-02-19 10:00:07.095951019 +0800
 Birth: -
[root@Centos8 data]# touch -m aa.txt ==>修改文件mtime
[root@Centos8 data]# stat aa.txt 
  File: aa.txt
  Size: 11        	Blocks: 8          IO Block: 4096   regular file
Device: fd02h/64770d	Inode: 132         Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:default_t:s0
Access: 2021-02-19 10:00:07.095951019 +0800
Modify: 2021-02-19 10:00:19.999950681 +0800
Change: 2021-02-19 10:00:19.999950681 +0800
 Birth: -
[root@Centos8 data]# 

三、总结软链接和硬链接区别,并用实例操作说明

1、硬链接

概念

  • 硬链接本质上是给一个文件起一个新的名称,实质是同一个文件
  • 硬链接相当于多个链接指向同一份数据存储区域,每多一个硬链接,硬链接数+1,如果一个文件,有n个硬链接,删除n-1个硬链接,源文件还在,直到删除所有硬链接,才会删除源文件

特点

  • 创建硬链接会在对应的目录中增加额外的记录项以引用文件
  • 对应于同一文件系统上一个物理文件
  • 每个目录引用相同的inode号
  • 创建时链接数递增
  • 删除文件时:rm命令递减计数的链接,文件要存在,至少有一个链接数,当链接数为零时,该文件被删除
  • 不能跨越驱动器或分区
  • 不支持对目录创建硬链接

实现格式ln filename [linkname ]

示例1:给文件创建硬链接,每个目录引用相同的inode号,创建时链接数递增

[root@Centos8 data]# ls
fstab
[root@Centos8 /]# ll -i /data/ /data/fstab.link  ==>每个目录引用相同的inode号
133 -rw-r--r--. 1 root root 322 Feb  7 15:58 /data/fstab.link

/data/:
total 4
133 -rw-r--r--. 1 root root 322 Feb  7 15:58 fstab.link
[root@Centos8 /]#
[root@Centos8 data]# ln fstab fstab.link  ==>对fstab文件创建硬链接
[root@Centos8 data]# ll -i !* ==> !* 表示调用前一条命令的所有参数作为本次命令的参数,查看文件的inode号 
ll -i fstab fstab.link
133(inode号) -rw-r--r--. 2(链接数) root root 322 Feb  7 15:58 fstab  ==> fstab和fstab.link具有相同的inode号,都为133,连接数变为2
133(inode号) -rw-r--r--. 2(链接数) root root 322 Feb  7 15:58 fstab.link

[root@Centos8 data]# cat fstab.link fstab ==> 查看两个文件内容,是一样的
/dev/mapper/cl-root     /                       xfs     defaults        0 0
UUID=0844fea5-2009-42db-99da-95420a53298c /boot                   xfs     defaults        0 0
/dev/mapper/cl-data     /data                   xfs     defaults        0 0
/dev/mapper/cl-swap     none                    swap    defaults        0 0
/dev/mapper/cl-root     /                       xfs     defaults        0 0
UUID=0844fea5-2009-42db-99da-95420a53298c /boot                   xfs     defaults        0 0
/dev/mapper/cl-data     /data                   xfs     defaults        0 0
/dev/mapper/cl-swap     none                    swap    defaults        0 0
[root@Centos8 data]# 

示例2:rm命令递减计数的链接,文件要存在,至少有一个链接数,当链接数为零时,该文件被删除

[root@Centos8 data]# rm -f fstab 
[root@Centos8 data]# ls
fstab.link
[root@Centos8 data]# cat fstab.link 
/dev/mapper/cl-root     /                       xfs     defaults        0 0
UUID=0844fea5-2009-42db-99da-95420a53298c /boot                   xfs     defaults        0 0
/dev/mapper/cl-data     /data                   xfs     defaults        0 0
/dev/mapper/cl-swap     none                    swap    defaults        0 0
[root@Centos8 data]# ll -i fstab.link 
133 -rw-r--r--. 1 root root 322 Feb  7 15:58 fstab.link

示例3:不能对目录创建硬链接

[root@Centos8 /]# ln /data/ /data/link
ln: /data/: hard link not allowed for directory
[root@Centos8 /]# 

示例4:不能跨分区创建硬链接

[root@Centos8 /]# ln /data/fstab.link /boot/fstab.link2
ln: failed to create hard link '/boot/fstab.link2' => '/data/fstab.link': Invalid cross-device link
[root@Centos8 /]#

2、软链接(常用)

概念:软链接,又称符号 symbolic (或软 soft)链接,一个符号链接指向另一个文件,就像 windows 中快捷方式,软链接文件和原文件本质上不是同一个文件

特点

  • 一个符号链接的内容是它引用文件的名称
  • 可以对目录创建软链接
  • 可以跨分区的文件实现
  • 指向的是另一个文件的路径;其大小为指向的路径字符串的长度;不增加或减少目标文件inode的引用计数
  • 软链接如果使用相对路径,是相对于原文件的路径,而非相对于当前目录

实现格式:ln -s filename [linkname]

示例1:对文件创建软链接,指向的是另一个文件的路径;其大小为指向的路径字符串的长度;不增加或减少目标文件inode的引用计数

[root@Centos8 data]# ls
fstab
[root@Centos8 data]# ln -s fstab fstab.slink ==> 对fstab文件创建软链接
[root@Centos8 data]# ls
fstab  fstab.slink
[root@Centos8 data]# ll -i fstab fstab.slink 
133(不增加inode)-rw-r--r--. 1 root root 322 Feb  7 15:58 fstab
131(新的inode) lrwxrwxrwx. 1 root root   5(大小为fstab文件名5个字母占用的字符数) Feb  7 16:19 fstab.slink -> fstab
[root@Centos8 data]#

示例2:对目录创建软链接

[root@Centos8 data]# ln -s /data/ /data/slink
[root@Centos8 data]# ll
total 4
-rw-r--r--. 1 root root 655 Feb  7 16:29 fstab
lrwxrwxrwx. 1 root root   6 Feb  7 16:34 slink -> /data/
[root@Centos8 data]# ll -i  /data/slink/
total 4
131 -rw-r--r--. 1 root root 655 Feb  7 16:29 fstab
132 lrwxrwxrwx. 1 root root   6 Feb  7 16:34 slink -> /data/
[root@Centos8 data]# ll -i .
total 4
131 -rw-r--r--. 1 root root 655 Feb  7 16:29 fstab
132 lrwxrwxrwx. 1 root root   6 Feb  7 16:34 slink -> /data/
[root@Centos8 data]#

示例3:跨分区创建软链接

[root@Centos8 ~]# ln -s /etc/fstab /data/fstab.link
[root@Centos8 ~]# ll /data/fstab.link 
lrwxrwxrwx. 1 root root 10 Feb  7 16:43 /data/fstab.link -> /etc/fstab

示例4:删除软链接本身,不会删除源目录内容

[root@Centos8 data]# ls
fstab.link
[root@Centos8 data]# ll fstab.link 
lrwxrwxrwx. 1 root root 10 Feb  7 16:43 fstab.link -> /etc/fstab
[root@Centos8 data]# rm fstab.link -f
[root@Centos8 data]# cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Wed Dec 16 03:52:34 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/cl-root     /                       xfs     defaults        0 0
UUID=0844fea5-2009-42db-99da-95420a53298c /boot                   xfs     defaults        0 0
/dev/mapper/cl-data     /data                   xfs     defaults        0 0
/dev/mapper/cl-swap     none                    swap    defaults        0 0
[root@Centos8 data]#

示例5:删除源目录的文件,不会删除链接文件

[root@Centos8 data]# ll
total 0
lrwxrwxrwx. 1 root root 10 Feb  7 16:46 fstab.link -> /etc/fstab
[root@Centos8 data]# rm -rf /etc/fstab
[root@Centos8 data]# ll
total 0
lrwxrwxrwx. 1 root root 10 Feb  7 16:46 fstab.link -> /etc/fstab ==> 链接文件还在
[root@Centos8 data]#

示例6:对应用软件进行升级和回滚,就是针对目录做的软链接。

  • 例如:现有数据库为mysql5.6,需要升级到mysql5.7,且应用系统链接的数据库名称为mysql
  • 实现思路:对mysql5.6创建软链接mysql(应用系统链接访问的是mysql,不关心后端数据库版本是哪个),升级为mysql5.7数据库时,将原有的软链接删除,对5.7创建软链接mysql,回退也是一样的道理
[root@Centos8 data]# tree
.
├── mysql5.6
│   └── 5.6.txt
└── mysql5.7
    └── 5.7.txt

2 directories, 2 files
[root@Centos8 data]# ln -s mysql5.6 mysql
[root@Centos8 data]# ls
mysql  mysql5.6  mysql5.7
[root@Centos8 data]# ll
total 0
lrwxrwxrwx. 1 root root  8 Feb  7 17:05 mysql -> mysql5.6
drwxr-xr-x. 2 root root 21 Feb  7 16:55 mysql5.6
drwxr-xr-x. 2 root root 21 Feb  7 16:55 mysql5.7
[root@Centos8 data]# rm -f mysql ==> 首先先删除到5.6的链接
[root@Centos8 data]# ln -s mysql5.7 mysql ==> 将软链接mysql指向5.7版本(升级数据库版本,回退一样的步骤)
[root@Centos8 data]# ll
total 0
lrwxrwxrwx. 1 root root  8 Feb  7 17:06 mysql -> mysql5.7
drwxr-xr-x. 2 root root 21 Feb  7 16:55 mysql5.6
drwxr-xr-x. 2 root root 21 Feb  7 16:55 mysql5.7
[root@Centos8 data]# 

3、软链接和硬链接区别

1、本质不同

硬链接:同一个文件,多个名称。
​软链接:不同的文件。

2、跨分区

硬链接:不支持跨分区。
软链接:支持跨分区。

3、目录
硬链接:不支持对目录创建。
​ 软链接:支持对目录创建。

4、相互关系

​ 硬链接:删除某一个硬链接,另一个硬链接不影响使用。
​ 软链接:原始文件和软链接有依赖关系,原始文件删了,软链接就失效了。

5、inode编号

​ 硬链接:inode编号是相同的。
​ 软链接:inode编号不同。

6、链接数

​ 硬链接:删除一个硬链接,硬链接的链接数会有变化。
​ 软链接:删除一个软链接,链接数不会有变化,删除的相当于是一个文件(或快捷方式)。

7、相对路径:原始文件路径

​ 硬链接:硬链接的相对路径,是相对的当前工作目录的相对路径。
​ 软链接:软链接的原始文件路径是,相对的软链接的相对路径,而不是相对当前工作目录。

8、文件类型

​ 硬链接:硬链接的文件类型是,原来是什么就是什么,例如:原来是普通文件,还是普通文件。
​ 软链接:软链接的文件类型是L

9、命令的实现不一样
​ 硬链接:ln
​ 软链接:ln -s

4、软、硬链接和命令关系

复制(cp

在复制过程中,复制软连接相当于复制了快捷方式,速度很快,而且可以跨分区。

在复制过程中,复制硬链接分为两种情形:

  • 在同一分区复制,相当于多创建一个链接指向原数据存储位置,速度很快。
  • 在不同分区复制,相当于把原来分区的数据拷贝过去存储,同时创建一个指向新数据区域的指针,速度比较慢。

删除(rm

在删除过程中,删除软连接相当于删除了快捷方式,源文件还在。
在删除过程中,删除硬连接相当于删除了一个到数据块的指针,,除非删除所有硬链接文件,源文件才删除。

移动(mv

在移动过程中,移动软连接相当于移动了快捷方式而已。
在移动过程中,移动硬连接分为两种情形:

  • 在同一分区移动,相当于创建了一个新inode,指向数据块,并把原来的inode删掉
  • 在不同分区移动,要把数据块复制到新分区,然后在新分区创建新的inode号指向新的数据块,并且把原来分区的inode号和数据块都删掉。
  1. 软连接支持对目录创建,硬链接不支持

四、Linux上的文件管理类命令有哪些,其常用的使用方法及其相关示例演示

1、文件管理类命令

  • ls命令
  • stat命令
  • file命令
  • touch命令
  • cp命令
  • mv命令
  • rename命令
  • rm命令

ls命令

作用:命令可以列出当前目录的内容或指定目录的文件列表
ls 查看不同后缀文件时的颜色由 /etc/DIR_COLORS 和@LS_COLORS变量定义

格式ls [options] [files_or_dirs]

参数

  • -a:全部的文件,连同隐藏文件( 开头为 . 的文件) 一起列出来(常用)

  • -d:仅列出目录本身,而不是列出目录内的文件数据(常用)

  • -l --long:长格式信息,列出文件的详细属性包含文件的属性与权限等等数据;命令可以简写为ll,alias ll=‘ls -l --color=auto’(常用)

  • -h,--human-readable:size用人类可读的格式表示

  • -d, --directory:查看目录本身而非内部的文件详情

  • -r, --reverse:反转排序(降序)

  • -R, --recursive 递归显示(基本不用这个,递归显示用tree命令更直观)

  • -t:按修改时间排序

示例1:显示所有文件,包括隐藏文件

[root@Centos8 /]# ls -a
.   bin   data  etc   lib    media  mnt    net  proc  run   srv  testdir  usr
..  boot  dev   home  lib64  misc   mysql  opt  root  sbin  sys  tmp      var
[root@Centos8 /]# 

示例2:按文件的修改时间从新到旧排列

[root@Centos8 ~]# ls -lt /etc
total 1336
-rw-r--r--.  1 root root        53 Feb 18 10:46 resolv.conf
-rw-r--r--.  1 root root       655 Feb  7 16:44 fstab
-rw-r--r--.  1 root root      2162 Feb  1 02:09 profile
-rw-r--r--.  1 root root     48374 Jan 27 11:49 ld.so.cache
drwxr-xr-x.  2 root root        48 Jan 26 17:32 PackageKit
drwxr-xr-x.  2 root root      4096 Jan 26 17:32 profile.d
drwxr-xr-x.  5 root root        51 Jan 26 17:31 xdg
drwxr-xr-x.  2 root root        21 Jan 26 17:31 xml
drwxr-xr-x.  2 root root      4096 Jan 26 17:31 alternatives
drwxr-xr-x.  6 root root        70 Jan 26 17:30 libreport

示例3:只显示目录本身,而不显示其下面文件

[root@Centos8 /]# ls -ld /etc/
drwxr-xr-x. 129 root root 8192 Feb 18 10:46 /etc/
[root@Centos8 /]#

示例4:递归显示目录中的文件

[root@Centos8 /]# ls /etc/sysconfig/
anaconda  cpupower         ip6tables-config  man-db           qemu-ga     selinux
atd       crond            iptables-config   modules          raid-check  smartmontools
autofs    ebtables-config  irqbalance        network          rsyslog     sshd
chronyd   firewalld        kdump             network-scripts  run-parts   sshd-permitrootlogin
console   grub             kernel            nftables.conf    samba       wpa_supplicant
[root@Centos8 /]# ls -R /etc/sysconfig/
/etc/sysconfig/:
anaconda  cpupower         ip6tables-config  man-db           qemu-ga     selinux
atd       crond            iptables-config   modules          raid-check  smartmontools
autofs    ebtables-config  irqbalance        network          rsyslog     sshd
chronyd   firewalld        kdump             network-scripts  run-parts   sshd-permitrootlogin
console   grub             kernel            nftables.conf    samba       wpa_supplicant

/etc/sysconfig/console:

/etc/sysconfig/modules:

/etc/sysconfig/network-scripts:
ifcfg-ens33.bak  ifcfg-eth0
[root@Centos8 /]# 

示例5:使用ls查看文件的三个时间属性

## 默认显示的是mtime时间
[root@Centos8 ~]# ls -l anaconda-ks.cfg  
-rw-------. 1 root root 1572 Dec 16 12:19 anaconda-ks.cfg

## 显示文件的atime时间
[root@Centos8 ~]# ls -l --time=atime anaconda-ks.cfg 
-rw-------. 1 root root 1572 Dec 23 14:13 anaconda-ks.cfg

## 显示文件的ctime时间
[root@Centos8 ~]# ls -l --time=ctime anaconda-ks.cfg 
-rw-------. 1 root root 1572 Dec 16 12:19 anaconda-ks.cfg
[root@Centos8 ~]# 

stat命令

作用:显示文件详细属性

格式:stat 【文件或目录】

文件时间属性

每个文件的时间属性有三种,atime,mtime,ctime

  • atime(access time 访问时间):记录最后一次访问时间
  • mtime(modify time 修改时间):记录最后一次文件数据的修改时间
  • ctime(change time 改变时间):记录最后一次文件元数据的修改时间

示例:查看文件属性

[root@Centos8 ~]# stat anaconda-ks.cfg 
  File: anaconda-ks.cfg
  Size: 1572      	Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d	Inode: 100663429   Links: 1
Access: (0600/-rw-------)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:admin_home_t:s0
Access: 2020-12-23 14:13:22.622947325 +0800
Modify: 2020-12-16 12:19:11.607943581 +0800
Change: 2020-12-16 12:19:11.607943581 +0800
 Birth: -
[root@Centos8 ~]#

file命令

作用:文件可以包含多种类型的数据,使用file命令检查文件的类型

格式file [options] <filename>...

参数

  • -b :列出文件辨识结果时,不显示文件名称
  • -f filelist: 列出文件filelist中文件名的文件类型
  • -F:使用指定分隔符号替换输出文件名后默认的”:”分隔符
  • -L :查看对应软链接对应文件的文件类型
  • -z :尝试查看压缩文件内容
  • --help :显示命令在线帮助

示例1:显示文件类型

## 显示文件类型
[root@Centos8 ~]# file initial-setup-ks.cfg 
initial-setup-ks.cfg: ASCII text

## 不显示文件名称
[root@Centos8 ~]# file -b initial-setup-ks.cfg 
ASCII text

## 显示MIME类别
[root@Centos8 ~]# file -i initial-setup-ks.cfg 
initial-setup-ks.cfg: text/plain; charset=us-ascii
[root@Centos8 ~]# file -bi initial-setup-ks.cfg 
text/plain; charset=us-ascii

示例2:显示符号链接的文件类型

[root@Centos8 ~]# ls -l /var/mail
lrwxrwxrwx. 1 root root 10 Nov  3 23:22 /var/mail -> spool/mail
[root@Centos8 ~]# ls /var/mail/
aa3  root  rpc  yk
[root@Centos8 ~]# file /var/mail/
/var/mail/: directory
[root@Centos8 ~]# file /var/mail
/var/mail: symbolic link to spool/mail
[root@Centos8 ~]# file -L /var/mail
/var/mail: directory
[root@Centos8 ~]# 

示例3:查看压缩文件内容

[root@CentOS7 ~]# file /boot/grub/splash.xpm.gz 
/boot/grub/splash.xpm.gz: gzip compressed data, was "splash.xpm", from Unix, last modified: Wed Nov 16 05:03:25 2011
[root@CentOS7 ~]# file -z /boot/grub/splash.xpm.gz 
/boot/grub/splash.xpm.gz: X pixmap image, ASCII text, with very long lines (gzip compressed data, was "splash.xpm", from Unix, last modified: Wed Nov 16 05:03:25 2011)
[root@CentOS7 ~]#

touch命令

作用:设置文件的修改和访问时间,如果指定的文件不存在,使用默认权限创建文件

格式:touch [-acfm][-d<日期时间>][-r<参考文件或目录>] [-t<日期时间>][–help][–version][文件或目录…]

参数

  • -a :仅改变 atime
  • -m :仅改变 mtime
  • -c :如果文件不存在,则不予创建
  • -t [[CC]YY]MMDDhhmm[.ss]:指定atime和mtime的时间戳
  • CC
  • YY
  • MM:表示月份,取值01-12
  • DD:表示天数,取值01-31
  • hh:每天的小时,取值00-23
  • mm:表示分钟,取值00-59
  • SS:表示秒钟,取值00-60

示例1:使用touch修改已存在文件的时间属性,已存在的文件会修改文件的三个属性,即atime,mtime,ctime

1、使用指令touch修改文件"aa.txt"的时间属性为当前系统时间,输入如下命令:

[root@Centos8 data]# date
Fri Feb 19 09:47:42 CST 2021
[root@Centos8 data]# touch aa.txt ==> 修改文件的时间为当前系统时间
[root@Centos8 data]# ls -l aa.txt  ==> 查看文件的时间属性 
-rw-r--r--. 1 root root 11 Feb 19 `09:47` aa.txt
[root@Centos8 data]#

2、执行指令touch修改文件属性以后,并再次查看该文件的时间属性,如下所示:

[root@Centos8 data]# touch aa.txt  ==>修改文件时间属性为当前系统时间  
[root@Centos8 data]# ls -l aa.txt  ==>查看文件的时间属性 
-rw-r--r--. 1 root root 11 Feb 19 `09:49` aa.txt
[root@Centos8 data]# stat aa.txt   ==>文件的三个时间戳均改变了
  File: aa.txt
  Size: 11        	Blocks: 8          IO Block: 4096   regular file
Device: fd02h/64770d	Inode: 132         Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:default_t:s0
Access: 2021-02-19 `09:49:54`.679967033 +0800
Modify: 2021-02-19 `09:49:54`.679967033 +0800
Change: 2021-02-19 `09:49:54`.679967033 +0800
 Birth: -

示例2:使用指令touch时,如果指定的文件不存在,则将创建一个新的空白文件。例如,在当前目录下,使用该指令创建一个空白文件"file",输入如下命令:

[root@Centos8 data]# ls
aa.txt  mysql  mysql5.6  mysql5.7
[root@Centos8 data]# touch file
[root@Centos8 data]# ll file 
-rw-r--r--. 1 root root 0 Feb 19 09:54 file
[root@Centos8 data]# ls
aa.txt  file  mysql  mysql5.6  mysql5.7
[root@Centos8 data]# 

示例3:修改文件的时间戳

[root@Centos8 data]# stat aa.txt  ==>查看文件当前时间戳
  File: aa.txt
  Size: 11        	Blocks: 8          IO Block: 4096   regular file
Device: fd02h/64770d	Inode: 132         Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:default_t:s0
Access: 2021-02-19 09:49:54.679967033 +0800
Modify: 2021-02-19 09:49:54.679967033 +0800
Change: 2021-02-19 09:49:54.679967033 +0800
 Birth: -
[root@Centos8 data]# touch -a aa.txt ==> 修改文件的atime,发现ctime跟着一起改变,因为ctime是元数据信息,包括了文件的时间等
[root@Centos8 data]# stat aa.txt 
  File: aa.txt
  Size: 11        	Blocks: 8          IO Block: 4096   regular file
Device: fd02h/64770d	Inode: 132         Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:default_t:s0
Access: 2021-02-19 09:59:39.924951729 +0800
Modify: 2021-02-19 09:49:54.679967033 +0800
Change: 2021-02-19 09:59:39.924951729 +0800 
 Birth: -
[root@Centos8 data]# touch -c aa.txt ==>修改文件ctime
[root@Centos8 data]# stat aa.txt 
  File: aa.txt
  Size: 11        	Blocks: 8          IO Block: 4096   regular file
Device: fd02h/64770d	Inode: 132         Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:default_t:s0
Access: 2021-02-19 10:00:07.095951019 +0800
Modify: 2021-02-19 10:00:07.095951019 +0800
Change: 2021-02-19 10:00:07.095951019 +0800
 Birth: -
[root@Centos8 data]# touch -m aa.txt ==>修改文件mtime
[root@Centos8 data]# stat aa.txt 
  File: aa.txt
  Size: 11        	Blocks: 8          IO Block: 4096   regular file
Device: fd02h/64770d	Inode: 132         Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:default_t:s0
Access: 2021-02-19 10:00:07.095951019 +0800
Modify: 2021-02-19 10:00:19.999950681 +0800
Change: 2021-02-19 10:00:19.999950681 +0800
 Birth: -
[root@Centos8 data]# 

cp命令

作用:利用 cp(copy)命令可以实现文件或目录的复制

格式

  • cp [OPTION]... [-T] SOURCE DEST
  • cp [OPTION]... SOURCE...DIRECTORY
  • cp [OPTION]... -t DIRECTORY SOURCE..
  • cp [-adfilprsu] 来源档(source) 目标档(destination
  • cp [options] source1 source2 source3 .... directory

参数

  • -i 如果目标已存在,覆盖前提示是否覆盖
  • -n 不覆盖,注意两者顺序
  • -r, -R 递归复制目录及内部的所有内容
  • -a 归档,相当于-dpR --preserv=all,常用于备份功能
  • -d --no-dereference --preserv=links 不复制原文件,只复制链接名
  • --preserv[=ATTR_LIST]
    • mode: 权限
    • ownership: 属主属组
    • timestamp:
    • links
    • xattr
    • context
    • all
  • -p:等同–preserv=mode,ownership,timestamp`,保留原文件或目录的属性信息,包括属主、属组、权限和时间
  • -P:复制软链接本身,而非复制软链接指向的源文件
  • -v --verbose:显示执行过程
  • -f --force:如果目标文件不能打开,先删除在打开
  • -u --update 只复制源比目标更新文件或目标不存在的文件
  • -b 目标存在,覆盖前先备份,默认形式为 filename~ ,只保留最近的一个备份
  • --backup=numbered 目标存在,覆盖前先备份加数字后缀,形式为 filename.~#~ ,可以保留多个版本

注意事项

源文件目标文件不存在目标存在且为文件目标存在且为目录
一个文件会先创建目的(DEST)文件,再将源文件中的内容复制到目的(DEST)文件中将SRC中的内容覆盖至DEST中,目标文件中的原始数据回丢失。建议复制时使用-i选项在该目录下创建与原文件同名的文件,并将SRC文件中的内容复制到DEST中
多个文件提示错误提示错误在该目录下分别创建与原文件同名的文件,并将SRC文件中的内容一 一复制到对应的DEST中
目录文件创建指定DEST同名目录,复制源(SRC)目录中所有文件至目的(DEST)目录下提示错误在DEST下创建与原目录同名的目录,并将SRC中的内容复制到新目录中

示例1:用 root 身份,将 root 目录下的 .bashrc 复制到 /tmp 下,并命名为 bashrc(当源文件为一个文件,目标文件存在且为一文件时,将覆盖)

[root@Centos8 ~]# cp ~/.bashrc /tmp/bashrc
[root@Centos8 tmp]# cp -i ~/.bashrc /tmp/bashrc
cp: overwrite '/tmp/bashrc'? n  <==n不覆盖,y为覆盖

示例2:复制的目录是多层,需要指定-r选项

[root@Centos8 ~]# cp /etc/ /data/
cp: -r not specified; omitting directory '/etc/'
[root@Centos8 ~]# cp -r /etc/ /data/
[root@Centos8 ~]#

示例3:覆盖已存在的目标文件前先备份

[root@Centos8 data]# ls
aa.txt  etc  fstab  mysql  mysql5.6  mysql5.7
[root@Centos8 data]# cp -b /etc/fstab .
cp: overwrite './fstab'? y
[root@Centos8 data]# ls -l
total 20
-rw-r--r--.   1 root root   11 Feb 19 10:00 aa.txt
drwxr-xr-x. 129 root root 8192 Feb 19 14:47 etc
-rw-r--r--.   1 root root  655 Feb 19 14:52 fstab
-rw-r--r--.   1 root root    0 Feb 19 14:52 fstab~==>备份的文件
lrwxrwxrwx.   1 root root    8 Feb  7 17:06 mysql -> mysql5.7
drwxr-xr-x.   2 root root   21 Feb  7 16:55 mysql5.6
drwxr-xr-x.   2 root root   21 Feb  7 16:55 mysql5.7
[root@Centos8 data]#

mv命令

作用:mv 命令可以实现文件或目录的移动和重命名

  • 同一分区移动数据,速度很快:数据位置没有变化
  • 不同分区移动数据,速度相对慢:数据位置发生了变化

格式

  • mv [OPTION]... [-T] SOURCE DEST
  • mv [OPTION]... SOURCE... DIRECTORY
  • mv [OPTION]... -t DIRECTORY SOURCE...

参数

  • -i 交互式操作,覆盖前提示用户是否覆盖
  • -f 强制覆盖,不提示
  • -b 目标存在,覆盖前先备份

示例1:重命名文件名

[root@Centos8 data]# ls
aa.txt  etc  fstab  fstab~  mysql  mysql5.6  mysql5.7
[root@Centos8 data]# mv fstab fstab.bak
[root@Centos8 data]# ls
aa.txt  etc  fstab~  fstab.bak  mysql  mysql5.6  mysql5.7
[root@Centos8 data]#

示例2:使用-i选项,实现目标文件存在,覆盖前提示

[root@Centos8 data]# mv -i /etc/fstab .
mv: overwrite './fstab'? 

示例3:使用-b选项,实现目标存在,覆盖前先备份

[root@Centos8 data]# ls
aa.txt  etc  fstab  mysql  mysql5.6  mysql5.7
[root@Centos8 data]# mv -b /etc/fstab .
mv: overwrite './fstab'? y
[root@Centos8 data]# ls
aa.txt  etc  fstab  `fstab~(备份的文件)`  mysql  mysql5.6  mysql5.7
[root@Centos8 data]# 

rename命令

作用:批量修改文件名

格式:rename [options] expression(被替换) replacement(替换为) file(文件名)…

示例:将.conf结尾的文件,批量改名为.config.bak

[root@Centos8 data]# touch f{0..9}.conf
[root@Centos8 data]# ls
aa.txt  f0.conf  f2.conf  f4.conf  f6.conf  f8.conf  fstab   mysql     mysql5.7
etc     f1.conf  f3.conf  f5.conf  f7.conf  f9.conf  fstab~  mysql5.6
[root@Centos8 data]# rename .conf .conf.bak *.conf
[root@Centos8 data]# ls
aa.txt       f1.conf.bak  f4.conf.bak  f7.conf.bak  fstab   mysql5.6
etc          f2.conf.bak  f5.conf.bak  f8.conf.bak  fstab~  mysql5.7
f0.conf.bak  f3.conf.bak  f6.conf.bak  f9.conf.bak  mysql
[root@Centos8 data]# 

rm命令

作用:删除文件和目录

格式:rm [OPTION]… FILE…

参数

  • -i交互式
  • -f 强制删除
  • -r 递归 删除
  • -d删除空目录,非空目录不能删除
  • --no-preserve-root 删除/,centos5版本之前为默认值
  • --preserve-root/不进行递归删除,在centos6以后的版本为默认值

示例

2、目录管理类命令

  • pwd
  • cd
  • tree命令
  • mkdir命令
  • rmdir命令

pwd命令

作用:显示当前shell CWD的绝对路径
每个shell和系统进程都有一个当前的工作目录 CWD:current work directory

格式pwd [OPTION]...

参数

  • -P 显示真实物理路径
  • -L 显示链接路径(默认)

示例

[root@Centos8 bin]# ll /
total 28
lrwxrwxrwx.   1 root root    7 Nov  3 23:22 bin -> usr/bin
dr-xr-xr-x.   5 root root 4096 Feb  7 16:33 boot
drwxr-xr-x.   4 root root   51 Feb  7 17:06 data
drwxr-xr-x.  20 root root 3200 Jan 25 14:49 dev
drwxr-xr-x. 129 root root 8192 Feb 18 10:46 etc

[root@Centos8 ~]# cd /bin/
[root@Centos8 bin]# pwd
/bin
[root@Centos8 bin]# pwd -P
/usr/bin
[root@Centos8 bin]# pwd -L
/bin
[root@Centos8 bin]#

cd命令

作用: change directory 改变目录
格式:

  • 切换至父目录:cd ..
  • 切换至当前用户主目录: cd
  • 切换至以前的工作目录: cd -

参数:

  • -P 切换至物理路径,而非软链接目录

相关环境变量

  • PWD:当前目录路径
  • OLDPWD:上一次目录路径

示例1

[root@centos8 ~]#cd /etc/sysconfig
[root@centos8 sysconfig]#pwd
/etc/sysconfig
[root@centos8 sysconfig]#cd ../../data
[root@centos8 data]#pwd
/data
[root@centos8 data]#cd /bin
[root@centos8 bin]#pwd
/bin
[root@centos8 bin]#cd -P /bin
[root@centos8 bin]#pwd
/usr/bin

示例2:使用-P选项切换至物理路径,而非软链接目录

[root@Centos8 /]# cd /bin/  ==> 软链接目录
[root@Centos8 bin]# pwd
/bin
[root@Centos8 bin]# cd -P /bin ==> 使用-P选项切换至物理路径,而非软链接目录
[root@Centos8 bin]# pwd
/usr/bin
[root@Centos8 bin]# 

示例3:使用变量OLDPWD,和cd -,切换上次工作目录

[root@Centos8 ~]# pwd
/root
[root@Centos8 ~]# cd /etc/sysconfig/
[root@Centos8 sysconfig]# pwd
/etc/sysconfig
[root@Centos8 sysconfig]# cd -
/root
[root@Centos8 ~]# cd $OLDPWD
[root@Centos8 sysconfig]# pwd
/etc/sysconfig
[root@Centos8 sysconfig]# 

tree命令

作用:查看目录结构

常用选项:

  • -d:只显示目录
  • -L level:指定显示的层级数目
  • -P pattern:只显示符合pattern的文件或目录名称
    --p:列出权限标识
  • -f:在每个文件或者目录之前,显示完整的相对路径名称
  • -s:列出文件或目录大小

示例1:-d选项,只显示目录

[root@CentOS7 sys]# tree -d /bin/
/bin/

0 directories
[root@CentOS7 sys]#

示例2:使用-L选项,查看 /目录下最大层级至二级目录的文件

[root@CentOS7 ~]# tree -L 2 / | less
/
├── bin -> usr/bin
├── boot
│   ├── config-3.10.0-693.el7.x86_64
│   ├── efi
│   ├── grub
│   ├── grub2
│   ├── initramfs-0-rescue-3294e3e9c57e4456ae2de75b02f30ddc.img
│   ├── initramfs-3.10.0-693.el7.x86_64.img
│   ├── initrd-plymouth.img
│   ├── symvers-3.10.0-693.el7.x86_64.gz
│   ├── System.map-3.10.0-693.el7.x86_64
│   ├── vmlinuz-0-rescue-3294e3e9c57e4456ae2de75b02f30ddc
│   └── vmlinuz-3.10.0-693.el7.x86_64
├── data
├── dev
│   ├── agpgart
│   ├── autofs
│   ├── block
│   ├── bsg
│   ├── btrfs-control
│   ├── bus
│   ├── cdrom -> sr0
│   ├── char
│   ├── console
│   ├── core -> /proc/kcore

示例3:查看指定目录下子目录,不包含文件

[root@CentOS7 ~]# tree -L 1 -d /etc 
/etc
├── alternatives
├── audisp
├── audit
├── auto.master.d
├── bash_completion.d
├── binfmt.d
├── chkconfig.d
├── cron.d
├── cron.daily
├── cron.hourly
├── cron.monthly
├── cron.weekly
├── dbus-1
├── default
├── depmod.d
├── dhcp
├── dracut.conf.d
├── firewalld
├── gcrypt
├── gnupg
├── groff
├── grub.d
├── gss
├── init.d -> rc.d/init.d
├── iproute2
├── kernel
├── krb5.conf.d
├── ld.so.conf.d
├── libnl
├── logrotate.d
├── modprobe.d
├── modules-load.d
├── my.cnf.d
├── NetworkManager
├── openldap
├── opt
├── pam.d
├── pkcs11
├── pki
├── plymouth
├── pm
├── polkit-1
├── popt.d
├── postfix
├── ppp
├── prelink.conf.d
├── profile.d
├── python
├── rc0.d -> rc.d/rc0.d
├── rc1.d -> rc.d/rc1.d
├── rc2.d -> rc.d/rc2.d
├── rc3.d -> rc.d/rc3.d
├── rc4.d -> rc.d/rc4.d
├── rc5.d -> rc.d/rc5.d
├── rc6.d -> rc.d/rc6.d
├── rc.d
├── rpm
├── rsyslog.d
├── rwtab.d
├── sasl2
├── security
├── selinux
├── skel
├── ssh
├── ssl
├── statetab.d
├── sudoers.d
├── sysconfig
├── sysctl.d
├── systemd
├── terminfo
├── tmpfiles.d
├── tuned
├── udev
├── vmware-tools
├── wpa_supplicant
├── X11
├── xdg
├── xinetd.d
├── yum
└── yum.repos.d

81 directories
[root@CentOS7 ~]# 

示例4:查看/etc/目录下最大深度为2级的文件列表,显示全部路径和权限

[root@CentOS7 ~]# tree -f -p -L 2 /etc/
/etc
├── [-rw-r--r--]  /etc/adjtime
├── [-rw-r--r--]  /etc/aliases
├── [-rw-r--r--]  /etc/aliases.db
├── [drwxr-xr-x]  /etc/alternatives
├── [-rw-r--r--]  /etc/yum.conf
└── [drwxr-xr-x]  /etc/yum.repos.d
    ├── [drwxr-xr-x]  /etc/yum.repos.d/backup
    ├── [-rw-r--r--]  /etc/yum.repos.d/Centos-7.repo
    └── [-rw-r--r--]  /etc/yum.repos.d/epel.repo

154 directories, 301 files

mkdir命令

作用:及make directories 缩写,创建目录

格式:mkdir [OPTION]… DIRECTORY…

参数:

  • -m:指定创建文件的模式(权限),作用类似于chmod
  • -p:递归创建目录,默认创建目录其父目录必须存在,如果父目录不存在,希望自动创建父目录,使用此选项
  • -v:创建目录时候给出详细说明,创建目录是列出他们

示例1:创建目录

[root@CentOS7 ~]# mkdir /data/mysql
[root@CentOS7 ~]# tree /data/
/data/
└── mysql

1 directory, 0 files
[root@CentOS7 ~]#

示例2:创建目录及父目录,当父目录不存在是,直接创建子目录默认会失败,可通过-p选项,实现父目录自动创建;使用-v选项显示创建过程

[root@CentOS7 ~]# mkdir /data/dir1/dir2/dir3 
mkdir: cannot create directory ‘/data/dir1/dir2/dir3’: No such file or directory
[root@CentOS7 /]# mkdir -pv /data/dir1/dir2/dir3
mkdir: created directory ‘/data/dir1’
mkdir: created directory ‘/data/dir1/dir2’
mkdir: created directory ‘/data/dir1/dir2/dir3’
[root@CentOS7 /]#
[root@CentOS7 ~]# tree /data/
/data/
├── dir1
│   └── dir2
│       └── dir3
└── mysql

4 directories, 0 files
[root@CentOS7 ~]#

rmdir命令

作用:

  • 删除空目录,删除的目录内,不能有文件,否则无法删除
  • 如果想删除非空目录,可以使用rm -r命令,递归删除目录树

格式:rmdir [OPTION]... DIRECTORY...

参数:

  • -p:递归删除目录及其空的父目录
  • -v:显示详细信息

示例1:

[root@CentOS7 /]# rmdir -pv /data/dir1/dir2/dir3
rmdir: removing directory, ‘/data/dir1/dir2/dir3’
rmdir: removing directory, ‘/data/dir1/dir2’
rmdir: removing directory, ‘/data/dir1’
rmdir: removing directory, ‘/data’
rmdir: failed to remove directory ‘/data’: Device or resource busy
[root@CentOS7 /]# tree /data/
/data/
└── mysql

1 directory, 0 files
[root@CentOS7 /]#

五、复制/etc/profile 至 /tmp/目录,用查找替换命令删除 /tmp/profile文件中的行首空白字符

1、使用cp命令,将/etc/profile文件复制到/tmp目录中

[root@Centos8 ~]# cp /etc/profile /tmp/
[root@Centos8 ~]# ll /tmp/
total 4
-rw-r--r--. 1 root root 2124 Feb 19 18:13 profile

2、使用vim编辑/tmp/profile文件,vim支持正则表达式

  • vim /tmp/profile
[root@Centos8 ~]# vim /tmp/profile 
# /etc/profile
# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc
# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.
         
pathmunge () {
    case ":${PATH}:" in
        *:"$1":*)
            ;;
        *)   
            if [ "$2" = "after" ] ; then
                PATH=$PATH:$1
            else
                PATH=$1:$PATH  
            fi
    esac
}   
    
    
if [ -x /usr/bin/id ]; then
    if [ -z "$EUID" ]; then

  • 用查找命令/^[[:blank:]]\+,找到该文件行首的空白字符在这里插入图片描述
  • 在vim中使用替换功能,格式:s/要查找的内容/替换为的内容/修饰符
  • 如果要替换全局的要%s
    命令如下%s/^[[:blank:]]\+//g
    在这里插入图片描述
    在这里插入图片描述

六、在vim中设置tab缩进4个字符

1、永久生效

打开vim配置文件 vim /etc/vimrc,在文档最后面输入
set ts=4
set expandtab

[root@Centos8 ~]# vim /etc/vimrc 
set noexpandtab
set ts=4

2、临时生效

使用vim编辑器打开一个配置文件,直接输入命令模式下直接输入:set tabstop=4就设置成功tab键缩进4个字符的设置了

  • 没有设置之前,默认是缩进8个字符
[root@Centos8 etc]# vim fstab
        aa
12345678
# /etc/fstab    
/dev/mapper/cl-root     /                       xfs     defaults        0 0
UUID=0844fea5-2009-42db-99da-95420a53298c /boot                   xfs     defaults        0 0
/dev/mapper/cl-data     /data                   xfs     defaults        0 0
/dev/mapper/cl-swap     none                    swap    defaults        0 0
~                                                                                            
  • 使用set tabstop=4设置以后缩进为4个字符
[root@Centos8 etc]# vim fstab
    aa
1234  
# 
# /etc/fstab      
/dev/mapper/cl-root     /                       xfs     defaults        0 0
UUID=0844fea5-2009-42db-99da-95420a53298c /boot                   xfs     defaults        0 0
/dev/mapper/cl-data     /data                   xfs     defaults        0 0
/dev/mapper/cl-swap     none                    swap    defaults        0 0
                                                                                               
:set tabstop=4 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值