Linux文件系统管理
1 Linux系统目录命名规则与用途
1.1 文件系统目录结构
-
文件和目录被组织成一个单根倒置树结构
-
文件系统从根目录下开始,用“/”表示
- 标准Linux文件系统(如:ext4),文件名称大小写敏感。
- 以.开头的文件为隐藏文件
- 路径分隔的 /
- 文件名最长255个字节
- 包括路径在内文件名称最长4095个字节
- 蓝色-->目录 绿色-->可执行文件 红色-->压缩文件 浅蓝色-->链接文件 灰色-->其他文件
- 除了斜杆和NUL,所有字符都有效,有些字符需要用引号来引用
- 每个文件都有两类相关数据:元数据:metadata,即属性;数据:data,即文件内容
1.2 常见文件系统目录功能
/boot:引导文件存放目录,内核文件(vmlinuz)、引导加载器(bootloader,grub)都存放于此目录
/bin:所有用户使用的基本命令,不能关联至独立分区,OS启动即会用到的程序
/sbin:管理类的基本命令,不能关联至独立分区,OS启动即会用到的程序
/lib:启动时程序依赖的基本共享库文件已经内核模块文件(/lib/modules)
/lib64:专用于X86_64系统上的辅助共享文件存放文件
/etc:配置文件目录
/home/USERNAME:普通用户Home目录
/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 Linux下的文件类型
- — 普通文件
- d 目录文件directory
- c 字符设备character
- b 块设备block
- l 符号链接文件link
- p 管道文件pipe
- s 套接字文件socket
1.4 Centos 7 以后版本目录结构变化
- /bin和/usr/bin
- /sbin和/usr/sbin
- /lib和/usr/lib
- /lib64和/usr/lib64
[root@Centos7 ~]# ls /bin /sbin /lib /lib64 -ld
lrwxrwxrwx. 1 root root 7 Feb 1 23:28 /bin -> usr/bin
lrwxrwxrwx. 1 root root 7 Feb 1 23:28 /lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Feb 1 23:28 /lib64 -> usr/lib64
lrwxrwxrwx. 1 root root 8 Feb 1 23:28 /sbin -> usr/sbin
2 文件元数据和节点表结构
2.1 inode表结构
每个文件的属性信息,比如:文件的大小,时间,类型等,称为文件的元数据(meta data)。这些元数据是存放在node表中。node表中有很多条记录组成,第一条记录对应的存放了一个文件的元数据信息。
第一个node表记录对应的保存以下信息:
- inode number 节点号
- 文件类型
- 权限
- UID
- GID
- 链接数 (指向这个文件名路径名称个数)
- 该文件的大小和不同的时间戳
- 有关文件的其他数据
2.2 查看元数据信息
stat查看文件或目录属性信息
[root@Centos7 data]# stat meta.data
File: ‘meta.data’
Size: 710 Blocks: 8 IO Block: 4096 regular file
Device: 805h/2053d Inode: 67 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:etc_runtime_t:s0
Access: 2021-02-03 22:42:14.892841636 +0800
Modify: 2021-02-03 22:47:17.496608628 +0800
Change: 2021-02-03 22:47:17.496608628 +0800
Birth: -
文件名称(File):文件的名称
文件大小(Size):文件的大小
块数量(Blocks):文件所占块的数量
块的大小(IO Block):每个数据块的大小
文件类型(regular file):表示是什么类型的文件
设备(Device):所在设备
Inode:文件的节点编号
硬链接次数(Links):被硬链接了多少次
权限(access):文件具有的权限
属主(Uid):属主ID号
属组(Gid):属组ID号
访问时间(Access):最后一次访问文件的时间 atime
修改时间(Modify):最后一次文件数据修改时间 mtime
元数据修改时间(Change):最后一次文件元数据修改时间 ctime
2.3 修改文件时间戳
touch命令可以用来创建空文件或刷新文件的时间(修改时间戳)
[root@Centos7 data]# touch --help
Usage: touch [OPTION]... FILE...
Mandatory arguments to long options are mandatory for short options too.
-a change only the access time
-c, --no-create do not create any files
-m change only the modification time
-t STAMP use [[CC]YY]MMDDhhmm[.ss] instead of current time
--time=WORD change the specified time:
-a: 只修改访问文件的时间 atime
-m:只修改文件数据修改的时间 mtime
-t:使用指定的时间,格式为 [[CC]YY]MMDDhhmm[.ss]
CC:世纪 YY:年份 MM:月份 DD:日期 hh:小时 mm:分钟 ss:秒
3 硬链接和软链接区别
3.1 硬链接的特征
- 文件有相同的inode及data block
[root@Centos7 data]# ln link1.txt link1.txt.link
[root@Centos7 data]# ls -li
total 4
68 -rw-r--r--. 2 root root 0 Feb 3 23:27 link1.txt
68 -rw-r--r--. 2 root root 0 Feb 3 23:27 link1.txt.link #两个文件的inode号一样都是68
[root@Centos7 data]# echo 1234556789abc > link1.txt
[root@Centos7 data]# cat link1.txt link1.txt.link #两者数据一样
1234556789abc
1234556789abc
- 只能对已存在的文件进行创建
[root@Centos7 data]# ls
link1.txt link1.txt.link link2.txt link3.txt link4.txt link5.txt meta.data
[root@Centos7 data]# ln link.txt link.txt.link
ln: failed to access ‘link.txt’: No such file or directory
- 不能跨分区创建硬链接
[root@Centos7 ~]# ls
anaconda-ks.cfg
[root@Centos7 ~]# ln anaconda-ks.cfg /data/anaconda-ks.cfg.link
ln: failed to create hard link ‘/data/anaconda-ks.cfg.link’ => ‘anaconda-ks.cfg’: Invalid cross-device link
- 不能对目录进行创建,只能对文件创建
[root@Centos7 data]# ls
link1.txt link2.txt link4.txt meta.data
link1.txt.link link3.txt link5.txt testlink
[root@Centos7 data]# ln testlink testlink.link
ln: ‘testlink’: hard link not allowed for directory
[root@Centos7 data]#
- 删除一个硬链接文件并不影响其他有相同的inode编号的文件
[root@Centos7 data]# cat link1.txt link1.txt.link
1234556789abc
1234556789abc
[root@Centos7 data]# ll -i link1.txt link1.txt.link
68 -rw-r--r--. 2 root root 14 Feb 3 23:31 link1.txt
68 -rw-r--r--. 2 root root 14 Feb 3 23:31 link1.txt.link
[root@Centos7 data]# rm -f link1.txt.link
[root@Centos7 data]# ls -li link1.txt
68 -rw-r--r--. 1 root root 14 Feb 3 23:31 link1.txt
[root@Centos7 data]# cat link1.txt
1234556789abc
3.2 软链接的主要特点
- 软链接有自己的文件属性及权限等
[root@Centos7 data]# ll
total 4
drwxr-xr-x. 2 root root 6 Feb 4 21:38 linkdir
lrwxrwxrwx. 1 root root 7 Feb 4 21:51 linkdir.link -> linkdir #软链接和原文件属性及权限独立
- 可对不存在的文件或目录创建软链接
[root@Centos7 data]# ls
link1.txt link2.txt link3.txt link4.txt link5.txt linkdir meta.data
[root@Centos7 data]# ln -s text.log text.log.link
[root@Centos7 data]# ll text.log.link #软链接原文件不存在称为死链接,显示为红色闪烁
lrwxrwxrwx. 1 root root 8 Feb 4 21:44 text.log.link -> text.log
- 软链接可跨分区创建
[root@Centos7 ~]# ls
anaconda-ks.cfg
[root@Centos7 ~]# ln -s anaconda-ks.cfg /data/anaconda-ks.cfg.link
[root@Centos7 ~]# ll /data/anaconda-ks.cfg.link
lrwxrwxrwx. 1 root root 15 Feb 4 21:57 /data/anaconda-ks.cfg.link -> anaconda-ks.cfg
- 软链接可对文件或目录创建
[root@Centos7 data]# ls
link1.txt link3.txt link5.txt meta.data
link2.txt link4.txt linkdir text.log.link
[root@Centos7 data]# ln -s linkdir linkdir.link
[root@Centos7 data]# ll linkdir.link
lrwxrwxrwx. 1 root root 7 Feb 4 21:51 linkdir.link -> linkdir #软链接指向原目录
- 创建软链接时,链接计数不会增加
[root@Centos7 ~]# ll
total 4
-rw-------. 1 root root 1568 Feb 1 23:32 anaconda-ks.cfg
[root@Centos7 ~]# ln -s ../root/anaconda-ks.cfg /data/linkdir.link
[root@Centos7 ~]# ll -di anaconda-ks.cfg
201326658 -rw-------. 1 root root 1568 Feb 1 23:32 anaconda-ks.cfg
- 删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接,若被指向路径文件被重新创建,死链接可恢复为正常的软链接
4 Linux文件管理常用命令
4.1 显示当前工作目录
每个shell和系统进程都有一个当前的工作目录CWD:current work directory
显示当前shell的绝对路径
pwd命令:printing working directory
- -P 显示真实物理路径
- -L 显示链接路径(默认)
[root@Centos7 data]# pwd
/data
[root@Centos7 data]# cd /bin
[root@Centos7 bin]# pwd
/bin
[root@Centos7 bin]# pwd -P
/usr/bin
[root@Centos7 bin]#
4.2 绝对路径和相对路径
-
绝对路径
以正斜杠?即根目录开始
完整的文件的位置路径
可用于任何指定一个文件名的时候
-
相对路径
不以斜杠开始
一般情况下,是指相对于当前工作目录的路径,特殊场景下,是相对于某目录的位置
可以作为一个简短的形式指定一个文件名
基名:basename,只取文件名而不要路径
目录名:dirname,只取路径,不要文件名
[root@Centos7 network-scripts]# basename /etc/sysconfig/network-scripts
network-scripts
[root@Centos7 network-scripts]# dirname /etc/sysconfig/network-scripts
/etc/sysconfig
4.3 更改目录
命令cd:change directory 改变目录
选项 :-P 切换到物理路径,而非软链接目录
可以使用绝对或相对路径
- 切换至父目录: cd..
- 切换至当前用户主目录:cd
- 切换至上一次工作目录:cd -
[root@Centos7 network-scripts]# cd /etc/sysconfig
[root@Centos7 sysconfig]# pwd
/etc/sysconfig
[root@Centos7 sysconfig]# cd ../../data
[root@Centos7 data]# pwd
/data
[root@Centos7 data]# cd /bin
[root@Centos7 bin]# pwd
/bin
[root@Centos7 bin]# cd -P /bin
[root@Centos7 bin]# pwd
/usr/bin
相关环境变量:
- PWD:当前目录路径
- OLDPWD:上一次目录路径
[root@Centos7 bin]# cd /data/
[root@Centos7 data]# echo $OLDPWD
/bin
[root@Centos7 data]# cd -
/bin
[root@Centos7 bin]# pwd
/bin
4.4 列出目录内容
ls命令列出当前目录或指定目录的内容
用法:
ls [options] [file_or_dir]
常用选项:
-a,-all:显示隐藏文件;
-d:仅显示目录名,而不显示目录下的内容列表,显示符号链接文件本身,而不显示其指向的目录列表;
-C:多列显示输出结果,默认选项;
-l:以长格式显示目录下的内容列表,输入从左到右依次包括文件名,文件类型,权限模式,硬链接数,所有者、组、文件大小和文件最后修改时间等;
-t:用于文件和目录的更改时间mtime排序;
-u:配合-t选项,显示并按atime从新到旧排序
[root@Centos7 data]# ls -a
. .. linkdir linkdir.link meta.data
[root@Centos7 data]# ls -lt
total 4
drwxr-xr-x. 2 root root 6 Feb 4 22:21 linkdir
lrwxrwxrwx. 1 root root 7 Feb 4 21:51 linkdir.link -> linkdir
-rw-r--r--. 1 root root 710 Feb 3 22:47 meta.data
4.5 查看文件状态 stat
文件相关信息: metadata,data
每个文件有三个时间戳:
- access time 访问时间,atime,读取文件内容
- modify time 修改时间,mtime,改变文件内容(数据)
- change time 改变时间,ctime,元数据发生改变
root@Centos7 data]# stat meta.data
File: ‘meta.data’
Size: 710 Blocks: 8 IO Block: 4096 regular file
Device: 805h/2053d Inode: 67 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:etc_runtime_t:s0
Access: 2021-02-03 22:42:14.892841636 +0800
Modify: 2021-02-03 22:47:17.496608628 +0800
Change: 2021-02-03 22:47:17.496608628 +0800
Birth: -
4.6 复制文件和目录
利用 cp 命令可以实现文件或目录的复制
格式:
cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...
常用选项
- -i 如果目标已存在,覆盖前提示是否覆盖
- -n 不覆盖,注意顺序
- -r,-R 递归复制目录及内部所有内容
- -a 归档,常用于备份功能
- -d 不复制原文件,只复制链接名
- -b 目标存在,覆盖前先备份,默认形式 filename~,只保留最近的一个备份
[root@Centos7 data]# cp /etc/sysconfig/ /data/
cp: omitting directory ‘/etc/sysconfig/’
[root@Centos7 data]# cp -r /etc/sysconfig/ /data/
[root@Centos7 data]# ll /data/
total 12
-rw-r--r--. 1 root root 23 Feb 4 23:24 issue.bak
drwxr-xr-x. 2 root root 6 Feb 4 22:21 linkdir
lrwxrwxrwx. 1 root root 7 Feb 4 21:51 linkdir.link -> linkdir
-rw-r--r--. 1 root root 710 Feb 3 22:47 meta.data
drwxr-xr-x. 6 root root 4096 Feb 4 23:28 sysconfig
[root@Centos7 data]# ll /data/
total 12
-rw-r--r--. 1 root root 0 Feb 4 23:29 issue
-rw-r--r--. 1 root root 23 Feb 4 23:24 issue.bak
drwxr-xr-x. 2 root root 6 Feb 4 22:21 linkdir
lrwxrwxrwx. 1 root root 7 Feb 4 21:51 linkdir.link -> linkdir
-rw-r--r--. 1 root root 710 Feb 3 22:47 meta.data
drwxr-xr-x. 6 root root 4096 Feb 4 23:28 sysconfig
[root@Centos7 data]# cp -b /etc/motd /data/issue
cp: overwrite ‘/data/issue’? y
[root@Centos7 data]# ll
total 12
-rw-r--r--. 1 root root 0 Feb 4 23:31 issue
-rw-r--r--. 1 root root 0 Feb 4 23:29 issue~
-rw-r--r--. 1 root root 23 Feb 4 23:24 issue.bak
drwxr-xr-x. 2 root root 6 Feb 4 22:21 linkdir
lrwxrwxrwx. 1 root root 7 Feb 4 21:51 linkdir.link -> linkdir
-rw-r--r--. 1 root root 710 Feb 3 22:47 meta.data
drwxr-xr-x. 6 root root 4096 Feb 4 23:28 sysconfig
4.7 移动和重命名文件 mv
mv命令可以实现文件或目录的移动和改名
用法:
mv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY
mv [OPTION]... -t DIRECTORY SOURCE...
常用选项:
- -i 交互式
- -f 强制
- -b 目标存在,覆盖前先备份
利用rename 可以批量修改文件名
[root@Centos7 data]# mv /etc/motd /data/issue
mv: overwrite ‘/data/issue’? y
#为所有的conf文件加上.bak后缀
rename 'conf' 'conf.bank' f*
#去掉所有的bak后缀
rename '.bak' '' *.bak
4.8 删除文件 rm
使用 rm 命令可以删除文件
格式:
rm [option]... file...
常用选项:
- -i 交互式
- -f 强制删除
- -r 递归删除
- --no-preserve-root 删除 /
[root@Centos7 data]# tree
.
├── Aa
│ ├── Bb
│ └── Cc
├── issue
├── issue~
├── issue.bak
├── linkdir
├── linkdir.link -> linkdir
├── meta.data
└── sysconfig
[root@Centos7 data]# rm -rf Aa
[root@Centos7 data]# tree
.
├── issue
├── issue~
├── issue.bak
删除特殊文件
[root@Centos7 data]# ls
~
[root@Centos7 data]# rm -f ~
rm: cannot remove ‘/root’: Is a directory
[root@Centos7 data]# rm -- ~
rm: cannot remove ‘/root’: Is a directory
[root@Centos7 data]# rm -f ./~
[root@Centos7 data]# ls
4.9 查看目录
tree可以显示目录树
选项:
- -d 只显示目录
- -L level 指定显示的层级数
- -P pattern 只显示由指定pattern匹配到的路径
root@Centos7 data]# tree -d
.
└── AA
└── BB
└── CC
3 directories
[root@Centos7 data]# tree
.
└── AA
└── BB
└── CC
├── f1
├── f2
└── f3
3 directories, 3 files
[root@Centos7 data]# tree -d -L 2
.
└── AA
└── BB
2 directories
4.10 创建目录 mkdir
常见选项:
- -p: 存在于不报错,且可自动创建所需的各目录
- -v: 显示详细信息
- -m MODE: 创建目录时指定权限
[root@Centos7 data]# mkdir -pv a1/a2/a3/a4
mkdir: created directory ‘a1’
mkdir: created directory ‘a1/a2’
mkdir: created directory ‘a1/a2/a3’
mkdir: created directory ‘a1/a2/a3/a4’
[root@Centos7 data]# ls
a1
[root@Centos7 data]# tree
.
└── a1
└── a2
└── a3
└── a4
4 directories, 0 file
4.11 删除空目录 rmdir
常见选项
- -p 递归删除父空目录
- -v 显示详细信息
[root@Centos7 data]# rmdir -pv a1/a2/a3/a4
rmdir: removing directory, ‘a1/a2/a3/a4’
rmdir: removing directory, ‘a1/a2/a3’
rmdir: removing directory, ‘a1/a2’
rmdir: removing directory, ‘a1’
[root@Centos7 data]# ls
4.12 复制/etc/profile至 /tmp/目录,用查找替换命令删除/tmp/profie文件中的行首空白字符
cp /etc/profile /tmp #复制/etc/profile到/tmp目录
vim /tmp/profile #用 vim 打开/tmp/proflie文件
:%s/^\s*//g #扩展模式下
4.13 在 vim 中设置 tab 缩进 4个字符
vim /etc/vimrc #vim打开全局变量/etc/vimrc文件,也可以修改用户家目录下的.vimrc文件 ~/.vimrc
set tabstop=4 #加入此字段
来源:oschina
链接:https://my.oschina.net/u/4372568/blog/4947951