一、Linux文件系统结构
文件和目录被组织成一个单根倒置树结构,从根目录下开始,用“/”表示,根文件系统(rootfs):root filesystem路径为分隔的 /。
- /boot:引导文件存放目录,内核文件(vmlinuz)、引导加载器(bootloader, grub)都存放于此目录
- /bin:所有用户使用的基本命令;不能关联至独立分区,OS启动即会用到的程序
- /sbin:管理类的基本命令;不能关联至独立分区,OS启动即会用到的程序
- /lib:启动时程序依赖的基本共享库文件以及内核模块文件(/lib/modules)
- /lib64:专用于x86_64系统上的辅助共享库文件存放位置
- /etc:配置文件目录
- /home/USERNAME:普通用户家目录
- /root:管理员的家目录
- /usr:存放所有命令、库、手册页
- /dev:存放设备文件
- /var:包含经常发生变动的文件,如邮件、日志文件、计划任务等
- /tmp:存放临时文件
- /run:存放自系统启动以来描述系统信息的文件。
二、文件元数据
文件有两类数据:
元数据:metadata
数据:data
元数据包含属性(Mode)、所有者信息(owner info)、大小(Size)、时间戳(Timestamps)。
命令名称:stat
命令所在路径:/bin/stat
执行权限:所有用户
功能描述:显示文件的元数据信息
语法:stat [-c] 文件名
选项:
-c 自定义输出格式
%a 以八进制格式显示文件访问权限
%A 以可读形式显示访问权限
范例1:
显示文件的元数据信息
命令:stat anaconda-ks.cfg
执行结果:
File: ‘anaconda-ks.cfg’
Size: 1419 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 33574992 Links: 1
Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:admin_home_t:s0
Access: 2020-04-06 12:10:57.881048189 +0800
Modify: 2020-04-06 12:10:57.885048189 +0800
Change: 2020-04-06 12:10:57.885048189 +0800
Birth: -
输出解释:
File:文件名
Size:文件大小(单位:B)
Blocks:文件所占扇区个数,为8的倍数(通常的 Linux 的扇区大小为 512 B,连续八个扇区组成一个block)
IO Block:每个数据块的大小(单位:B)
regular file:普通文件(此处显示文件的类型)
Inode:文件的Inode号
Links:硬链接次数
Access:权限
Uid:(属主id/属主名)
Gid:(属组id/属组名)
Access:最近一次访问时间
Modify:内容/数据改动时间
Change:属性改动时间
命令名称:touch
命令所在路径:/bin/touch
执行权限:所有用户
功能描述:创建空文件,刷新时间戳
语法:touch [-a] 文件名
选项:
-a 仅改变 atime和ctime
-m 仅改变mtime和ctime
范例1:
创建一个空文件
命令:touch newfile;stat newfile
执行结果:
File: ‘newfile’
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 33638660 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2020-04-10 14:06:46.891046046 +0800
Modify: 2020-04-10 14:06:46.891046046 +0800
Change: 2020-04-10 14:06:46.891046046 +0800
Birth: -
范例2:
更新文件的时间戳信息
命令:touch newfile;stat newfile
执行结果:
File: ‘newfile’
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 33638660 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2020-04-10 14:06:59.701046720 +0800
Modify: 2020-04-10 14:06:59.701046720 +0800
Change: 2020-04-10 14:06:59.701046720 +0800
Birth: -
对比范例1的执行结果发现时间戳信息已被刷新
三、文件链接
硬链接,并列关系,不同名称且独立,不能跨设备(分区)
软链接,类似Windows的快捷方式,删除对原文件不会产生影响
命令名称:ln
命令所在路径:/bin/ln
执行权限:所有用户
功能描述:创建文件链接
语法:ln [-sf] 原始文件名 链接文件名
选项:
-s 创建一个符号链接
-f 强制,创建链接文件时如已存在则覆盖
范例1:
创建一个硬链接
命令:cd /etc;ln hosts hosts.hard
ls -l hosts
执行结果:
-rw-r--r--. 2 root root 158 6月 7 2013 hosts
从执行结果可以看到创建时原始文件的链接数递增+1
尝试删除原始文件,查看链接文件内容是否依旧存在。
命令:rm -f hosts(删除前通过cp命令进行文件备份)
cat hosts.hard
执行结果:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
从上述执行结果可以看到原始文件即使被删除,硬链接文件不会受到影响。
范例2:
创建一个软链接
命令:cd /root;ln -s newfile newfile.link
ls -l newfile.link;ls -l newfile
执行结果:
lrwxrwxrwx. 1 root root 7 4月 10 14:27 newfile.link -> newfile
-rw-r--r--. 1 root root 0 4月 10 14:30 newfile
从执行结果可以看到为newfile创建软链接文件newfile.link,链接数不会递增。
尝试删除原始文件,查看链接文件内容是否依旧存在。
命令:rm -f newfile
cat newfile.link
执行结果:
cat: newfile.link: 没有那个文件或目录
从上述执行结果可以看到原始文件被删除,软链接文件将会受到影响。
通过实验操作,得出硬链接和软链接区别如下:
1.本质:硬链接同一个多个名字,软链接不同文件
2.跨分区,硬链接不支持跨设备
3.目录,硬链接不支持对目录创建
4.相互关系,硬链接为平等关系,软链接有依赖关系
5.inode号
6.链接数,软链接不会增长链接数
7.路径,软链接原始文件路径相当于链接文件,硬链接相对于当前目录
8.文件类型,软链接为l,硬链接同原始文件
四、文件管理常见命令
1.pwd
命令所在路径:/bin/pwd
执行权限:所有用户
功能描述:显示当前的工作目录
范例1:
显示当前所在的工作目录
命令:pwd
执行结果:
/root
2.cd
命令所在路径:/bin/cd
执行权限:所有用户
功能描述:切换目录
范例1:
切换到指定的目录
命令:cd /etc
范例2:
切换到上一次目录
命令:cd -
范例3:
切换到上级目录
命令:cd ..
3.mkdir
命令所在路径:/bin/mkdir
执行权限:所有用户
功能描述:创建文件夹
语法:mkdir [-pv] 文件夹名
选项:
-p 多级文件夹
-v 显示详细的输出
范例1:
创建一个指定名称的文件夹
命令:mkdir newdir
范例2:
创建多级目录
命令:mkdir -p dir1/dir2
范例3:
创建目录并显示详细的过程
命令:mkdir -pv dir3/dir4/dir5
执行结果:
mkdir: created directory ‘dir3’
mkdir: created directory ‘dir3/dir4’
4.rm
命令所在路径:/bin/rm
执行权限:所有用户
功能描述:删除文件/文件夹
语法:rm [-rf] 文件/文件夹
选项:
-r 删除文件夹
-f 强制执行
范例1:
删除一个指定名称的文件
命令:rm newfile
rm: remove regular empty file ‘newfile’? y
范例2:
删除一个指定名称的文件夹
命令:rm -r dir3
rm: descend into directory ‘dir3’? y
rm: remove directory ‘dir3/dir4’? y
范例3:
强制删除一个指定名称的文件
命令:rm -f newfile.link
5.rmdir
命令所在路径:/bin/rmdir
执行权限:所有用户
功能描述:删除空文件夹
语法:rmdir 文件夹
选项:
-p 递归删除文件夹
范例1:
删除一个空文件夹
命令:rmdir dir1
6.ls
命令所在路径:/bin/ls
执行权限:所有用户
功能描述:列出文件的信息
语法:ls [-alh] [-Rt] 文件/文件夹
选项:
-a 显示所有文件,包含隐藏文件
-l 以长格式显示文件详细信息
-h 以方便查看的形式显示文件大小
-R 递归显示
-t 以最新的内容修改时间作为条件倒序显示
范例1:
查看指定文件的详细信息
命令:ls -l anaconda-ks.cfg
执行结果:
-(文件类型,普通文件)rw-------(权限). 1(引用次数) root(所有者) root(所属组) 1419(文件大小,单位Bytes) Apr 6 12:10(默认日期时间) anaconda-ks.cfg(文件名)
范例2:
递归显示/etc目录下的文件/文件夹
命令:ls -R /etc
执行结果:
/etc:
adjtime
aliases
aliases.db
alternatives
anacrontab
asound.conf
audisp
audit
bash_completion.d
bashrc
……
7.file
命令所在路径:/bin/file
执行权限:所有用户
功能描述:显示文件的类型
语法:file [-bL] 文件名称
选项:
-b 列出文件辨识结果时,不显示文件名称
-L 查看指定软链接对应文件的文件类型
范例1:
查看指定文件的类型
命令:file anaconda-ks.cfg
执行结果:
anaconda-ks.cfg: ASCII text
8.cp
命令所在路径:/bin/cp
执行权限:所有用户
功能描述:拷贝文件/文件夹
语法:cp [-rpa] 源文件/文件夹 目标文件/文件夹
选项:
-r 拷贝目录
-a 归档,相当于-dR --preserv=all
-p 等同于 --preserve=mode,ownership,timestamps
范例1:
将一个文件拷贝到指定目录下
命令:cp /etc/profile /tmp
范例2:
将一个文件夹拷贝到指定目录下
命令:cp -r /etc/ /tmp
9.mv
命令所在路径:/bin/mv
执行权限:所有用户
功能描述:移动文件/文件夹位置或重命名
语法:mv [-b] 源文件/文件夹 目标位置或新名称
选项:
-b 目标存在,覆盖前先备份,形式为filename ~
范例1:
将一个文件移动到指定目录下
命令:mv newfile /opt
范例2:
重命名一个文件
命令:mv newfile1 newfile2
五、vi/vim文本编辑器
三种工作模式:
- 命令(Normal)模式:默认模式,移动光标,剪切/粘贴文本
- 插入(Insert)或编辑模式:修改文本
- 扩展命令(extended command )模式:保存,退出等
命令名称:vi
命令所在路径:/bin/vi
执行权限:所有用户
功能描述:编辑文件内容
语法:vi [-br] 文件名
选项:
-b 二进制方式打开文件
-r 恢复之前记录的会话
查找并替换功能
格式:s/要查找的内容/替换为的内容/修饰符
修饰符:
i 忽略大小写
g 全局替换,默认情况下,每一行只替换第一次出现
gc 全局替换,每次替换前询问
范例1:
查找替换删除/tmp/profile文件中行首的空白字符
命令:vi /tmp/profile
%s/^[[:space:]]\+//
33 substitutions on 33 lines
输入:wq 保存退出
范例2:
vim中设置TAB缩进4个字符
命令:vi .vimrc
set ts=4
输入:wq 保存退出