01、linux系统的目录结构及文件类型

1.1 文件系统的目录结构

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

Linux的文件系统分层结构:FHS Filesystem Hierarchy Standard

参考文档:http://www.pathname.com/fhs/

1.2 常见的文件系统目录功能

  • **/boot:**引导文件存放目录,内核文件(vmlinuz)、引导加载器(bootloader, grub)都存放于此目录

  • **/bin:**所有用户使用的基本命令;不能关联至独立分区,OS启动即会用到的程序

  • **/sbin:**管理类的基本命令;不能关联至独立分区,OS启动即会用到的程序

  • **/lib:**启动时程序依赖的基本共享库文件以及内核模块文件(/lib/modules)

  • **/lib64:**专用于x86_64系统上的辅助共享库文件存放位置

  • **/etc:**配置文件目录

  • **/home/USERNAME:**普通用户家目录

  • **/root:**管理员的家目录

  • **/media:**便携式移动设备挂载点

  • **/mnt:**临时文件系统挂载点

  • **/dev:**设备文件及特殊文件存储位置

    ​ b: block device,随机访问

    ​ c: character device,线性访问

  • **/opt:**第三方应用程序的安装位置

  • **/srv:**系统上运行的服务用到的数据

  • **/tmp:**临时文件存储位置

  • /usr: universal shared, read-only data

    ​ bin: 保证系统拥有完整功能而提供的应用程序

    ​ sbin:

    ​ lib:32位使用

    ​ lib64:只存在64位系统

    ​ include: C程序的头文件(header files)

    ​ share:结构化独立的数据,例如doc, man等

    ​ local:第三方应用程序的安装位置

    ​ bin, sbin, lib, lib64, etc, share

  • /var: variable data files

    ​ cache: 应用程序缓存数据目录

    ​ lib: 应用程序状态信息数据

    ​ local:专用于为/usr/local下的应用程序存储可变数据

    ​ lock: 锁文件

    ​ log: 日志目录及文件

    ​ opt: 专用于为/opt下的应用程序存储可变数据

    ​ run: 运行中的进程相关数据,通常用于存储进程pid文件

    ​ spool: 应用程序数据池

    ​ tmp: 保存系统两次重启之间产生的临时数据

  • /proc: 用于输出内核与进程信息相关的虚拟文件系统

  • **/sys:**用于输出当前系统上硬件设备相关信息虚拟文件系统

  • /selinux: security enhanced Linux,selinux相关的安全策略等信息的存储位置

1.3 应用程序的组成部分

二进制程序:/bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin

库文件:/lib, /lib64, /usr/lib, /usr/lib64, /usr/local/lib, /usr/local/lib64

配置文件:/etc, /etc/DIRECTORY, /usr/local/etc

帮助文件:/usr/share/man, /usr/share/doc, /usr/local/share/man, /usr/local/share/doc

1.4 CentOS 7 以后版本目录结构变化

CentOS6版本的目录都是独立的;

CentOS7版本以后的/bin是/usr/bin的软链接,以下目录均为/usr对应目录的软链接。

  • /bin 和 /usr/bin
  • /sbin 和 /usr/sbin
  • /lib 和/usr/lib
  • /lib64 和 /usr/lib64

范例:

CentOS6根目录结构
[root@centos6 /]# tree -L 1
.
├── bin
├── boot
├── dev
├── etc
├── home
├── lib
├── lib64
├── lost+found
├── media
├── mnt
├── opt
├── proc
├── root
├── sbin
├── selinux
├── srv
├── sys
├── tmp
├── usr
└── var
20 directories, 0 files
[root@centos6 ~]# ls /bin /sbin /lib /lib64 -ld
dr-xr-xr-x. 2 root root  4096 Nov 16  2019 /bin
dr-xr-xr-x. 8 root root  4096 Jul  7  2019 /lib
dr-xr-xr-x. 7 root root 12288 Nov 16  2019 /lib64
dr-xr-xr-x. 2 root root  4096 Nov 16  2019 /sbin


CentOS7和CentOS8的根目录结构
[09:53:41 root@centos7 /]#tree -L 1
.
├── bin -> usr/bin
├── boot
├── data
├── dev
├── etc
├── home
├── lib -> usr/lib
├── lib64 -> usr/lib64
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var
20 directories, 0 files
[09:57:31 root@centos7 /]#ls /bin /sbin /lib /lib64 -ld
lrwxrwxrwx. 1 root root 7 Jul  7  2019 /bin -> usr/bin
lrwxrwxrwx. 1 root root 7 Jul  7  2019 /lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Jul  7  2019 /lib64 -> usr/lib64
lrwxrwxrwx. 1 root root 8 Jul  7  2019 /sbin -> usr/sbin

root@ubuntu18:~# ls /bin /sbin /lib /lib64 -ld
drwxr-xr-x  2 root root  4096 Nov 11 16:59 /bin
drwxr-xr-x 22 root root  4096 Nov 11 17:00 /lib
drwxr-xr-x  2 root root  4096 Nov 11 00:47 /lib64
drwxr-xr-x  2 root root 12288 Nov 11 17:30 /sbin

1.5 Linux下的文件类型

  • - 普通文件

    ​ Linux中最多的一种文件类型,包括 纯文本文件(ASCII)、二进制文件(binary)、数据格式的文件(data)、各种压缩文件等。第一个属性为 [-]

  • d 目录文件directory

    ​ 就是目录, 能用 # cd 命令进入的。第一个属性为 [d]

  • b 块设备block(比如磁盘空间)

    ​ 块设备文件支持以块(block)为单位的访问方式。在 EXT4 文件系统中,一个 block 通常为 4KB 的大小,也就是说每次可以存取 4096(或其整数倍) 个字节的数据。应用程序可以随机访问块设备文件的数据,程序可以自行确定数据的位置,硬盘、软盘等都是块设备。使用 ls -l 命令查看,块设备文件的第一个字符是 "b"(block)。第一个属性为 [b]

  • c 字符设备character

    ​ 字符设备文件以字节流的方式进行访问,由字符设备驱动程序来实现这种特性,这通常要用到 open、close、read、write 等系统调用。字符终端、串口和键盘等就是字符设备。另外,由于字符设备文件是以文件流的方式进行访问的,因此可以顺序读取,但通常不支持随机存取。使用 ls -l 命令查看,字符设备文件的第一个字符是 "c"(char)。第一个属性为 [c]

  • l 符号链接文件link

    ​ 类似Windows下面的快捷方式。有软链接和硬链接之分。第一个属性为 [l]

  • p 管道文件pipe

    ​ FIFO也是一种特殊的文件类型,它主要的目的是,解决多个程序同时存取一个文件所造成的错误。FIFO是first-in-first-out(先进先出)的缩写。第一个属性为 [p]

  • s 套接字文件socket

    ​ 这类文件通常用在网络数据连接。可以启动一个程序来监听客户端的要求,客户端就可以通过套接字来进行数据通信。第一个属性为 [s],最常在 /var/run目录中看到这种文件类型。第一个属性为 [s]

