Linux文件管理
Linux文件管理
在linux中,一切皆文件,linux把几乎所有的系统资源抽象成为文件的形式,包括硬件设备,网络通信接口等。因此文件管理即为linux的基础。
1. linux目录结构
linux为一个单根的倒置树状目录结构,根目录使用“/”表示,路径中上级和下级目录使用“/”分割,具体目录结构如下:
[root@xuzhichao ~]# ll /
总用量 28
lrwxrwxrwx. 1 root root7 11月 4 2020 bin -usr/bin
dr-xr-xr-x. 5 root root 4096 11月 4 2020 boot
drwxr-xr-x 20 root root 3300 5月 5 21:14 dev
drwxr-xr-x. 135 root root 8192 5月 5 21:16 etc
drwxr-xr-x. 3 root root 16 4月 28 17:50 home
lrwxrwxrwx. 1 root root7 11月 4 2020 lib -usr/lib
lrwxrwxrwx. 1 root root9 11月 4 2020 lib64 -usr/lib64
drwxr-xr-x. 2 root root6 4月 11 2018 media
drwxr-xr-x2 root root0 5月 5 21:14 misc
drwxr-xr-x. 2 root root6 4月 11 2018 mnt
drwxr-xr-x2 root root0 5月 5 21:14 net
drwxr-xr-x. 3 root root 16 11月 4 2020 opt
dr-xr-xr-x 138 root root0 5月 5 21:14 proc
dr-xr-x---. 8 root root 4096 5月 5 21:17 root
drwxr-xr-x 39 root root 1220 5月 5 21:14 run
lrwxrwxrwx. 1 root root8 11月 4 2020 sbin -usr/sbin
drwxr-xr-x. 2 root root6 4月 11 2018 srv
dr-xr-xr-x 13 root root0 5月 5 21:14 sys
drwxrwxrwt. 11 root root 4096 5月 5 21:17 tmp
drwxr-xr-x. 13 root root 155 11月 4 2020 usr
drwxr-xr-x. 21 root root 4096 11月 4 2020 var
linux的文件目录规范遵循FHS规范,各个目录的主要意义如下:
- /boot
系统启动引导文件存放的目录,主要包括引导程序Bootloader,内核文件,initramfs文件等内容。
/boot目录内容如下:
[root@xuzhichao ~]# ll /boot/
-rw-r--r--. 1 root root 153562 4月 1 2020 config-3.10.0-1127.el7.x86_64 //内核编译配置文件
drwxr-xr-x. 3 root root 17 11月 4 2020 efi
drwxr-xr-x. 2 root root 27 11月 4 2020 grub
drwx------. 5 root root 97 11月 4 2020 grub2 //grub2引导程序目录
-rw-------. 1 root root 77654357 11月 4 2020 initramfs-0-rescue-d9abb103c9b943b0bfbbb212ed3dee7f.img
-rw-------. 1 root root 31943320 11月 4 2020 initramfs-3.10.0-1127.el7.x86_64.img //ramfs文件
-rw-------. 1 root root 13885304 11月 4 2020 initramfs-3.10.0-1127.el7.x86_64kdump.img
-rw-r--r--. 1 root root 320512 4月 1 2020 symvers-3.10.0-1127.el7.x86_64.gz
-rw-------. 1 root root 3611662 4月 1 2020 System.map-3.10.0-1127.el7.x86_64
-rwxr-xr-x. 1 root root 6762688 11月 4 2020 vmlinuz-0-rescue-d9abb103c9b943b0bfbbb212ed3dee7f //救援模式
-rwxr-xr-x. 1 root root 6762688 4月 1 2020 vmlinuz-3.10.0-1127.el7.x86_64 //内核文件
-
/bin
存放所有用户使用的基本命令,该目录不能独立分区,系统在启动时会使用该目录下的文件。 -
/sbin
存放root用户使用的命令,该目录不能独立分区,系统在启动时会使用该目录下的文件。 -
/lib
存放系统启动时程序依赖的基本共享库文件,/lib/modules用于存放内核模块文件,/lib64目录与/lib目录作用类似,只是专用于存储x86_64系统的共享库文件。 -
/etc
该目录专用于放置系统和程序的配置文件,-
/etc/sysconfig/network-scripts/: 用于存放网卡和路由相关的配置文件;
-
/etc/hostname: 放置主机名解析配置文件;
-
/etc/serivice: 放置系统服务器名称与端口号对应的文件;
-
-
/home
普通用户的家目录。- /home/USERNAME: 放置USERNAME用户的相关数据,会自动复制/etc/skel中的文件到用户目录下;
[root@xuzhichao ~]# ll /etc/skel/ -a
总用量 24
drwxr-xr-x. 3 root root 78 11月 4 2020 .
drwxr-xr-x. 135 root root 8192 5月 5 21:16 ..
-rw-r--r--. 1 root root 18 4月 1 2020 .bash_logout //定义用户登出执行的脚本
-rw-r--r--. 1 root root 193 4月 1 2020 .bash_profile //定义用户变量等内容
-rw-r--r--. 1 root root 231 4月 1 2020 .bashrc //定义用户别名等内容
drwxr-xr-x. 4 root root 39 11月 4 2020 .mozilla
-
/root
管理员用户的家目录。 -
/proc
一个虚拟的文件系统,内容是当前系统正在运行的实时状态,包括进程运行的实时状态,内核参数等。- /proc/NUMBER:表示进程号为NUMBER的进程运行状态
[root@xuzhichao ~]# ls /proc/sys/ //调整内核参数目录
abi crypto debug dev fs kernel net sunrpc user vm
-
/dev
设备文件的存放目录。- /dev/null : 黑洞设备,类似于垃圾回收站;
- /dev/random:随机设备,可产生随机字符;
- /dev/zero:能源源不断生成数据;
-
/usr
unix system resources 的缩写,linux最重要的目录之一,上文提到的/bin /sbin /lib /lib64均是/usr对应目录的软连接,同时/usr/local目录还用于用户应用程序的安装。
-
/var
存放一些变化的文件。
- /var/log:存放日志文件
- /var/tmp:进程产生的临时文件
-
/tmp
存放临时文件。
-
/opt
第三方应用程序的安装位置。
-
/media
便携式媒体设备挂载点,;例如光盘。
-
/mnt
临时文件系统挂载点。
-
/srv
系统上运行的服务使用到的数据。
1.1. 绝对路径与相对路径
-
绝对路径:即从根目录“/”开始的路径。
-
相对路径:相对从当前目录开始表示的路径。
- “.”:表示当前所在目录。
- “..”:表示当前目录的上一级目录,即父目录。
[root@xuzhichao ~]# pwd /root [root@xuzhichao ~]# cd .. #切换至父目录 [root@xuzhichao /]# pwd / [root@xuzhichao /]# cd . #切换至当前目录 [root@xuzhichao /]# pwd /
1.2. 切换目录命令cd
cd 命令格式:
cd 切换到的目录名称
cd命令常见用法:
[root@xuzhichao ~]# cd /home/
[root@xuzhichao home]# cd - #切换到之前的工作目录
/root
[root@xuzhichao ~]# cd .. #切换到上层目录
[root@xuzhichao /]# cd ~ #切换到当前用户的家目录
[root@xuzhichao ~]# cd ~xu #切换到xu用户的家目录
[root@xuzhichao xu]# pwd
/home/xu
[root@xuzhichao xu]# cd . #切换到当前目录
[root@xuzhichao xu]# cd .. #切换到上级目录
[root@xuzhichao home]#
2.Linux文件类型
linux中有很多的文件类型,可以通过ls -l命令查看,最左边的一个字符即为文件的类型,linux中文件类型主要有以下几种:
-
普通文件(-)
普通文件又可以分为以下几种:
-
纯文本文件
例如常见的配置文件:
[root@xuzhichao home]# cat /etc/issue #系统登录前的提示信息 \S Kernel \r on an \m [root@xuzhichao home]# cat /etc/motd #系统登录成功后的提示信息
-
二进制可执行文件
二进制文件通过是可以运行的,不支持使用cat命令直接查看,查看时显示未乱码。
[root@xuzhichao home]# ll /bin/cat -rwxr-xr-x. 1 root root 54080 Aug 20 2019 /bin/cat [root@xuzhichao home]# ll /bin/awk lrwxrwxrwx. 1 root root 4 Nov 4 2020 /bin/awk -> gawk [root@xuzhichao home]# ll /bin/grep -rwxr-xr-x. 1 root root 159024 Aug 3 2017 /bin/grep
-
数据格式文件
数据格式文件时一些程序在运行过程中需要读取的特定格式的文件,通常只能由该程序打开。
[root@xuzhichao home]# ll /var/log/wtmp #该文件只能使用last命令查看,显示最近系统登录的用户,终端,登录地址,时间等信息。 -rw-rw-r--. 1 root utmp 19968 May 6 12:22 /var/log/wtmp [root@xuzhichao home]# last root pts/0 192.168.20.1 Thu May 6 12:22 still logged in root pts/0 192.168.20.1 Wed May 5 21:17 - 12:22 (15:05) root pts/0 192.168.20.1 Wed May 5 21:14 - 21:16 (00:02) reboot system boot 3.10.0-1127.el7. Wed May 5 21:14 - 14:32 (17:18) root pts/0 192.168.20.1 Wed Apr 28 09:50 - crash (7+11:23) root pts/0 192.168.20.1 Wed Apr 28 09:48 - 09:50 (00:01) root pts/0 192.168.20.1 Wed Apr 28 09:28 - 09:48 (00:20) root tty1 Wed Apr 28 09:27 - 00:06 (14:38) reboot system boot 3.10.0-1127.el7. Wed Apr 28 09:25 - 14:32 (8+05:06) root pts/0 192.168.20.1 Tue Nov 3 17:48 - down (00:44) root pts/0 192.168.20.1 Tue Nov 3 17:47 - 17:48 (00:01) root pts/0 192.168.20.1 Tue Nov 3 17:42 - 17:47 (00:04) root pts/0 192.168.20.1 Tue Nov 3 17:37 - 17:42 (00:05) root tty1 Tue Nov 3 17:28 - 18:33 (01:04) reboot system boot 3.10.0-1127.el7. Wed Nov 4 01:27 - 18:33 (-6:-54) root tty1 Wed Nov 4 01:13 - 01:27 (00:14) root tty1 Wed Nov 4 01:12 - 01:12 (00:00) xu pts/1 :0 Wed Nov 4 01:11 - down (00:15) xu pts/0 :0 Wed Nov 4 01:11 - down (00:16) xu :0 :0 Wed Nov 4 01:11 - down (00:16) reboot system boot 3.10.0-1127.el7. Wed Nov 4 01:10 - 01:27 (00:16) reboot system boot 3.10.0-1127.el7. Wed Nov 4 01:06 - 01:27 (00:21) reboot system boot 3.10.0-1127.el7. Wed Nov 4 00:46 - 01:27 (00:40) wtmp begins Wed Nov 4 00:46:56 2020
-
-
目录文件(d)
即一般的目录。
-
链接文件(l)
链接文件即将两个文件建立一个关联关系。链接分为硬链接和软连接,硬链接为文件访问的另外一个入口,软连接类似于windows中的快捷方式。
-
管道文件(p)
管道文件是一个伪文件,实际为一段内核缓冲区,主要用于进程间的通信,只支持半双工模式,即同一时间只能用于一个方向传输数据。
[root@xuzhichao home]# ll /run prw------- 1 root root 0 May 5 21:14 autofs.fifo-misc prw------- 1 root root 0 May 5 21:14 autofs.fifo-net
-
字符设备文件(c)
通常是串行接口设备的文件,例如鼠标,键盘。
[root@xuzhichao home]# ll /dev/zero /dev/null /dev/tty* crw-rw-rw- 1 root root 1, 3 May 5 21:14 /dev/null crw-rw-rw- 1 root tty 5, 0 May 5 21:14 /dev/tty crw--w---- 1 root tty 4, 0 May 5 21:14 /dev/tty0 crw--w---- 1 root tty 4, 1 May 5 21:14 /dev/tty1 crw--w---- 1 root tty 4, 10 May 5 21:14 /dev/tty10 crw--w---- 1 root tty 4, 11 May 5 21:14 /dev/tty11 crw--w---- 1 root tty 4, 12 May 5 21:14 /dev/tty12
-
块设备文件(b)
一般为磁盘,硬盘等以“块”为单位进行随机访问的设备。
[root@xuzhichao home]# ll /dev/sd* brw-rw---- 1 root disk 8, 0 May 5 21:14 /dev/sda brw-rw---- 1 root disk 8, 1 May 5 21:14 /dev/sda1 brw-rw---- 1 root disk 8, 2 May 5 21:14 /dev/sda2
-
套接字文件(s)
socket,通常被用于基于网络的数据通信使用,可实现一台主机的两个进程之间通过网络进行通信。
[root@xuzhichao home]# ll /run/*.sock srw-rw-rw- 1 root root 0 May 5 21:14 /run/gssproxy.sock srw-rw-rw- 1 root root 0 May 5 21:14 /run/rpcbind.sock
PS:与windows不同,Linux的文件扩展名一般不代表任何意义(压缩文件除外),仅用于人为区分文件类型。
2.1 file命令:查看文件类型
file命令可用于判断一个文件的类型,然后使用适当的命令来打开文件。
语法如下:
[root@xuzhichao home]# file --help
Usage: file [OPTION...] [FILE...]
-b, --brief #列出文件辨识结果时,不显示文件名称。
-f, --files-from FILE #列出文件FILE中包含的所有文件名的文件类型
-F, --separator STRING #指定显示结果中文件和文件类型之间的分隔符,默认为“:”
-L, --dereference #显示软连接对应的真实文件的文件类型,默认为显示软连接本身的软件类型
-z #尝试去解读压缩文件的内容
file常见用法如下:
[root@xuzhichao home]# file /bin/cat #二进制格式文件,格式为ELK
/bin/cat: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=b97cc8358edb123e8a9e21390f30924fe66a5e55, stripped
[root@xuzhichao home]# file /etc/passwd #普通文件文件
/etc/passwd: ASCII text
[root@xuzhichao home]# file /var/log/wtmp #数据文件
/var/log/wtmp: data
[root@xuzhichao home]# file /dev/sda #块设备文件
/dev/sda: block special
[root@xuzhichao home]# file /dev/zero #字符设备文件
/dev/zero: character special
[root@xuzhichao home]# file /etc/grub2.cfg #软链接文件
/etc/grub2.cfg: symbolic link to `../boot/grub2/grub.cfg'
[root@xuzhichao home]# file -L /etc/grub2.cfg #显示软链接的真实文件类型
/etc/grub2.cfg: ASCII text
[root@xuzhichao home]# file -b /dev/zero #显示时不输出文件名
character special
[root@xuzhichao home]# file -F "=====" /dev/zero #执行显示时的分隔符
/dev/zero===== character special
3.Linux文件和目录操作
3.1 tree命令:查看文件目录结构
使用前需要预先安装:
[root@xuzhichao home]# yum install tree -y
tree常用参数如下:
选项 | 说明 |
---|---|
-a | 显示当前目录的所有文件和目录 |
-d | 仅显示目录 |
-L | 指定显示目录的层级 |
-p | 显示权限属性 |
tree的用法如下:
#查看boot下所有的目录和文件
[root@xuzhichao home]# tree /boot/
/boot/
|-- System.map-3.10.0-1127.el7.x86_64
|-- config-3.10.0-1127.el7.x86_64
|-- efi
| `-- EFI
| `-- centos
|-- grub
| `-- splash.xpm.gz
|-- grub2
| |-- device.map
| |-- fonts
| | `-- unicode.pf2
| |-- grub.cfg
| |-- grubenv
| |-- i386-pc
| | |-- acpi.mod
| | |-- adler32.mod
| | |-- affs.mod
...(省略部分内容)...
8 directories, 315 files
#查看/boot目录下的一级目录
[root@xuzhichao home]# tree -d -L 1 /boot/
/boot/
|-- efi
|-- grub
`-- grub2
3 directories
#查看/boot目录下的二级目录
[root@xuzhichao home]# tree -d -L 2 /boot/
/boot/
|-- efi
| `-- EFI
|-- grub
`-- grub2
|-- fonts
|-- i386-pc
`-- locale
7 directories
#查看/boot目录下的二级目录并显示权限
[root@xuzhichao home]# tree -d -L 2 -p /boot/
/boot/
|-- [drwxr-xr-x] efi
| `-- [drwxr-xr-x] EFI
|-- [drwxr-xr-x] grub
`-- [drwx------] grub2
|-- [drwxr-xr-x] fonts
|-- [drwxr-xr-x] i386-pc
`-- [drwxr-xr-x] locale
7 directories
3.2 ls命令:查看文件列表
ls命令用于查看文件或目录的信息,语法格式如下:
ls [OPTION]... [FILE]...
常用的选项如下:
选项 | 说明 |
---|---|
-l | 显示长格式的文件列表 |
-a | 显示以“.”开头的隐藏文件 |
-d | 仅显示目录本身,不显示目录下的内容 |
-i | 显示文件的inode编号 |
-R | 递归显示目录及其子目录下的内容 |
-r | 反向排序 |
-t | 用文件的mtime时间排序 |
-h | 以人性化格式显示文件大小 |
-S | 以文件大小排序 |
--time= | 输出访问时间(atime)或文件属性改变的时间(ctime) |
--full-time | 显示文件的完整时间格式 |
ls命令用法如下:
#示例一:查看文件的inode编号
[root@xuzhichao ~]# ll -i
total 12
67160130 -rw-------. 1 root root 2109 Nov 4 2020 anaconda-ks.cfg
67160136 -rw-r--r--. 1 root root 2157 Nov 4 2020 initial-setup-ks.cfg
67160134 -rw-r--r-- 1 root root 1883 Apr 28 09:54 passwd
#示例二:以易读方式显示文件大小
[root@xuzhichao ~]# ll -h
total 12K
-rw-------. 1 root root 2.1K Nov 4 2020 anaconda-ks.cfg
-rw-r--r--. 1 root root 2.2K Nov 4 2020 initial-setup-ks.cfg
-rw-r--r-- 1 root root 1.9K Apr 28 09:54 passwd
#示例三:显示文件完整时间
[root@xuzhichao ~]# ll -h --full-time
total 12K
-rw-------. 1 root root 2.1K 2020-11-04 00:44:12.239050460 +0800 anaconda-ks.cfg
-rw-r--r--. 1 root root 2.2K 2020-11-04 00:47:49.734337768 +0800 initial-setup-ks.cfg
-rw-r--r-- 1 root root 1.9K 2021-04-28 09:54:31.071120488 +0800 passwd
#示例四:只显示/boot下的目录
[root@xuzhichao ~]# ls -d /boot/*/
/boot/efi/ /boot/grub/ /boot/grub2/
#示例五:只显示当前目录的隐藏文件
[root@xuzhichao ~]# l.
. .. .Xauthority .bash_history .bash_logout .bash_profile .bashrc .cache .config .cshrc .dbus .kde .local .pki .tcshrc .viminfo
[root@xuzhichao ~]# ls -d .*
. .. .Xauthority .bash_history .bash_logout .bash_profile .bashrc .cache .config .cshrc .dbus .kde .local .pki .tcshrc .viminfo
#示例六:递归显示当前目录下的内容,包括隐藏文件
[root@xuzhichao ~]# ls -R -a
.:
. .. .Xauthority .bash_history .bash_logout .bash_profile .bashrc .cache .config .cshrc .dbus .kde .local .pki .tcshrc .viminfo anaconda-ks.cfg initial-setup-ks.cfg passwd
./.cache:
. .. abrt dconf
./.cache/abrt:
. .. lastnotification
...(省略部分内容)...
默认linux为ls命令设置了别名:
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
3.3 cp命令:复制文件或目录
cp命令的语法如下:
Usage: cp [OPTION]... [-T] SOURCE DEST #复制源文件到目标文件
or: cp [OPTION]... SOURCE... DIRECTORY #复制多个文件到目标目录下
or: cp [OPTION]... -t DIRECTORY SOURCE... #复制多个文件到目标目录下,先写目录,后写文件
cp复制时各种情况如下:
cp选项如下:
选项 | 说明 |
---|---|
-a | 相当于pdr的合集 |
-d | 若源文件为链接文件,复制链接文件而非源文件本身,默认会复制源文件本身 |
-f | 强制复制,若目标文件已存在,删除目标文件后再复制 |
-p | 复制时把源文件的属性一同复制过去(备份常用) |
-r | 递归复制,用于目录的复制 |
-u | 只复制源文件比目标文件新的文件或目标不存在的文件 |
--backup=numbered | 若目标存在,在覆盖目标文件前先备份目标文件,加上数字后缀 |
-i | 若目标文件存在,在覆盖目标前会提示是否覆盖 |
-v | 显示过程 |
cp命令的用法如下:
[root@xuzhichao ~]# cp /etc/fstab fstab
#使用--backup=numbered参数复制时自动备份原文件。
[root@xuzhichao ~]# cp --backup=numbered /etc/fstab fstab
cp: overwrite 'fstab'? y
[root@xuzhichao ~]# ll fstab*
-rw-r--r-- 1 root root 465 May 10 17:22 fstab
-rw-r--r-- 1 root root 465 May 10 17:19 fstab.~1~
#备份使用-a参数,复制目录使用-r参数
[root@xuzhichao ~]# cp -a /boot/ .
#复制文件不改名
[root@xuzhichao ~]# cp /etc/passwd /tmp/
#复制文件并改名
[root@xuzhichao ~]# cp /etc/passwd /tmp/passwd-1
#复制并备份文件:
[root@xuzhichao ~]# cp /tmp/passwd{,.bak}
[root@xuzhichao ~]# ll /tmp/passwd*
-rw-r--r-- 1 root root 1883 May 10 17:29 /tmp/passwd
-rw-r--r-- 1 root root 1883 May 10 17:30 /tmp/passwd.bak
3.4 mv命令:移动文件或目录
mv命令的语法如下:
Usage: mv [OPTION]... [-T] SOURCE DEST
or: mv [OPTION]... SOURCE... DIRECTORY
or: mv [OPTION]... -t DIRECTORY SOURCE...
mv命令参数如下:
选项 | 说明 |
---|---|
-i | 若目标文件存在,在覆盖目标前会提示是否覆盖 |
-f | 强制移动,若目标文件已存在,删除目标文件后再复制 |
在使用mv移动文件或目录时:
- 如果移动的源和目标文件在同一个分区时,相当于先删除原有目录下文件的名称,然后在新的目录下创建该文件的名称,文件本身并未移动,其inode不变,故此时的移动速度很快。
- 如果移动的源和目的不在同一个分区时,相当于先复制该文件到新的目录下,然后再删除原文件,移动速度会较慢。
mv命令的用法如下:
#在本目录下移动文件
[root@xuzhichao tmp]# mv passwd passwd1
[root@xuzhichao tmp]# mkdir test
#把文件移动到test目录中
[root@xuzhichao tmp]# mv passwd1 test/
#把多个文件或目录移动到一个目录下
[root@xuzhichao tmp]# mkdir dir{1,2,3}
[root@xuzhichao tmp]# touch file{1,2,3}
[root@xuzhichao tmp]# mv dir1/ dir2/ dir3/ file1 file2 file3 test/
3.5 mkdir命令:创建目录
mkdir用于创建空目录:
Usage: mkdir [OPTION]... DIRECTORY...
参数如下:
选项 | 说明 |
---|---|
-p | 递归创建目录 |
-v | 显示过程 |
用法如下:
#创建目录
[root@xuzhichao tmp]# mkdir test2
#递归创建目录,dir1,dir2,dir3,dir4目录不存在时同时创建。
[root@xuzhichao tmp]# mkdir -pv dir1/dir2/dir3/dir4
mkdir: created directory 'dir1'
mkdir: created directory 'dir1/dir2'
mkdir: created directory 'dir1/dir2/dir3'
mkdir: created directory 'dir1/dir2/dir3/dir4'
[root@xuzhichao tmp]# ll dir1/dir2/dir3/dir4
total 0
#{ }的使用:
[root@xuzhichao tmp]# mkdir -pv dir/dir1/{x,y}/{a,b}
mkdir: created directory 'dir'
mkdir: created directory 'dir/dir1'
mkdir: created directory 'dir/dir1/x'
mkdir: created directory 'dir/dir1/x/a'
mkdir: created directory 'dir/dir1/x/b'
mkdir: created directory 'dir/dir1/y'
mkdir: created directory 'dir/dir1/y/a'
mkdir: created directory 'dir/dir1/y/b'
[root@xuzhichao tmp]# mkdir -pv dir/dir2/{x/{a,b},y}
mkdir: created directory 'dir/dir2'
mkdir: created directory 'dir/dir2/x'
mkdir: created directory 'dir/dir2/x/a'
mkdir: created directory 'dir/dir2/x/b'
mkdir: created directory 'dir/dir2/y'
[root@xuzhichao tmp]# mkdir -pv dir/dir{3,4,5/dir{6,7}}
mkdir: created directory 'dir/dir3'
mkdir: created directory 'dir/dir4'
mkdir: created directory 'dir/dir5'
mkdir: created directory 'dir/dir5/dir6'
mkdir: created directory 'dir/dir5/dir7'
[root@xuzhichao tmp]# tree dir
dir
|-- dir1
| |-- x
| | |-- a
| | `-- b
| `-- y
| |-- a
| `-- b
|-- dir2
| |-- x
| | |-- a
| | `-- b
| `-- y
|-- dir3
|-- dir4
`-- dir5
|-- dir6
`-- dir7
3.6 文件的时间属性mtime,ctime,atime
一个文件主要有三种时间属性,分别为mtime,ctime,atime。
-
mtime:
mtime(modify time)为文件内容被修改的最后时间,即文件的block发生变化,例如使用vim编辑文件。
-
atime:
atime(access time)显示的是文件最后被访问的时间,比如系统的进程直接使用或通过一些命令和脚本间接使用。(执行一些可执行文件或脚本)。
-
ctime:
ctime(change time)显示的是文件的权限、拥有者、所属的组、链接数发生改变时的时间。当然当内容改变时也会随之改变,即inode内容发生改变和Block内容发生改变时ctime都会发生变化。
PS:从kernel2.6.29开,还默认集成了一个relatime的属性。可能是因为在文件读操作很频繁的系统中,atime更新所带来的开销很大,所以在挂装文件系统的时候使用noatime属性来停止更新atime。但是有些程序需要根据atime进行一些判断和操作,所以Linux就推出了一个relatime特性。 使用这个特性来挂装文件系统后,只有当mtime比atime更新的时候,才会更新atime。事实上,这个时候atime和mtime已经是同一个东西了。所以这个选项就是为了实现对atime的兼容才推出的。并不是一个新的时间属性。使用方法就是通过mount -o relatime /dir来挂装目录.
3.7 stat命令:查看文件的三个时间属性
stat用法如下:
[root@xuzhichao tmp]# stat /tmp
File: '/tmp'
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fd00h/64768d Inode: 33554504 Links: 16
Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2021-05-11 21:52:33.386227675 +0800 #atime值
Modify: 2021-05-11 21:52:48.553724623 +0800 #mtime值
Change: 2021-05-11 21:52:48.553724623 +0800 #ctime值
Birth: -
[root@xuzhichao tmp]# stat /etc/passwd
File: '/etc/passwd'
Size: 1883 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 33568564 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2021-05-11 21:43:39.607999954 +0800
Modify: 2021-04-28 17:50:33.525833571 +0800
Change: 2021-04-28 17:50:33.529833550 +0800
Birth: -
3.8 touch命令:创建空文件
touch命令用于创建空文件,若文件存在,不会覆盖文件,只会修改文件的三个时间属性为当前时间。
touch选项如下:
选项 | 说明 |
---|---|
-a | 仅修改文件的atime值 |
-m | 仅修改文件的mtime值 |
-c | 如果文件不存在则不创建文件 |
-t | 使用 [[CC]YY]MMDDhhmm[.ss] 格式指定atime和mtime值 |
-d | -a和-m选项仅能修改时间为当前时间,配合-d选项可以修改为其他时间 |
touch的用法如下:
#1.创建文件
[root@xuzhichao tmp]# touch file1
[root@xuzhichao tmp]# stat file1
File: 'file1'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 33554501 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2021-05-11 22:38:30.060549100 +0800
Modify: 2021-05-11 22:38:30.060549100 +0800
Change: 2021-05-11 22:38:30.060549100 +0800
Birth: -
#2.修改文件内容时mtime和ctime都会发生改变
[root@xuzhichao tmp]# echo "sda" > file1
[root@xuzhichao tmp]# stat file1
File: 'file1'
Size: 4 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 33554501 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2021-05-11 22:38:30.060549100 +0800
Modify: 2021-05-11 22:38:47.815379021 +0800
Change: 2021-05-11 22:38:47.815379021 +0800
Birth: -
#3.使用-m可以修改文件的mtime和ctime为当前时间
[root@xuzhichao tmp]# touch -m file1
[root@xuzhichao tmp]# stat file1
File: 'file1'
Size: 4 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 33554501 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2021-05-11 22:38:30.060549100 +0800
Modify: 2021-05-11 22:39:17.392095691 +0800
Change: 2021-05-11 22:39:17.392095691 +0800
Birth: -
#4.使用-m和-d结合使用仅会改变文件的mtime时间。
[root@xuzhichao tmp]# touch -m -d 20210330 file1
[root@xuzhichao tmp]# stat file1
File: 'file1'
Size: 4 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 33554501 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2021-05-11 22:38:30.060549100 +0800
Modify: 2021-03-30 00:00:00.000000000 +0800
Change: 2021-05-11 22:39:42.484847211 +0800
Birth: -
#5.使用-a和-d结合使用仅会改变文件的atime时间。
[root@xuzhichao tmp]# touch -a -d 20210331 file1
[root@xuzhichao tmp]# stat file1
File: 'file1'
Size: 4 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 33554501 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2021-03-31 00:00:00.000000000 +0800
Modify: 2021-03-30 00:00:00.000000000 +0800
Change: 2021-05-11 22:40:15.008515806 +0800
Birth: -
#6.使用-a可以修改文件的atime和ctime为当前时间
[root@xuzhichao tmp]# touch -a file1
[root@xuzhichao tmp]# stat file1
File: 'file1'
Size: 4 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 33554501 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2021-05-11 22:40:25.829405550 +0800
Modify: 2021-03-30 00:00:00.000000000 +0800
Change: 2021-05-11 22:40:25.829405550 +0800
Birth: -
#7.使用-t可以任意修改文件的atime和mtime为指定的时间
[root@xuzhichao tmp]# touch -t 202104201010 file1
[root@xuzhichao tmp]# stat file1
File: 'file1'
Size: 4 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 33554501 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2021-04-20 10:10:00.000000000 +0800
Modify: 2021-04-20 10:10:00.000000000 +0800
Change: 2021-05-11 22:41:18.201871892 +0800
Birth: -
#8.使用-c时,文件不存在就不创建文件
[root@xuzhichao tmp]# touch -c file2
[root@xuzhichao tmp]# ll file2
ls: cannot access file2: No such file or directory
3.9 rmdir命令:删除空目录
rmdir命令仅用于删除空的目录,当目录中存在文件时无法删除。
rmdir用法如下:
#递归创建和删除目录
[root@xuzhichao tmp]# mkdir dir1/dir2/dir3/dir4 -p
[root@xuzhichao tmp]# rmdir dir1/dir2/dir3/dir4 -p
#目录中存在文件时无法删除目录
[root@xuzhichao /]# rmdir /tmp/
rmdir: failed to remove '/tmp/': Device or resource busy
3.10 rm命令:删除文件或目录
rm命令用于删除文件或目录,无论文件或目录是否为空。
rm命令的删除过程是:
- 删除目录下文件的文件名链接数,释放inode号;
- 当没有新文件写入时文件的block并未被删除;
- 当有新文件写入时恰巧使用到该block时就会删除其block,此时才会真正的删除文件内容。
因此删除文件时才有机会找回文件。
rm的选项如下:
选项 | 说明 |
---|---|
-r | 删除目录需要使用该参数 |
-f | 强制删除 |
-i | 删除前提示是否删除文件 |
rm的用法如下:
#删除目录使用-r参数
[root@xuzhichao tmp]# rm -rf dir
#rm别名使用了-i参数,删除前会需要用户确认
[root@xuzhichao tmp]# rm file1
rm: remove regular file 'file1'? y
3.10.1 删除大文件的方法
有些情况下,当一个大文件正在使用时,通过rm删除文件后,磁盘空间并没有得到释放,此时可使用以下两种方法:
- 使用 > bigfile && rm -f bigfile 的方法;
- 使用killall停止正在使用文件的进程,然后再删除该文件;
3.11 rename命令:批量修改文件名称
rename命令可用于批量重命名文件
rename语法如下:
rename [options] expression replacement file...
主要用法如下:
[root@xuzhichao test]# touch file{0..10}.conf
[root@xuzhichao test]# ls
file0.conf file1.conf file10.conf file2.conf file3.conf file4.conf file5.conf file6.conf file7.conf file8.conf file9.conf
#把所有后缀为.conf的文件,批量改名为.conf.bak
[root@xuzhichao test]# rename .conf .conf.bak *.conf
[root@xuzhichao test]# ls
file0.conf.bak file1.conf.bak file10.conf.bak file2.conf.bak file3.conf.bak file4.conf.bak file5.conf.bak file6.conf.bak file7.conf.bak file8.conf.bak file9.conf.bak
#把所有后缀为.bak的文件,批量改名为.conf
[root@xuzhichao test]# rename '.bak' '' *.bak
[root@xuzhichao test]# ls
file0.conf file1.conf file10.conf file2.conf file3.conf file4.conf file5.conf file6.conf file7.conf file8.conf file9.conf
#把file的number都加一个0
[root@xuzhichao test]# rename file file0 file??.conf
[root@xuzhichao test]# ls
file0.conf file010.conf file1.conf file2.conf file3.conf file4.conf file5.conf file6.conf file7.conf file8.conf file9.conf
[root@xuzhichao test]# rename file file0 file?.conf
[root@xuzhichao test]# ls
file00.conf file01.conf file010.conf file02.conf file03.conf file04.conf file05.conf file06.conf file07.conf file08.conf file09.conf
4 inode和链接文件
4.1 文件和目录的inode和block
-
data block:数据块是用于记录文件的实际内容的地方;
-
元数据metadata:用于记录文件的大小,时间,所有者等信息,这些信息存放在inode中,inode主要内容如下:
- 文件字节数
- 文件的UID,GID
- 文件的读写权限
- 文件的时间戳
- 链接数,即有多少文件指向此inode
- 文件data block的位置
-
inode:目录的inode与文件类似,主要用于存放目录的元数据信息,包括时间,权限,属主,目录的data block的位置等。
-
data block:目录的data block主要用于存放该目录下所有文件和目录的名称以及其对应的inode号。
查看文件和目录的inode的方法如下:
#方法一:使用ls -i参数
[root@xuzhichao ~]# ll -i /tmp -d
33554504 drwxrwxrwt. 14 root root 4096 May 12 21:31 /tmp
[root@xuzhichao ~]# ll -i /etc/fstab
33554498 -rw-r--r--. 1 root root 465 Nov 4 2020 /etc/fstab
#方法二:使用stat命令
[root@xuzhichao ~]# stat /etc/fstab
File: '/etc/fstab'
Size: 465 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 33554498 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2021-05-10 17:19:30.401892527 +0800
Modify: 2020-11-04 00:29:44.523009084 +0800
Change: 2020-11-04 00:44:11.887050443 +0800
Birth: -
目录的链接数为该目录下目录的个数+2,每个新的目录链接数都为2,一个是其本身,一个是该目录下的 ”.“ ,在该目录下每创建一个子目录,上级目录的链接数就增加1,因为子目录的下”..“与上级目录的inode号相同。这就是为什么”.“代表当前目录,而”..“代表上级目录的原因了,实际两者相当于硬链接的概念了。
#查看目录的inode号
[root@xuzhichao tmp]# mkdir dir1
[root@xuzhichao tmp]# ll -d dir1 -i
67424894 drwxr-xr-x 2 root root 6 May 12 21:47 dir1
#“.”的inode号和当前目录的inode号一致;“..”的inode号和上级目录一致。
[root@xuzhichao tmp]# ll -i dir1/ -a
total 4
67424894 drwxr-xr-x 2 root root 6 May 12 21:47 .
33554504 drwxrwxrwt. 15 root root 4096 May 12 21:48 ..
[root@xuzhichao tmp]# ll -di /tmp
33554504 drwxrwxrwt. 15 root root 4096 May 12 21:48 /tmp
#每增加一个目录上级目录的链接数加1
[root@xuzhichao tmp]# mkdir dir1/dir2
[root@xuzhichao tmp]# ll -d dir1/
drwxr-xr-x 3 root root 4096 May 12 21:51 dir1/
[root@xuzhichao tmp]# mkdir dir1/dir{a..z}
[root@xuzhichao tmp]# ll -d dir1/
drwxr-xr-x 29 root root 4096 May 12 21:51 dir1/
-
每个inode都有一个号码,类似于我们的身份证号,操作系统用inode号码来识别不同的文件。
Linux系统内部不使用文件名,而使用inode号码来识别文件。文件名只是人们便于识别inode的别称或者绰号。
表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:
- 首先,系统找到这个文件名对应的inode号码;
- 其次,通过inode号码,获取inode信息;
- 最后,根据inode信息,找到文件数据所在的block,读出数据。
文件读取过程示意图:
文件存储结构示意图:
inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。
一个是数据区,存放文件数据;
另一个是inode区(inode table),存放inode所包含的信息。
每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。 查看每个硬盘分区的inode总数和已经使用的数量,可以使用df -i 命令。
[root@xuzhichao tmp]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
devtmpfs 228616 394 228222 1% /dev
tmpfs 232880 1 232879 1% /dev/shm
tmpfs 232880 779 232101 1% /run
tmpfs 232880 16 232864 1% /sys/fs/cgroup
/dev/mapper/centos-root 26214400 138317 26076083 1% /
/dev/sda1 256000 327 255673 1% /boot
tmpfs 232880 1 232879 1% /run/user/0
4.2 硬链接
一般情况下,文件名和inode号码是"一一对应"关系,每个inode号码对应一个文件名。但是,Linux系统允许多个文件名指向同一个inode号码。
这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为"硬链接"(hard link)。
硬链接示意图:
硬链接的源文件与目标文件的inode号码相同,都指向同一个inode。inode信息中有一项叫做"链接数",记录指向该inode的文件名总数,这时就会增加1。反过来,删除一个文件名,就会使得inode节点中的"链接数"减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域。
创建硬链接的方法如下:
ln [OPTION]... [-T] TARGET LINK_NAME
[root@xuzhichao tmp]# touch file1
[root@xuzhichao tmp]# ll file1
-rw-r--r-- 1 root root 0 May 12 22:13 file1
[root@xuzhichao tmp]# ln file1 file1_hardlink
[root@xuzhichao tmp]# ll file1
-rw-r--r-- 2 root root 0 May 12 22:13 file1 #文件的链接数加1
[root@xuzhichao tmp]# ll file1_hardlink
-rw-r--r-- 2 root root 0 May 12 22:13 file1_hardlink
硬链接存在如下特性:
- 原文件和硬链接文件有相同的inode和data block
- 只能对已经存在的文件创建硬链接
- 不能对目录创建硬链接
- 不能跨分区或文件系统创建硬链接
- 删除一个原始文件并不影响硬链接文件
因为硬链接存在上述的诸多限制,因此在实际工作中较少使用。
4.3 软链接
文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的"软链接"(soft link)或者"符号链接(symbolic link)。
这意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:"No such file or directory"。文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode"链接数"不会因此发生变化。
软链接示意图:
软链接的内容为实际文件的文件名,软链接的大小为实际文件文件名的字符数。
软链接用法如下,ln -s:
[root@xuzhichao tmp]# ln -s file1 file1_softlink
[root@xuzhichao tmp]# ll file1*
-rw-r--r-- 2 root root 0 May 12 22:13 file1
-rw-r--r-- 2 root root 0 May 12 22:13 file1_hardlink
lrwxrwxrwx 1 root root 5 May 12 22:50 file1_softlink -> file1 #该软链接大小为5个字节,和真实文件名长度相同。
软链接的主要特点如下:
- 可以跨分区创建软链接;
- 可以对目录或文件创建软链接;
- 创建软链接时,链接数不会增加;
- 删除原文件,则软链接会失效,称为死链接,重新创建原文件,死链接可以恢复为正常的软链接;
- 软链接文件有自己的inode,block,独立的文件权限和属性;
- 可以对不存在的文件或目录创建软链接;
软链接的用途较为广泛,以下为实际使用的两个场景:
- 代码发布
- 软件版本升级
-
#1.网站代码v1.1版本: root@xuzhichao data]# mkdir python-v1.1 [root@xuzhichao data]# echo "v1.1" > python-v1.1/index.html [root@xuzhichao data]# cat python-v1.1/index.html v1.1 #2.创建软链接 [root@xuzhichao data]# ln -s python-v1.1/ python [root@xuzhichao data]# ll /data/ total 0 lrwxrwxrwx 1 root root 12 May 16 16:14 python -> python-v1.1/ drwxr-xr-x 2 root root 24 May 16 16:14 python-v1.1 #3.更新网站代码v1.2 [root@xuzhichao data]# mkdir python-v1.2 [root@xuzhichao data]# echo "v1.2" > python-v1.2/index.html [root@xuzhichao data]# cat python-v1.2/index.html v1.2 #4.升级代码到v1.2 [root@xuzhichao data]# rm -f python && ln -s python-v1.2/ python [root@xuzhichao data]# cat python/index.html v1.2 #5.升级失败回退到v1.1 [root@xuzhichao data]# rm -f python && ln -s python-v1.1/ python [root@xuzhichao data]# cat python/index.html v1.1