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