[13:59:35 root@centos7 ~]#ll /run
total 24
-rw-r--r--  1 root   root      4 Nov 30 16:34 auditd.pid		##普通文件
drwxr-x---  2 chrony chrony   80 Nov 30 16:36 chrony			##目录
prw-------  1 root   root      0 Nov 30 16:34 dmeventd-client	##管道文件
prw-------  1 root   root      0 Nov 30 16:34 dmeventd-server

[13:54:56 root@centos7 ~]#ll /dev
total 0
lrwxrwxrwx 1 root root           3 Nov 30 16:34 cdrom -> sr0	##链接文件
drwxr-xr-x 2 root root          80 Nov 30 16:34 centos
crw-rw-rw- 1 root tty       5,   0 Dec  2 10:05 tty				##字符设备
crw--w---- 1 root tty       4,   0 Nov 30 16:34 tty0
crw--w---- 1 root tty       4,   1 Nov 30 16:36 tty1
brw-rw---- 1 root disk      8,   0 Nov 30 16:34 sda				##块设备
brw-rw---- 1 root disk      8,   1 Nov 30 16:34 sda1
brw-rw---- 1 root disk      8,   2 Nov 30 16:34 sda2




02、Linux文件的元数据及时间戳

2.1 Linux文件的元数据和节点表结构

1、inode表结构

每个文件的属性信息,比如:文件的大小,时间,类型等,称为文件的元数据(meta data)。这此元数据是存放在node(index node)表中。node 表中有很多条记录组成,第一条记录对应的存放了一个文件的元数据信息。

第一个node表记录对应的保存了以下信息:

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

2、查看节点号

1)ls -i命令:只能单独查看文件或目录的节点号

[16:40:52 root@centos7 data]#ll -i
total 0
33736525 -rw-r--r-- 1 root root 0 Dec  3 16:40 a
33736526 -rw-r--r-- 1 root root 0 Dec  3 16:40 b
33736527 -rw-r--r-- 1 root root 0 Dec  3 16:40 c
50332384 drwxr-xr-x 2 root root 6 Dec  3 16:40 dir1

2)stat命令:可以查看文件节点号的详细属性

详细列出了文件或目录的元数据

  • Inode:节点号
  • file/directory:类型
  • Access:权限
  • Links:链接数
  • Uid:所有者
  • Gid:所属组
  • Access/Modify/Change:文件的不同时间戳
  • Size:大小
[16:43:17 root@centos7 data]#stat a
  File: ‘a’
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d    Inode: 33736525    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2020-12-03 16:40:43.885253605 +0800
Modify: 2020-12-03 16:40:43.885253605 +0800
Change: 2020-12-03 16:40:43.885253605 +0800
 Birth: -
[16:43:25 root@centos7 data]#stat dir1/
  File: ‘dir1/’
  Size: 6               Blocks: 0          IO Block: 4096   directory
Device: fd00h/64768d    Inode: 50332384    Links: 2
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2020-12-03 16:40:52.387511473 +0800
Modify: 2020-12-03 16:40:52.387511473 +0800
Change: 2020-12-03 16:40:52.387511473 +0800
 Birth: -

3)查看磁盘节点数

#磁盘节点号(Inodes总数,IUsed已使用,IFree剩余)
[16:40:56 root@centos7 data]#df -i
Filesystem               Inodes IUsed   IFree IUse% Mounted on
devtmpfs                 121521   382  121139    1% /dev
tmpfs                    124460     1  124459    1% /dev/shm
tmpfs                    124460   748  123712    1% /run
tmpfs                    124460    16  124444    1% /sys/fs/cgroup
/dev/mapper/centos-root 8910848 39961 8870887    1% /
/dev/sda1                524288   339  523949    1% /boot
tmpfs                    124460     1  124459    1% /run/user/0


4)磁盘节点号案例:

#说明:一个文档占据的就是一个节点,创建10w个文档,就会占用10w个节点,共占用了97%的节点数。但查看硬盘空间只占用了30%多,与节点数不成正比。所以,当发现磁盘还有空间,但提示写不进文件时,需查看一下节点数的已使用情况。
[14:09:18 root@centos7 ~]#df -h		##查看/dev/sdb1磁盘空间还有190M
Filesystem               Size  Used Avail Use% Mounted on
/dev/sda1               1014M  193M  822M  19% /boot
/dev/sdb1                200M   11M  190M   6% /work
[14:09:20 root@centos7 ~]#df -i		##查看/dev/sdb1磁盘还有103933个节点
Filesystem               Inodes IUsed   IFree IUse% Mounted on
/dev/sda1                524288   339  523949    1% /boot
/dev/sdb1                103936     3  103933    1% /work
[14:09:28 root@centos7 ~]#cd /work
[14:09:42 root@centos7 work]#touch f{1..100000}.txt	##创建10w个文档
[14:10:24 root@centos7 work]#df -i		##/dev/sdb1的节点数还有3933个,已使用97%,会提示磁盘满了
Filesystem               Inodes  IUsed   IFree IUse% Mounted on
/dev/sdb1                103936 100003    3933   97% /work
[14:10:45 root@centos7 work]#df -h		##但/dev/sdb1的磁盘空间还有137M,才使用了32%
Filesystem               Size  Used Avail Use% Mounted on
/dev/sdb1                200M   63M  137M  32% /work

3、目录的节点号

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

  • 文件引用一个是 inode号
  • 人是通过文件名来引用一个文件
  • 一个目录是目录下的文件名和文件inode号之间的映射

例如:

[09:11:25 root@centos7 data]#ll -di /data		##data目录的inode是33736524
33736524 drwxr-xr-x 3 root root 59 Dec  4 09:04 /data
[09:23:27 root@centos7 data]#ll -ai /data
total 4
33736524 drwxr-xr-x   3 root root  59 Dec  4 09:04 .	##这是data自身
      64 dr-xr-xr-x. 18 root root 236 Nov 30 16:46 ..	##上级目录/的inode
33736525 -rw-r--r--   1 root root   0 Dec  3 16:40 a	##新建的文件a和目录dir1的inode
50332384 drwxr-xr-x   2 root root   6 Dec  3 16:40 dir1
[09:12:57 root@centos7 data]#ll -ai /data/dir1/		##/data/dir1目录的inode
total 0
50332384 drwxr-xr-x 2 root root  6 Dec  3 16:40 .	##dir1目录自身的inode
33736524 drwxr-xr-x 3 root root 59 Dec  4 09:04 ..	##上级目录/data的inode

2.2、时间戳

每个文件最关键的三个时间戳:

  • access time 访问时间,atime,读取文件内容
  • modify time 修改时间,mtime,改变文件内容(数据)
  • change time 改变时间,ctime,元数据发生改变(包括文件内容)

1、文件的时间戳

1)data目录下创建一个文件file,查看时间戳atime,mtime和ctime时间相同
[root@centos8 data]# touch file
[root@centos8 data]# ll
total 0
-rw-r--r--. 1 root root 0 Dec  5 10:45 file
[root@centos8 data]# stat file
  File: file
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d      Inode: 131         Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:etc_runtime_t:s0
Access: 2020-12-05 10:45:36.527998887 +0800
Modify: 2020-12-05 10:45:36.527998887 +0800
Change: 2020-12-05 10:45:36.527998887 +0800
 Birth: -

2)访问file文件,atime时间改变,但mtime和ctime时间不变
[root@centos8 data]# cat file
[root@centos8 data]# stat file
  File: file
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d      Inode: 131         Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:etc_runtime_t:s0
Access: 2020-12-05 10:46:18.589997803 +0800
Modify: 2020-12-05 10:45:36.527998887 +0800
Change: 2020-12-05 10:45:36.527998887 +0800
 Birth: -

3)改变file的所有者属性,ctime时间改变,atime和mtime不变
[root@centos8 data]# chmod u+x file
[root@centos8 data]# stat file
  File: file
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d      Inode: 131         Links: 1
Access: (0744/-rwxr--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:etc_runtime_t:s0
Access: 2020-12-05 10:46:18.589997803 +0800
Modify: 2020-12-05 10:45:36.527998887 +0800
Change: 2020-12-05 10:47:19.414993011 +0800
 Birth: -

4)修改file文件的内容,mtime和ctime时间改变,atime时间不变
[root@centos8 data]# echo magedu >file
[root@centos8 data]# stat file
  File: file
  Size: 7               Blocks: 8          IO Block: 4096   regular file
Device: 805h/2053d      Inode: 131         Links: 1
Access: (0744/-rwxr--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:etc_runtime_t:s0
Access: 2020-12-05 10:46:18.589997803 +0800
Modify: 2020-12-05 10:47:58.441991988 +0800
Change: 2020-12-05 10:47:58.441991988 +0800
 Birth: -


2、目录的时间戳

1)data目录下创建一个dir目录,查看时间戳atime,mtime和ctime时间相同
[root@centos8 data]# mkdir dir
[root@centos8 data]# stat dir
  File: dir
  Size: 6               Blocks: 0          IO Block: 4096   directory
Device: 805h/2053d      Inode: 131         Links: 2
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:etc_runtime_t:s0
Access: 2020-12-05 10:53:13.008971483 +0800
Modify: 2020-12-05 10:53:13.008971483 +0800
Change: 2020-12-05 10:53:13.008971483 +0800
 Birth: -

2)访问dir目录,atime时间改变,但mtime和ctime时间不变
[root@centos8 data]# ll dir
total 0
[root@centos8 data]# stat dir
  File: dir
  Size: 6               Blocks: 0          IO Block: 4096   directory
Device: 805h/2053d      Inode: 131         Links: 2
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:etc_runtime_t:s0
Access: 2020-12-05 10:54:08.005968181 +0800
Modify: 2020-12-05 10:53:13.008971483 +0800
Change: 2020-12-05 10:53:13.008971483 +0800
 Birth: -

3)改变dir目录的所有者,ctime时间改变,atime和mtime不变
[root@centos8 data]# chown -R dong dir
[root@centos8 data]# stat dir
  File: dir
  Size: 6               Blocks: 0          IO Block: 4096   directory
Device: 805h/2053d      Inode: 131         Links: 2
Access: (0755/drwxr-xr-x)  Uid: ( 1000/    dong)   Gid: (    0/    root)
Context: unconfined_u:object_r:etc_runtime_t:s0
Access: 2020-12-05 10:54:08.005968181 +0800
Modify: 2020-12-05 10:53:13.008971483 +0800
Change: 2020-12-05 10:54:51.286965583 +0800
 Birth: -

4)在dir目录下创建文件,mtime和ctime时间改变,atime时间不变
[root@centos8 data]# touch dir/file
[root@centos8 data]# stat dir
  File: dir
  Size: 18              Blocks: 0          IO Block: 4096   directory
Device: 805h/2053d      Inode: 131         Links: 2
Access: (0755/drwxr-xr-x)  Uid: ( 1000/    dong)   Gid: (    0/    root)
Context: unconfined_u:object_r:etc_runtime_t:s0
Access: 2020-12-05 10:54:08.005968181 +0800
Modify: 2020-12-05 10:55:07.336964619 +0800
Change: 2020-12-05 10:55:07.336964619 +0800
 Birth: -

03、软链接和硬链接

3.1 软(soft)链接

软链接又叫符号链接,是一个符号链接指向另一个文件,就像 windows 中快捷方式,软链接文件和原文件本质上不是同一个文件,但如果删除原文件,则对应的软链接文件也会消失。

1、软链接特点:

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

2、格式:

ln -s filename [linkname]

3、实例:

1)创建文件的软链接
[root@centos7 data]# ln -s f1.txt f1.txt.link	##创建f1文件的软链接
[root@centos7 data]# ll f1.txt f1.txt.link
4 -rw-r--r-- 1 root root 18 Nov 10 20:30 f1.txt
0 lrwxrwxrwx 1 root root  6 Nov 10 20:54 f1.txt.link -> f1.txt
[root@centos7 data]# ll -i			##inode节点号不同
total 8
    91 -rw-r--r-- 1 root root 18 Nov 10 20:30 f1.txt
    92 lrwxrwxrwx 1 root root  6 Nov 10 20:54 f1.txt.link -> f1.txt

2)创建目录的软链接
[root@centos7 data]# ln -s mysql5.6.10/ mysql
[root@centos7 data]# ll
total 0
lrwxrwxrwx 1 root root 12 Nov 10 21:20 mysql -> mysql5.6.10/
drwxr-xr-x 2 root root 20 Nov 10 21:20 mysql5.6.10

3)跨分区创建软链接
#/work目录在/dev/sdb1磁盘中,/data目录在/dev/sda1磁盘中。
[root@centos7 work]#df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/sda1               1014M  193M  822M  19% /boot
/dev/sdb1                200M   11M  190M   6% /work
[root@centos7 work]#ln -s f2 /data/f2.link
[root@centos7 work]#ll -i		##原文件f2的inode节点号是70
70 -rw-r--r-- 1 root root  0 Dec  4 15:06 f2
[root@centos7 work]#ll -i /data		##创建的软链接inode节点号与源文件不同
33696452 lrwxrwxrwx  1 root root    2 Dec  4 15:16 f2.link -> f2

4)目录的链接数
#创建的文件初始链接数是1,而目录的初始链接数是2
#创建的目录d1,一开始链接数就是2,因为目录中的.代表当前目录d1;再建一层目录d11,链接数就是3,因为第二个目录d11中的..代表上层目录d1;再建一层目录d111,d1的链接数就不会增加了,因为没有再表示d1目录的链接了。要是在d1下新建目录d2,那么链接数就增加到4了。
[root@centos7 tmpboot]# mkdir -p d1/d11/d111
[root@centos7 /]#ll -id d1		##d1的链接数是3,子目录中的..表示d1
56519 drwxr-xr-x 3 root root 17 Dec  4 15:33 d1
[root@centos7 /]#ll -ai d1/d11
total 0
16777634 drwxr-xr-x 3 root root 18 Dec  4 15:33 .		##表示当前目录d11
   56519 drwxr-xr-x 3 root root 17 Dec  4 15:33 ..		##表示上层目录d1
33696456 drwxr-xr-x 2 root root  6 Dec  4 15:33 d111
[root@centos7 /]#ll -ai d1/d11/d111
total 0
33696456 drwxr-xr-x 2 root root  6 Dec  4 15:33 .		##d111下没有任何文件或目录,所以为2
16777634 drwxr-xr-x 3 root root 18 Dec  4 15:33 ..		##表示上层目录d11
[root@centos7 /]#mkdir d1/d2
[root@centos7 /]#ll -id d1
56519 drwxr-xr-x 4 root root 27 Dec  4 15:43 d1		##新建d1/d2目录后,d1的链接数增加1

5)软链接的路径
#软链接是相对于链接文件的相对路径
[root@centos7 work]#echo magedu > dir1/f1.txt
[root@centos7 work]#ll
total 0
drwxr-xr-x 2 root root 20 Dec  4 16:05 dir1
drwxr-xr-x 2 root root  6 Dec  4 16:02 dir2
[root@centos7 work]#cd dir1
[root@centos7 dir1]#cat f1.txt
magedu
[root@centos7 dir1]#ln -s f1.txt ../dir2/f1.link   ##虽然没有提示错误,但文件无法查看
[root@centos7 dir1]#cat ../dir2/f1.link
cat: ../dir2/f1.link: No such file or directory		##找不到f1.link的源文件相对路径

[root@centos7 dir1]#ln -s ../dir1/f1.txt ../dir2/f1		##f1是软链接,在dir2目录下,所以源文件f1.txt的路径就是../dir1/f1.txt;而f1软链接文件相对于dir1目录就是../dir2/f1。
[root@centos7 dir1]#ll ../dir2/
total 0
lrwxrwxrwx 1 root root 13 Dec  4 16:09 f1 -> ../dir1/f1.txt		#正确的软链接
lrwxrwxrwx 1 root root  6 Dec  4 16:05 f1.link -> f1.txt		#错误的软链接
[root@centos7 dir1]#cat ../dir2/f1
magedu

6)删除软链接
#生产环境中,创建了mysql目录的软链接,所有的程序访问的都是mysql这个目录,而不是带版本号的目录;一但mysql的版本升级后,只需把软链接删除重建即可,不影响其他程序后续的访问。
[root@centos7 data]# mkdir mysql5.6 mysql5.7
[root@centos7 data]# ls
mysql5.6  mysql5.7
[root@centos7 data]# ln -s mysql5.6 mysql
[root@centos7 data]# ll
total 0
lrwxrwxrwx. 1 root root  8 Dec  5 05:45 mysql -> mysql5.6
drwxr-xr-x. 2 root root 19 Dec  5 05:45 mysql5.6
drwxr-xr-x. 2 root root  6 Dec  5 05:45 mysql5.7
[root@centos7 data]# rm -rf mysql5.6
[root@centos7 data]# ll
total 0
lrwxrwxrwx. 1 root root 8 Dec  5 05:45 mysql -> mysql5.6
drwxr-xr-x. 2 root root 6 Dec  5 05:45 mysql5.7
[root@centos7 data]# cat mysql			##删除mysql5.6源目录后,mysql这个软链接也无法访问了
cat: mysql: No such file or directory
[root@centos7 data]# ln -s mysql5.7 mysql
ln: failed to create symbolic link 'mysql': File exists
[root@centos7 data]# rm mysql
rm: remove symbolic link 'mysql'? y
[root@centos7 data]# ln -s mysql5.7 mysql
[root@centos7 data]# ll
total 0
lrwxrwxrwx. 1 root root 8 Dec  5 05:50 mysql -> mysql5.7
drwxr-xr-x. 2 root root 6 Dec  5 05:45 mysql5.7


4、删除软链接:

#删除软链接时,一定不要在后面加/,这样会把源目录中的文件删除。使用rm -rf mysql  切记切记
[root@centos7 data]# ln -s mysql5.6.10/ mysql
[root@centos7 data]# ll
total 0
lrwxrwxrwx 1 root root 12 Nov 10 21:20 mysql -> mysql5.6.10/
drwxr-xr-x 2 root root 20 Nov 10 21:20 mysql5.6.10
[root@centos7 data]# rm -rf mysql
[root@centos7 data]# ls mysql5.6.10/
f1.txt
[root@centos7 data]# ls
mysql5.6.10
[root@centos7 data]# ln -s mysql5.6.10/ mysql
[root@centos7 data]# rm -rf mysql/
[root@centos7 data]# ls mysql5.6.10/
[root@centos7 data]#

3.2 硬(hard)链接

硬链接本质上就给一个文件起一个新的名称,实质是同一个文件,只是名字不同。对其中任何一个进行更改,另一个的内容也会随之改变。

1、硬链接特性:

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

2、格式:

ln filename [linkname ]

3、实例:

1)不能跨分区创建硬链接
#/work目录在/dev/sdb1磁盘中,/data目录在/dev/sda1磁盘中。
[root@centos7 work]#df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/sda1               1014M  193M  822M  19% /boot
/dev/sdb1                200M   11M  190M   6% /work
[root@centos7 work]#ln f2 /data/f2link		##跨分区不能创建硬链接
ln: failed to create hard link ‘/data/f2link’ => ‘f2’: Invalid cross-device link

2)硬链接的链接数
#硬链接数会随着链接数量增加,随着删除硬链接,那么链接数也会减少直到1
[root@centos7 work]# ll f1.txt
-rw-r--r-- 1 root root 18 Nov 10 20:30 f1.txt		##f1文件的链接数为1
[root@centos7 work]# ln f1.txt f1.link
[root@centos7 work]# ll -i !*
ll -i f1.txt f1.link
68 -rw-r--r-- 2 root root 18 Nov 10 20:30 f1.txt		##创建了硬链接后,链接数增加为2
68 -rw-r--r-- 2 root root 18 Nov 10 20:30 f1.link
[root@centos7 work]# ln f1.txt dir/f1.txt
[root@centos7 work]# ll -i f1.txt f1.link dir/f1.txt
68 -rw-r--r-- 3 root root 18 Nov 10 20:30 f1.txt		##再次创建硬链接,链接数增加为3
68 -rw-r--r-- 3 root root 18 Nov 10 20:30 f1.link
68 -rw-r--r-- 3 root root 18 Nov 10 20:30 dir/f1.txt
[root@centos7 work]# rm -f f1.link dir/f1.txt
[root@centos7 work]# ll -i
68 -rw-r--r-- 1 root root 0 Dec  4 15:56 f1.txt	
##删除创建的硬链接后,恢复为1;而且至少是1,链接数为0,那么文件也就不存在了。


3)文件的硬链接的节点号一致
[root@centos7 work]#touch f2
[root@centos7 work]#ll -i
total 0
67 drwxr-xr-x 2 root root 6 Dec  4 14:38 dir1
70 -rw-r--r-- 1 root root 0 Dec  4 15:06 f2
[root@centos7 work]#ln f2 f2.link
[root@centos7 work]#ll -i				##f2.link文件和它的硬链接文件的节点号相同
total 0
67 drwxr-xr-x 2 root root 6 Dec  4 14:38 dir1
70 -rw-r--r-- 2 root root 0 Dec  4 15:06 f2
70 -rw-r--r-- 2 root root 0 Dec  4 15:06 f2.link
[root@centos7 work]#ln f2 dir1/f2.link.link		##f2.link.link文件和它的硬链接文件的节点号相同
[root@centos7 work]#ll -i dir1
total 0
70 -rw-r--r-- 3 root root 0 Dec  4 15:06 f2.link.link

4)不能创建目录的硬链接
[root@centos7 d1]#ll
total 0
drwxr-xr-x 3 root root 18 Dec  4 15:33 d11		##目录
drwxr-xr-x 2 root root  6 Dec  4 15:43 d2
-rw-r--r-- 1 root root  0 Dec  4 15:47 f
[root@centos7 d1]#ln d11 d11link		##对目录创建硬链接,提示错误
ln: ‘d11’: hard link not allowed for directory

5)硬链接的路径
#原始文件相对路径是相对于当前工作目录,也可以相对于链接文件的目录
[root@centos7 work]#echo magedu >dir1/f1
[root@centos7 dir1]#ln ../dir1/f1 ../dir2/f1.link	#相对于链接文件的目录
[root@centos7 dir1]#cat ../dir2/f1.link
magedu
[root@centos7 dir1]#ll ../dir2
total 4
-rw-r--r-- 2 root root 7 Dec  4 16:35 f1.link
[root@centos7 dir1]#ln f1 ../dir2/f1		##相对于当前工作目录
[root@centos7 dir1]#ll ../dir2
total 8
-rw-r--r-- 3 root root 7 Dec  4 16:35 f1
-rw-r--r-- 3 root root 7 Dec  4 16:35 f1.link
[root@centos7 dir1]#cat ../dir2/f1
magedu

6)修改硬链接的文件内容
[root@centos8 work]# echo magedu >file
[root@centos8 work]# ls
dir  file
[root@centos8 work]# ln file dir/filelink
[root@centos8 work]# cat dir/filelink
magedu
[root@centos8 work]# echo "hello world" >>file		##修改file文件的内容,追加一行
[root@centos8 work]# cat dir/filelink	##filelink文件内容也同时改变
magedu
hello world


3.3、软硬链接的区别

硬链接 软链接
本质 是同一个文件 不是同一个文件
跨设备 不支持 支持
inode 相同 不同
链接数 创建新的硬链接,链接数会相应增加;删除时会减少 创建或删除,链接数不变
文件夹 不支持 支持
相对路径 原始文件相对路径是相对于当前工作目录 相对于链接文件的相对路径
删除源文件 只是链接数减1,但链接文件的访问不受影响 链接文件将无法访问
文件类型 和源文件相同 和源文件无关

04、Linux上的文件管理类命令

4.1 创建文件命令

1、touch命令可以用来创建空文件或刷新文件的时间。

格式:

touch [OPTION]... FILE...

选项说明:

  • -a 仅改变 atime和ctime
  • -m 仅改变 mtime和ctime
  • -t [[CC]YY]MMDDhhmm[.ss] 指定atime和mtime的时间戳
  • -c 如果文件不存在,则不予创建

范例:

1)创建一个文件file,查看atime、mtime和ctime时间,相同
[root@centos8 data]# touch file
[root@centos8 data]# stat file
  File: file
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d      Inode: 131         Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:etc_runtime_t:s0
Access: 2020-12-05 14:57:52.018170477 +0800
Modify: 2020-12-05 14:57:52.018170477 +0800
Change: 2020-12-05 14:57:52.018170477 +0800
 Birth: -

2)-a选项,改变file的atime和ctime时间
[root@centos8 data]# touch -a file
[root@centos8 data]# stat file
  File: file
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d      Inode: 131         Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:etc_runtime_t:s0
Access: 2020-12-05 14:58:04.922170865 +0800
Modify: 2020-12-05 14:57:52.018170477 +0800
Change: 2020-12-05 14:58:04.922170865 +0800
 Birth: -

3)-m选项,改变file的mtime和ctime时间
[root@centos8 data]# touch -m file
[root@centos8 data]# stat file
  File: file
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d      Inode: 131         Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:etc_runtime_t:s0
Access: 2020-12-05 14:58:04.922170865 +0800
Modify: 2020-12-05 14:58:18.154171262 +0800
Change: 2020-12-05 14:58:18.154171262 +0800
 Birth: -

4)-t选项,指定file的atime和mtime时间
[root@centos8 data]# touch -t 12031118 file
[root@centos8 data]# stat file
  File: file
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d      Inode: 131         Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:etc_runtime_t:s0
Access: 2020-12-03 11:18:00.000000000 +0800
Modify: 2020-12-03 11:18:00.000000000 +0800
Change: 2020-12-05 14:59:18.114173062 +0800
 Birth: -

5)-c选项,如果文件不存在,则不创建
[root@centos8 data]# ll
total 0
-rw-r--r--. 1 root root 0 Dec  3 11:18 file
[root@centos8 data]# touch -c file2		##-c选项,没有创建file2文件
[root@centos8 data]# ll
total 0
-rw-r--r--. 1 root root 0 Dec  3 11:18 file

2、touch命令不支持通配符,因为通配符是过滤现有条件下的文件或内容。

[root@centos8 tmpdata]# touch file*.log
[root@centos8 tmpdata]# touch file[[:digit:]].txt
[root@centos8 tmpdata]# ls
file[[:digit:]].txt  file*.log


3、touch创建含日期时间的文件名

[root@centos8 data]# date
Sat Dec  5 15:15:23 CST 2020
[root@centos8 data]# touch mysql_backup_`date -d '-7 day' +%F_%T`.log
[root@centos8 data]# ll
-rw-r--r--. 1 root root 0 Dec  5 15:15  mysql_backup_2020-11-28_15:15:56.log
[root@centos8 data]# touch mysql_backup_$(date -d '-180 day' +%F_%T).log
[root@centos8 data]# ll
-rw-r--r--. 1 root root 0 Dec  5 15:18  mysql_backup_2020-06-08_15:18:17.log

4.2 复制文件和目录

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

格式:

cp [OPTION]... [-T] SOURCE 				#复制源到目标
cp [OPTION]... SOURCE... DIRECTORY		#复制多个源文件到目录(不能是文件)
cp [OPTION]... -t DIRECTORY SOURCE...	#与上条相反,先是目录,后面跟多个源文件

常用选项:

  • -i 如果目标已存在,覆盖前提示是否覆盖

  • -n 不覆盖,注意两者顺序

  • -r, -R 递归复制目录及内部的所有内容

  • -a 归档,相当于-dR --preserv=all,常用于备份功能

  • -d --no-dereference --preserv=links 不复制原文件,只复制链接名

  • --preserv=[ATTR_LIST]

    ​ mode: 权限

    ​ ownership: 属主属组

    ​ timestamp:

    ​ links

    ​ xattr

    ​ context

    ​ all

  • -p 等同--preserv=mode,ownership,timestamp

  • -v --verbose

  • -f --force

  • -u --update 只复制源比目标更新文件或目标不存在的文件

  • -b 目标存在,覆盖前先备份,默认形式为 filename~ ,只保留最近的一个备份

  • --backup=numbered 目标存在,覆盖前先备份加数字后缀,形式为filename.~#~ ,可以保留多 个版本

部分选项范例:

1)-p选项
[root@centos7 data]# cp ~dong/issue /data/issue_dong
[root@centos7 data]# cp -p ~dong/issue /data/issue_dong_p
[root@centos7 data]# ll iss*
-rw-r--r-- 1 root root 23 Dec  5 15:41 issue_dong
-rw-r--r-- 1 dong dong 23 Dec  5 15:41 issue_dong_p		##-p选项,可以复制文件的权限

2)-d选项
#复制链接文件时,其实复制的就是文件本身。-d可以拷贝链接文件;-a就保留了所有属性,包括-d -p -R等
[root@centos8 data]# ll /etc/redhat-release
lrwxrwxrwx. 1 root root 14 Jun  3  2020 /etc/redhat-release -> centos-release
[root@centos8 data]# cp /etc/redhat-release /data/
[root@centos8 data]# ll /etc/centos-release /data/redhat-release
-rw-r--r--. 1 root root 38 Dec  5 15:49 /data/redhat-release
-rw-r--r--. 1 root root 38 Jun  3  2020 /etc/centos-release
[root@centos8 data]# cat !*
cat redhat-release /etc/centos-release
CentOS Linux release 8.2.2004 (Core)
CentOS Linux release 8.2.2004 (Core)

3)-b选项
#目标存在,覆盖前先备份,默认形式为 filename~,只保留最近的一个备份;如果先执行的是--backup=numbered,再执行-b选项,那么会依据--backup的形式来延续,即filename.~#~

##1)创建issue文件,内容是magedu
[root@centos8 data]# echo magedu >issue
[root@centos8 data]# cat issue
magedu
[root@centos8 data]# cp -b /etc/issue .		##使用-b选项,覆盖前备份文件
cp: overwrite './issue'? y
[root@centos8 data]# ll
total 8
-rw-r--r--. 1 root root 23 Dec  5 15:56 issue
-rw-r--r--. 1 root root  7 Dec  5 15:56 issue~		##生成的备份文件
[root@centos8 data]# cat issue issue~
\S
Kernel \r on an \m		##以上是issue的内容

magedu					##这是原来/data/issue的内容,-b选项将其备份为issue~文件

##2)修改issue的内容为hello,使用--backup=numbered选项
[root@centos8 data]# echo hello >issue
[root@centos8 data]# cp --backup=numbered /etc/issue .	
cp: overwrite './issue'? y
[root@centos8 data]# ll
total 12
-rw-r--r--. 1 root root 23 Dec  5 16:00 issue
-rw-r--r--. 1 root root  7 Dec  5 15:56 issue~
-rw-r--r--. 1 root root  6 Dec  5 15:59 issue.~1~		##生成后缀是~#~的备份文件
[root@centos8 data]# cat issue issue.~1~
\S
Kernel \r on an \m		##以上是issue的内容

hello					##这是原来/data/issue的内容

##3)再次使用-b选项,就会延续--backup=numbered的备份方式
[root@centos8 data]# cp -b /etc/issue .
cp: overwrite './issue'? y
[root@centos8 data]# ll
total 20
-rw-r--r--. 1 root root 23 Dec  5 16:00 issue
-rw-r--r--. 1 root root  7 Dec  5 15:56 issue~
-rw-r--r--. 1 root root  6 Dec  5 15:59 issue.~1~
-rw-r--r--. 1 root root 23 Dec  5 16:00 issue.~2~


cp复制文件和目录列表说明:

源/目标 不存在 存在且为文件 存在且为目录
一个文件 新建DEST,并将SRC的内容填充至DEST 将SRC中的内容覆盖至DEST中,会有数据丢失的风险,建议用-i选项 在DEST下新建与源文件同名的文件,并将SRC中的内容填充至同名的新文件中
多个文件 提示错误 提示错误 在DEST下新建与源文件同名的文件,并将SRC中的内容复制到同名的新文件中
目录(使用-r选项) 创建指定DEST同名目录,复制SRC目录中所有文件到DEST中 提示错误 在DEST下新建与源目录同名的目录,并将SRC中的内容复制到新目录中

例如:新建两个目录a和b,各有a.txt和b.txt。

1)将a目录cp到b目录下并改名为abak,则在b目录下生成了一个abak的目录。

2)再次cp,则将a目录cp到了b/abak目录下,生成了一个b/abak/a目录。

3)再次cp,因为已经有了a目录,所以这次才提示覆盖。

[root@centos8 tmp]# mkdir -p a b	##创建a和b两个目录
[root@centos8 tmp]# ll
total 4
drwxr-xr-x. 2 root root    6 Dec  4 05:13 a
drwxr-xr-x. 2 root root    6 Dec  4 05:13 b
[root@centos8 tmp]# touch a/a.txt
[root@centos8 tmp]# touch b/b.txt	##分别创建两个文件
[root@centos8 tmp]# cp -r a b/abak	##复制a目录到b/abak(abak不存在)
[root@centos8 tmp]# ll b
total 0
drwxr-xr-x. 2 root root 19 Dec  4 05:14 abak	##相当于把a目录改名为abak目录
-rw-r--r--. 1 root root  0 Dec  4 05:14 b.txt
[root@centos8 tmp]# cp -r a b/abak		##再次复制a目录到b/abak(abak已经存在)
[root@centos8 tmp]# tree b
b
├── abak
│   ├── a			##abak目录已存在,就是把a目录复制到了abak目录下
│   │   └── a.txt
│   └── a.txt
└── b.txt
2 directories, 3 files

[root@centos8 tmp]# cp -r a b/abak		##再次复制a目录到abak(abak/a已经存在)
cp: overwrite 'b/abak/a/a.txt'? y		##abak/a已经存在,会提示覆盖
[root@centos8 tmp]# tree b
b
├── abak
│   ├── a
│   │   └── a.txt
│   └── a.txt
└── b.txt
2 directories, 3 files

特殊文件的cp案例:

#复制/dev/zero到/data/zero.bak,如果不停止,会一直复制,直到磁盘被占满。
[root@centos8 data]# cp /dev/zero ./zero.bak
^C
[root@centos8 data]# ll -h		##几秒钟的时间,文件大小就将近1G了
total 996M
-rw-r--r--. 1 root root 996M Dec  5 16:31 zero.bak

#清空大文件,可以复制/dev/null,来覆盖大文件,会将该文件清零。
[root@centos8 data]# cp /dev/null zero.bak
cp: overwrite 'zero.bak'? y
[root@centos8 data]# ll -h
total 0
-rw-r--r--. 1 root root 0 Dec  5 16:31 zero.bak


4.3 移动和重命名文件

1、mv命令

mv 命令可以实现文件或目录的移动和改名。

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

格式:

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

常用选项:

  • -i 交互式
  • -f 强制
  • -b 目标存在,覆盖前先备份

实例:

[root@centos8 data]# mv file filebak	##相当于把file改名为filebak
[root@centos8 data]# ll
-rw-r--r--. 1 root root  0 Dec  5 16:47 filebak
[root@centos8 data]# touch file
[root@centos8 data]# mv -b filebak file
mv: overwrite 'file'? y
[root@centos8 data]# ll
-rw-r--r--. 1 root root  0 Dec  5 16:47 file
-rw-r--r--. 1 root root  0 Dec  5 16:48 file~

2、rename命令

mv相当于把文件改名,只能改一个;而rename 可以批量修改文件名。

格式:

rename [options] <expression> <replacement> <file>...

常用选项:

  • -v 显示替换过程
  • -n 不替换
  • -o 不覆盖存在的文件

实例:

[root@centos8 tmpdata]# touch file{1..5}.txt
[root@centos8 tmpdata]# touch file5.txt.bak
[root@centos8 tmpdata]# rename txt txt.bak *
[root@centos8 tmpdata]# ls
file1.txt.bak  file2.txt.bak  file3.txt.bak  file4.txt.bak  file5.txt.bak

#为所有f开头的conf文件加上.bak后缀:rename 'conf' 'conf.bak' f*
[root@centos8 data]# rename conf.bak log f*
[root@centos8 data]# ll
-rw-r--r--. 1 root root  0 Dec  5 16:54 file1.log
-rw-r--r--. 1 root root  0 Dec  5 16:54 file2.log
-rw-r--r--. 1 root root  0 Dec  5 16:54 file3.log
-rw-r--r--. 1 root root  0 Dec  5 16:55 gile.conf.bak

#把上例中所有的log后缀去掉:
[root@centos8 data]# rename .log '' *.log
[root@centos8 data]# ll
-rw-r--r--. 1 root root  0 Dec  5 16:54 file1
-rw-r--r--. 1 root root  0 Dec  5 16:54 file2
-rw-r--r--. 1 root root  0 Dec  5 16:54 file3
-rw-r--r--. 1 root root  0 Dec  5 16:55 gsdlf.conf.bak

4.4 删除文件

1、删除普通文件

注意:此命令非常危险,慎重使用,建议使用mv 代替 rm;或者把/usr/bin/rm改名。

格式:

rm [OPTION]... FILE...

常用选项:

  • -i 交互式
  • -f 强制删除
  • -r 递归
  • --no-preserve-root 删除/

范例:

删除隐藏文件时,直接用.*,会提示删除..父目录;避免这个提示发生,需用.[^.]*
[root@nfs01 tmpdata]# cd file
[root@nfs01 file]# touch .a .b .c a b c
[root@nfs01 file]# ls -a
.  ..  a  .a  b  .b  c  .c
[root@nfs01 file]# rm -rf .*	##只能删除.开头的隐藏文件,也包含.和..,而不删除普通文件
rm: refusing to remove ‘.’ or ‘..’ directory: skipping ‘.’
rm: refusing to remove ‘.’ or ‘..’ directory: skipping ‘..’
[root@centos8 file]# ls -a
.  ..  a  b  c

[root@nfs01 file]# touch .a .b .c
[root@nfs01 file]# ls -a
.  ..  a  .a  b  .b  c  .c
[root@nfs01 file]# rm -rf .[^.]*	##只能删除.开头的隐藏文件,不包含.和..,不删除普通文件
[root@nfs01 file]# ls -a
.  ..  a  b  c
[root@nfs01 file]# rm -rf .[^.]* *	##除了.和..的所有文件都删除了


[root@nfs01 file]# cp -av . /opt/
#这是把file目录下的所有文件(包括隐藏)复制到/opt下
[root@nfs01 file]# rm -rf /opt/.
#这不能删除所有文件
[root@nfs01 file]# rm -rf /opt/*	##删除普通文件
[root@nfs01 file]# rm -rf /opt/.[^.]*	##删除隐藏文件
[root@nfs01 file]# rm -rf /opt/* .[^.]*	##删除所有文件


2、删除特殊文件

特殊文件的删除,rm -- 是只是删除-file;而对于其他特殊符号,不能删除。
通常做法是rm ./file或rm 绝对路径/file
如:rm /data/-f;  rm ./-f;  rm /data/~等
#将名为 “/data/-f” 的文件删除
[root@centos8 data]# touch /data/-f
[root@centos8 data]#rm -f -f 	#虽然没有错误提示,但文件没有被删除
[root@centos8 data]# ls
-f
[root@centos8 data]#rm -- -f
rm: remove regular empty file '-f'? y
[root@centos8 data]#rm ./-f
rm: remove regular empty file './-f'? y
[root@centos8 data]#rm -f /data/-f		##这三种方法都可以删除/data/-f文件

#新建~文件
[root@centos8 data]#touch '~'
[root@centos8 data]#ls
'~'
[root@centos8 data]#rm -f ~
rm: cannot remove '/root': Is a directory
[root@centos8 data]#rm -- ~
rm: cannot remove '/root': Is a directory
[root@centos8 data]#rm -f ./~
[root@centos8 data]#rm /data/~
rm: remove regular empty file '/data/~'? y
[root@centos8 data]#ls
空

3、定义别名

将rm定义成mv的别名,实现rm file = mv file /tmp

1)#比较简单的别名定义:
[root@centos8 data]# vim /etc/bashrc
alias rm="mv -t /tmp"	##最后一行添加,当执行rm的时候,就会把文件或目录移动到/tmp下
[root@centos8 data]# . /etc/bashrc
[root@centos8 data]# ll
-rw-r--r--. 1 root root  0 Dec  5 04:58 a
drwxr-xr-x. 2 root root 24 Dec  5 04:27 dir
[root@centos8 data]# rm a
[root@centos8 data]# ll /tmp
total 0
-rw-r--r--. 1 root root  0 Dec  5 04:58 a
[root@centos8 dir]# touch .a .b .c
[root@centos8 dir]# ll -a
-rw-r--r--.  1 root root   0 Dec  5 05:02 .a
-rw-r--r--.  1 root root   0 Dec  5 04:48 a
-rw-r--r--.  1 root root   0 Dec  5 05:02 .b
-rw-r--r--.  1 root root   0 Dec  5 04:54 b
-rw-r--r--.  1 root root   0 Dec  5 05:02 .c
[root@centos8 data]# rm dir
[root@centos8 data]# ll /tmp/dir/ -a
-rw-r--r--.  1 root root   0 Dec  5 05:02 .a
-rw-r--r--.  1 root root   0 Dec  5 04:48 a
-rw-r--r--.  1 root root   0 Dec  5 05:02 .b
-rw-r--r--.  1 root root   0 Dec  5 04:54 b
-rw-r--r--.  1 root root   0 Dec  5 05:02 .c

2)#也可以自定义文件夹,比如创建包含日期的目录,然后再选择移动到该目录。
[root@centos8 data]# vi /etc/bashrc
#最后添加一行
alias rm='DIR=/tmp/back_`date +%F`;mkdir -p $DIR;mv -t $DIR'
[root@centos8 data]# source /etc/bashrc
[root@centos8 data]# touch file3
[root@centos8 data]# rm file3
[root@centos8 data]# ll /tmp/back_2020-12-06/
total 0
-rw-r--r--. 1 root root 0 Dec  6 12:07 file3
[root@centos8 data]# reboot
[root@centos8 data]# touch file4
[root@centos8 data]# rm file4
[root@centos8 data]# ll /tmp/back_2020-12-06/
total 0
-rw-r--r--. 1 root root 0 Dec  6 12:07 file3
-rw-r--r--. 1 root root 0 Dec  6 12:08 file4



05、删除/tmp/profile文件中的行首的空白字符

[root@centos8 ~]# cp -a /etc/profile /tmp
[root@centos8 ~]# ll /tmp
total 4
-rw-r--r--. 1 root root 2123 Dec  5  2020 profile
[root@centos8 tmp]# cat profile
pathmunge () {
    case ":${PATH}:" in
        *:"$1":*)
            ;;
        *)
            if [ "$2" = "after" ] ; then
                PATH=$PATH:$1
            else
                PATH=$1:$PATH
            fi
    esac
}
[root@centos8 tmp]# cat profile|tr -d [:blank:]
[root@centos8 tmp]# cat profile|tr -d ' '		##这两个都可以
...省略...
pathmunge(){
case":${PATH}:"in
*:"$1":*)
;;
*)
if["$2"="after"];then
PATH=$PATH:$1
else
PATH=$1:$PATH
fi
esac
}
...省略...


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

​ 在vim中设置tab缩进为4个字符,若要在所有用户的环境中生效,需要编辑/etc/vimrc文件,启用set expandtab,然后指定空格的个数set tabstop=4。

[root@centos8 data]# vim f1		##编辑f1,按一下tab键后,输入字符tab
[root@centos8 data]# cat f1
        tab
        
##ASCII码中16进制查看,其中09表示tab键,74 61 62表示tab字符,0a表示换行符
[root@centos8 data]# hexdump -C f1
00000000  09 74 61 62 0a                                    |.tab.|
00000005

[root@centos8 data]# vim /etc/vimrc		##编辑vimrc,启用set expandtab,设置set tabstop=4
[root@centos8 data]# cat /etc/vimrc
...省略...
set history=50          " keep 50 lines of command line history
set ruler               " show the cursor position all the time

set expandtab
set tabstop=4
...省略...

[root@centos8 data]# vim f1		##再次编辑f1,按一下tab键,输入tab4字符
[root@centos8 data]# cat f1
        tab
    tab4
[root@centos8 data]# hexdump -C f1	##16进制查看,20 20 20 20表示4个空格
00000000  09 74 61 62 0a 20 20 20  20 74 61 62 34 0a        |.tab.    tab4.|
0000000e