Linux文件管理

1 文件管理概述

1.1 Bash Shell对文件进行管理

谈到Linux文件管理,首先我们需要了解的就是,我们要对文件做些什么事情?
其实无非就是对一个文件进行、创建、复制、移动、查看、编辑、压缩、查找、删除、等等
例如 : 当我们想修改系统的主机名称,是否应该知道文件在哪,才能去做对应的修改?


1.2 内容摘要

系统目录结构
文件路径定位
文件管理命令
文件类型file
链接文件ln
文件编辑vim


2 系统目录结构

几乎所有的计算机操作系统都是使用目录结构组织文件。具体来说就是在一个目录中存放子目录和文件, 而在子目录中又会进一步存放子目录和文件,以此类推形成一个树状的文件结构,由于其结构很像一棵树的分支, 所以该结构又被称为“目录树”。
Windows: 以多根的方式组织文件 C: D:
Linux:以单根的方式组织文件 /表示根路径

如下图为Centos7的目录结构

2.1 存放命令相关的目录

/bin, 普通用户使用的命令 /bin/ls, /bin/date , 只要看到bin路径,就应该意识到放的是可执行文件
/sbin,管理员使用的命令 /sbin/service, /sbin/poweroff,  /sbin/useradd…

都是/usr下的文件夹软链接到根路径


2.2 存放用户相关数据的家目录,比如:windows不同的用户登陆系统显示的桌面背景不一样

/home,普通用户的家目录, 默认为/home/username

环境变量的东西不要删,删掉试一下

/root,超级管理员root的家目录, 普通用户无权操作

root用户可以删除普通用户家里的文件,包括环境变量,删除后,普通用户回家就有影响

root用户如果删除了自己家里的环境变量(里面包含了配置文件),只有用快照恢复


2.3 系统文件目录

/usr,相当于C:Windows文件夹
/usr/local,软件安装的目录,相当于C:Program,放的内置的软件; 新装的软件自己mkdir建文件夹存放
/usr/bin/,普通用户使用的应用程序(重要)
/usr/sbin,管理员使用的应用程序 (重要)
/usr/lib,库文件Glibc 32bit  
/usr/lib64,库文件Glibc 64bit, 里面存放的很多.so文件,应用程序(命令)依赖的库;相当于windows中 .dll文件, windows用C语言写的,叫动态链接库
# /bin, /sbin, /lib, /lib64都以软链接的形式链接到/usr/目录下

# 1 df -h 查看系统中文件的使用情况,即磁盘占用情况
# 应用于自动化运维的资产管理cmdb,平台做资产收集,就需要远程连接到每台服务器中执行这条命令,把数据拿回来。
# 方案一:搭个web框架,浏览器访问点击查看,执行代码,远程shh连接到各台机器上执行命令把结果返回。 
# 方案二:在每台机器上装一个agent客户端,写一个python脚本,定时的执行命令拿到数据,用requests模块朝服务器发回数据
Size 分割区总容量
Used 已使用的大小
Avail 剩下的大小
Use% 使用的百分比
Mounted on 路径地址

# 2 du -sh *      查看所有目录下各个文件及目录占用空间大小
    du -sh /usr/  查看当前目录下各个文件及目录占用空间大小
    
# 3 标准是实现自动化的基础
不通主机的相同的软件,都放在相同路径下,便于管理,实现自动化
现在一般安装的软件,不放在/usr/local下了

# 4 总共有一千来个命令
ls /usr/bin/ | wc -l
ls /usr/sbin/ | wc -l

# 5 查看命令依赖那些库文件
ldd /bin/ls

2.4 启动目录

/boot 存放的系统启动相关的文件,例如:kernel,grub(引导装载程序)

ls /boot
# linux内核
# 启动机器时可以选择的启动模式

2.5 配置文件目录

/etc,极其重要,后续所有服务的配置都在这个目录中
/etc/sysconfig/network-script/ifcfg-,网络配置文件,mac网络配置时要到这里查网关
/etc/hostname,系统主机名配置文件,主机名很重要,有些特殊服务要依赖主机名,没有主机名会报错起不来;修改了要重启:reboot
/etc/resolv.conf,dns客户端配置文件,域名解析服务器,一般我们不配置,因为网卡的配置好了,会覆盖掉它,网卡的优先级高
/etc/hosts,本地域名解析配置文件(域名与ip对应关系),域名解析,先找自己的hosts,再去域名解析

# 1 
/etc/hosts 对应windows C:windows/system32/drivers/etc/hosts
应用1:早期黑客钓鱼网站,修改你本地hosts,解析网址到它的钓鱼网址ip,盗取账户密码
应用2:破解收费软件,比如pycharm1个月试用期,到期需要远程连接服务器验证,hosts改成127.0.0.1,请求就发不到官方,没有去验证
# 2 测试修改
yum install httpd -y
systemctl stop firewalld
echo "lqz NB" >/var/www/html/index.html
systemctl start httpd

2.6 可变的目录与临时目录

/var,存放一些变化文件,比如/var/log/下的日志文件,登陆日志
/var/tmp,进程产生的临时文件
/tmp,系统临时目录(类似于公共厕所),谁都可以使用

# 1 查看登陆日志
cat /var/log/secure  # 查看哪个用户在什么时间登录到服务器
# 2 进程产生的临时文件(360清理垃圾,就是会清理)

2.7.设备目录文件

/dev,存放设备文件,比如硬盘,硬盘分区,光驱,等等
/dev/sd 硬盘设备
/dev/null,黑洞设备,只进不出。类似于垃圾回收站
/dev/random,生成随机数的设备
/dev/zero,能源源不断的产生数据,类似于取款机,随时随地取钱

# 1 sda sdb sdc sda1 sdb4
linux中磁盘文件叫sd,第一个硬盘叫a,第二个叫b,sda1表示第一个磁盘的第一个分区,sdb4:第二个硬盘的第四个分区(服务可以插很多硬盘)
# 2 /dev/null   
echo "lqz">>/dev/null  打印日志等,放入黑洞就回收了
# 3 /dev/random 生成随机数
echo $RANDOM
echo lqz_$RANDOM
批量创建随机用户,批量设置密码
# 4 源源不断取数据
dd if=/dev/zero of=/opt/test.txt bs=1M count=1024
'''
dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。
if=文件名:输入文件名,缺省为标准输入。即指定源文件。< if=input file >
of=文件名:输出文件名,缺省为标准输出。即指定目的文件。< of=output file >
bs=bytes:同时设置读入/输出的块大小为bytes个字节。
count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。
'''

ll /opt/test.txt
ll -h /opt/test.txt

2.8 虚拟的文件系统(如对应的进程停止则/proc下对应目录则会被删除)

/proc,反映系统当前进程的实时状态 :process

假设跑着一个uwsgi--->对应一个id号(进程号),如果进程被关闭,id号对应的文件夹就没了;
id号每次启动都不唯一,只有一个进程唯一,systemd 是进程号1的进程,所有进程都是基于它派生出来的


2.9 其他

#1 media:提供设备的挂载点,媒体文件
# linux 新增了盘符,需要手动挂载,windows新增了盘符直接双击就能进
# 把光盘里的数据,挂载到media目录,cd到这个目录才能看到里边的文件
mount  /dev/cdrom /media/

# 2 mnt:提供设备的挂载点(同上)

# 3 opt:第三方工具,第三方软件默认安装的(mysql...)

# run :目录下有pid,log结尾的文件
ls /run
cat sshd.pid  # 进程运行的pid号,放在文件中
ps aux |grep sshd

# .lock文件的作用,锁机制
# 假设现在执行
yum install tree
# 再开一个窗口执行相同命令
yum install tree
# 前面一个如果阻塞在那里,因为锁机制,后面无法执行,出现下述的情况
'''
Another app is currently holding the yum lock; waiting for it to exit...
  The other application is: yum
    Memory :  71 M RSS (470 MB VSZ)
    Started: Tue Aug 18 00:26:31 2020 - 00:24 ago
    State  : Sleeping, pid: 6191
'''
cat /run/yum.pid  # 通过查看yum.pid进程号,把阻塞的进程关闭掉就可以了

 

3 文件路径定位

在我们开始操作文件前,首先需要对文件进行定位,比如:
你要在哪创建什么文件? 你要将文件复制到什么地方? 或者你要删除的文件在什么地方?
那什么是定位: 比如/etc/hostname,整个文件中包含文件名称以及文件所在的位置,我们将这个叫做路径,那么路径就是对文件进行定位的一种方式。

3.1 每个目录下都有一个.和..的目录是干啥的?

一个点代表当的是当前目录, 两个点代表的是当前目录的上层目录。
假设当前目录在/usr/下, 那么它的上层(/)目录用../表示, 而/usr/的下层(local)目录则用./local表示。

3.2 那什么是绝对路径,什么又是相对路径呢?

绝对路径: 只要从/开始的路径,比如/home/alice/file
相对路径: 相对于当前目录来说,比如 a.txt ./a.txt ../bob/a.mp3 [假如: 此时在目录/home/alice]
小结: 所谓的(.)和(..)目录实际上属于相对路径的一种表示形式。

3.3 绝对路径与相对路径示例

#绝对路径
[root@bgx /]# useradd alice
[root@bgx /]# touch /home/alice/file1
[root@bgx /]# touch ~/file2
[root@bgx /]# touch ~alice/file3

#相对路径
[root@bgx /]# mkdir abc
[root@bgx /]# touch ../file3
[root@bgx /]# touch file4
[root@bgx /]# touch abc/file5

# 注意:带斜杠和不带斜杠,特别注意在cp拷贝时,拷贝错了文件夹
cd /usr # 根路径下的usr
cd usr  # 当前路径下的usr

# 执行当前路径下的某个文件
linux下:  ./pycharm64.exe
windows下,cmd通过命令执行文件,直接文件名: pycharm64.exe

# cd改变目录,常见的使用方法
# cd 绝对路径 cd /etc/hostname
# cd 相对路径 cd test/abc cd . cd ..
# cd      #切换目录,例: cd /etc
# cd -    #切换回上一次所在的目录
# cd ~    #切换回当前用户的家目录,注意:root和普通用户是否有所不同吗?
# cd .    #代表当前目录,一般在拷贝、移动等情况下使用 cp /etc/hostname ./
# cd ..   #切换回当前目录的上级目录

  

 

4 系统文件管理

4.1 文件管理之: 创建/复制/移动/删除

# 文件创建命令touch

文件创建命令,可以touch文件夹,但是不会创建文件夹
# touch file                    #无则创建,有则修改时间
# touch file2 file3
# touch /home/od/file4 file5
# touch file{a,b,c}             #{}集合,等价 touch filea felib filec
# touch file{1..10}             #从1到10,创建 file1--->file10   
# touch file{a..z}              #从a到z,创建fiela--->filez

# 目录创建命令mkdir

# 目录创建命令mkdir  选项:-v 显示详细信息(创建同时打印出来)  -p 递归创建目录
# mkdir dir1                             # 在当前路径下创建dir1文件夹(相对路径)
# mkdir /home/od/dir1 /home/od/dir2      # 创建两个目录
# mkdir -v /home/od/{dir3,dir4}          # 如果没有od目录,创建不出来,因为没有递归创建,dir3和dir4是同级目录
# mkdir -pv /home/od/dir5/dir6           # 从home下递归创建od-->dir5-->dir6
# mkdir -pv /home/{od/{diu,but},boy}

# 删除目录和文件rm

#选项:-r: 递归(删除目录需要递归,因为目录下有文件) -f: 强制删除 -v: 详细过程(删除成功并打印)
# rm  file.txt      #删除文件, 默认rm存在alias别名,rm -i所以会提醒是否删除文件
# rm -f file.txt    #强制删除文件, 不提醒

# rm -r dir/        #递归删除目录,会提示
# rm -rf dir/       #强制删除目录,不提醒(慎用)


# rm删除示例
mkdir /home/dir10
touch /home/dir10/{file2,file3,.file4}
rm -f /home/dir10/  #不包括隐藏文件 
ls /home/dir10/ -a
. .. .file4


# rm删除示例2
touch file{1..10}
touch {1..10}.pdf
rm -rf file    # 递归删除file开头的文件--->等价于 rm -f file*
rm -rf .pdf    # 递归删除.pdf结尾的文件--->等价于 rm -f *.pdf

# 移动目录和文件mv

# mv file file1             #原地移动算改名,相当于重命名文件
# mv file1 /tmp/            #移动文件至tmp目录, 注意:跟 mv file1 tmp 不一样,前者是根下的tmp,后者是当前路径下的tmp
# mv /tmp/file1 ./          #移动tmp目录的文件至当前目录
# mv dir/ /tmp/             #移动目录至/tmp目录下

# touch file{1..3}
# mv file1 file2 file3 /opt/    #移动多个文件或至同一个目录

# mkdir dir{1..3}
# mv dir1/ dir2/ dir3/ /opt/    #移动多个目录至同一个目录

# 复制目录和文件cp 

#选项: -v:详细显示命令执行的操作 -r: 递归处理目录与子目录 -p: 保留源文件或目录的属性

# cp file /tmp/file_copy
# cp name /tmp/name2        #拷贝name文件到tmp目录,并修改名称为name2
# cp file /tmp/             #拷贝file文件到tmp目录,不修改名称
# cp -p file /tmp/file_p    #保持原文件或目录的属性
# cp -r  /etc/ /tmp/        #复制目录需要使用-r参数, 递归复制,把etc目录拷贝到tmp目录下
# cp -rv /etc/hosts /etc/hostname /tmp  #拷贝多个文件至一个目录
# cp -rv /etc/{hosts,hosts.bak}
# cp -rv /etc/hosts{,-org}

# 以树状显示目录结构命令tree

# 安装yum install tree
# 选项: -L: 显示目录树的层级
# tree /home/od/    #显示当前目录下的结构
/home/od/
├── but
├── dir1
├── dir2
├── dir3
├── dir4
├── dir5
│   └── dir6
└── diu

 

4.2 文件管理之:查看文件内容(cat tac less more head tail tailf grep …)

#------cat  查看文本内容,全部拿出来
# cp /etc/passwd ./pass
# cat pass      #正常查看文件方式
# cat -n pass   #-n显示文件有多少行
# cat -A pass   #查看文件的特殊符号,比如文件中存在tab键
# tac pass      #倒序查看文件
cat >> test2.txt <<EOF  # 朝文本输入内容,追加写
> 文本内容...
> 文本内容...
> EOF   # 结束输入并保存


#------less、more  查看文件内容,可以分页查看
# less /etc/services    #使用光标上下翻动,空格进行翻页,q退出
# more /etc/services    #使用回车上下翻动,空格进行翻页,q退出(有百分比)


#------head
# head pass          #文件非常大,只查看头部内容,默认前十行
# head -n5 pass      #查看头部5行,使用-n指定
# ps aux             #打印所有进程,相当于windows任务管理器  
# ps aux | head -5   #只看头部5个进程,|是管道符,它把前面输出的结果传递给后面做处理


#------tail                  
# tail pass                  #查看文件尾部,默认10行
# tail -20 /var/log/secure   #查看文件尾部20行
# tail -f /var/log/messages  #-f动态查看文件尾部的变化,一般用来查看日志
# tailf /var/log/messages    #查看文件尾部的变化
# ps aux | tail -2           #只看尾部2个进程


#------grep关键字过滤,用来查找文件内容
# grep "^root" pass     #匹配以root开头的行
# grep "bash$" pass     #匹配以bash结尾的行
# grep -i "ftp" pass    #忽略大小写匹配
# grep  -Ei "sync$|ftp" pass            #匹配文件中包含sync结尾或ftp字符串
# grep -n -A 2 "Failed" /var/log/secure #匹配/var/log/secure文件中Failed字符串,并打印它的下2行
# grep -n -B 2 "Failed" /var/log/secure #匹配/var/log/secure文件中Failed字符串,并打印它的上2行
# grep -n -C 2 "Failed" /var/log/secure #匹配/var/log/secure文件中Failed字符串,并打印它的上下2行
grep "lqz" test2.txt   # 查找文件中有lqz的行
ps aux | grep ssh      # 查看sshd进程是否在运行

# 上翻,下翻
ctrl+b:下翻
ctrl+f:上翻

 

4.3 文件管理之:联网下载文件(wget、curl)、文件上传与下载(rz、sz)

wget、curl联网下载文件

yum install wget -y
选项: -大写O: 指定下载地址
# 默认下载在当前路径
wget http://mirrors.aliyun.com/repo/Centos-7.repo 
# 指定下载路径
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo


# crul:浏览网络上资源,-小写o保存到本地,用来测试连通性(本地curl一下,如果能连通,可能是防火墙,阿里云的安全组)
选项: -小写o: 指定下载地址
# 这种用法就跟wget一样
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

rz/sz上传下载文件(4g以内)

# yum install lrzsz -y  #不安装软件则无法执行该命令

# rz            #上传,选择文件直接上传-->文件自动保存在当前路径
# sz /path/file #把文件下载到当前宿主机

 

4.4 文件管理之:文件或命令查找(locate、which、whereis、find)

文件查找

# locate /etc/sh       #搜索etc目录下所有以sh开头的文件
# locate -i /etc/sh    #搜索etc目录下,所有以sh开头的文件,忽略大小写

命令查找

# which ls  #查找ls命令的绝对路径
它是去/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin 这些路径找有没有ls这个命令

# whereis ls       //查找命令的路径、帮助手册、等
# whereis -b ls    //仅显示命令所在的路径,仅看二进制(可执行文件)

# 对于内核相关的一些命令,用which whereis 是无法查询到的,需要使用type采查询
# type -a ls        #查看命令的绝对路径(包括别名)
# type -a for

 

4.5 文件管理之:字符处理命令(sort、uniq、cut、sed、awk、wc、)

sort排序

在有些情况下,需要对应一个无序的文本文件进行数据的排序,这时就需要使用sort进行排序了

sort [OPTION]... [FILE]...
# -r:倒序 -n:按数字排序 -t:指定分隔符(默认空格) -k:指定第几列, 指定几列几字符(指定1,1  3.1,3.3)

#1.首先创建一个文件,写入一段无序的内容
[root@lqz ~]# cat >> file.txt <<EOF
b:3
c:2
a:4
e:5
d:1
f:11
EOF

#2.使用sort下面对输出的内容进行排序
[root@lqz ~]# sort file.txt
a:4
b:3
c:2
d:1
e:5
f:11

#结果并不是按照数字排序,而是按字母排序。
#可以使用-t指定分隔符, 使用-k指定需要排序的列。
# -t 指定分隔符,-k指定列,按第二列排序
[root@lqz ~]# sort -t ":" -k2 file.txt
d:1
f:11 #第二行为什么是11?排序规则是AIISC码
c:2
b:3
a:4
e:5

#按照排序的方式, 只会看到第一个字符,11的第一个字符是1, 按照字符来排序确实比2小。 
#如果想要按照数字的方式进行排序, 需要使用 -n参数,按数字排序。
[root@lqz ~]# sort -t ":" -n -k2 file.txt
d:1
c:2
b:3
a:4
e:5
f:11


#测试案例,下载文件http://fj.xuliangwei.com/public/ip.txt,对该文件进行排序
[root@lqz ~]# sort -t. -k3.1,3.1nr -k4.1,4.3nr ip.txt

uniq去重
如果文件中有多行完全相同的内容,当前是希望能删除重复的行,同时还可以统计出完全相同的行出现的总次数, 那么就可以使用uniq命令解决这个问题(但是必须配合sort使用,相邻的才能去重,所以要配合sort)

uniq [OPTION]... [INPUT [OUTPUT]]
#选项:-c  计算重复的行

#1.创建一个file.txt文件:
[root@lqz ~]# cat >>file2.txt <<EOF
abc
123
abc
123
EOF

#2.uniq需要和sort一起使用, 先使用sort排序, 让重复内容连续在一起
[root@lqz ~]# cat file.txt |sort
123
123
abc
abc

#3.使用uniq去除相邻重复的行
[root@lqz ~]# cat file.txt |sort|uniq
123
abc

#4.-c参数能统计出文件中每行内容重复的次数
[root@lqz ~]# cat file.txt |sort|uniq -c
      2 123
      2 abc

cut截取字段

cut OPTION... [FILE]...
#选项:-d 指定分隔符 -f 数字,取第几列 –f3,6三列和6列 -c 按字符取(空格也算)
#echo "Im lqz, is QQ 306334678" >file.txt   
#过滤出文件里 lqz以及306334678

#实现上述题目几种思路
# cut -d " " -f2,5 file.txt
# cut -d " " -f2,5 file.txt |sed 's#,##g'
# sed 's#,# #g' file.txt | awk -F " " '{print $2 " " $5}'
# awk  '{print $2,$5}' file.txt |awk -F ',' '{print $1,$2}'
# awk -F  "[, ]" '{print $2,$6}' file.txt
# awk -F '[, ]+' '{print $2,$5}' file.txt

# awk 取列
awk '{print $2,$5}' file.txt
# -F 指定分隔符
awk '{print $2,$5}' file.txt | awk -F "," '{print $1,$2}'

# sed 替换 sed 's###g'
# sed 's###g' 固定写法
# sed 's#,##g'  把逗号替换成空
cut -d " " -f2,5 file.txt | sed 's#,##g'

wc统计行号

wc [OPTION]... [FILE]...
#选项:-l显示文件行数 -c显示文件字节 -w显示文件单词

# wc -l /etc/fstab          #统计/etc/fstab文件有多少行
# wc -l /etc/services       #统计/etc/services文件有多少行
# ls |wc -l                 #统计当前路径下有多少文件和文件夹
# ps aux |grep ssh | wc -l  #统计有多少个ssh相关的进程

#扩展方法
# grep -n "." /etc/services  | tail -1
# awk '{print NR $0}' /etc/services | tail -1
# cat -n /etc/services  | tail -1

 

5 系统文件属性

当我们使用ls -l列目录下所有文件时,通常会以长格式的方式显示,其实长格式显示就是我们Windows下看到的文件详细信息,我们也将其称为文件属性,那整个文件的属性分为十列。

[root@lqz ~]# ls -l ks.cfg
[root@lqz ~]# ll -h ks.cfg
ls      # 查看当前路径下文件
ls -l   # 查看当前路径下文件详情
ls -a   # 查看当前路径下所有文件(包含隐藏文件)
ls -al  # 查看当前路径下所有文件(包含隐藏文件)详情
ls -lh  # 以人性化显示,文件大小显示为kb,gb

# 查看文件属性
示例:  -rw-------. 1 root root 4434 May 30 13:58 ks.cfg

#
-           文件类型
rw-------   权限
1           硬链接次数
root        文件属于哪个用户(属主)
root        文件属于哪个组(属组)
4434        文件大小
May30 13:58 最新修改的时间与日期
ks.cfg      文件或目录名称

 

6 系统文件类型

1.通常我们使用颜色或者后缀名称来区分文件类型,但很多时候不是很准确,所以我们可以通过ls -l以长格式显示一个文件的属性,通过第一列的第一个字符来近一步的判断文件具体的类型

[root@lqz ~]# ll -d /etc/hosts  /tmp/bin/ls   /dev/sda/  /dev/tty1/  /etc/grub2.cfg/  /dev/log/  /run/dmeventd-client
-rwxr-xr-x.  1 root root 117656 Jun 30  2016 /bin/ls
srw-rw-rw-.  1 root root      0 Jan 20 10:35 /dev/log
brw-rw----.  1 root disk   8, 0 Jan 20 10:36 /dev/sda
crw--w----.  1 root tty    4, 1 Jan 20 10:36 /dev/tty1
lrwxrwxrwx.  1 root root     22 Jan 13 11:31 /etc/grub2.cfg -> ../boot/grub2/grub.cfg
-rw-r--r--.  1 root root    199 Jan 20 11:03 /etc/hosts
prw-------.  1 root root      0 Jan 20 10:36 /run/dmeventd-client
drwxrwxrwt. 61 root root   8192 Jan 21 13:01 /tmp

#说明
-   #普通文件(文本, 二进制, 压缩, 图片, 日志等) 
d   #目录文件
b   #设备文件(块设备)存储设备硬盘 /dev/sda1, /dev/sda2
c   #设备文件(字符设备),终端 /dev/tty1, /dev/zero
s   #套接字文件, 进程间通信(socket)
p   #管道文件
l   #链接文件

2.但有些情况下,我们无法通过ls -l文件的类型,比如: 一个文件,它可能是普通文件、也可能是压缩文件、或者是命令文件等,那么此时就需要使用file来更加精准的判断这个文件的类型

[root@lqz ~]# file /etc/hosts
/etc/hosts: ASCII text

[root@lqz ~]# file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=aa7ff68f13de25936a098016243ce57c3c982e06, stripped

[root@lqz ~]# file /dev/sda
/dev/sda: block special

[root@lqz ~]# file /dev/tty1
/dev/tty1: character special

[root@lqz ~]# file /etc/grub2.cfg
/etc/grub2.cfg: broken symbolic link to `../boot/grub2/grub.cfg'

[root@lqz ~]# file /home
/home: directory

[root@lqz ~]# file /run/dmeventd-client
/run/dmeventd-client: fifo (named pipe)

[root@lqz ~]# ll but
-rw-r--r-- 1 root root 42125 Apr  1 12:26 but
[root@lqz ~]# file but
but: Zip archive data, at least v1.0 to extract

 

7 系统链接文件

文件有文件名与数据,在Linux上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。
用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方,我们将其称为Block。
元数据,即文件的附加属性,如文件大小、创建时间、所有者等信息,我们称其为Inode。
在Linux中,inode是文件元数据的一部分但其并不包含文件名,inode号即索引节点号
文件名仅是方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。图1.展示了程序通过文件名获取文件内容的过程

Linux 系统引入了两种链接:硬链接 (hard link) 与软链接(又称符号链接,即 soft link 或 symbolic link)

ll -i 查看inode

7.1 什么是软链接

软链接相当于Windows的快捷方式,软链接文件会将inode指向源文件的block,当我们访问这个软链接文件时,其实访问的是源文件本身。那么当我们对一个文件创建多个软链接,其实就是多个inode指向同一个block。当我们删除软链接文件时,其实只是删除了一个inode指向,并不会对源文件源文件造成影响,但如果删除的是源文件则会造成所有软链接文件失效

7.2 什么是硬链接

若一个inode号对应多个文件名,则称这些文件为硬链接。换言之,硬链接就是同一个文件使用了多个别名,如下图hard link 就是 file 的一个别名,他们有共同的 inode

7.3 软链接实践

#文件软链接示例
touch /root/file
ln -s /root/file /tmp/file_bak   # root下file链接到/tmp下并重命名为file_bak
ln -s a.png /home/jack/a.png     # 把当前路径下的a.png软连接到/home/jack/下
ll /tmp/file_bak                 # 快捷方式指向的文件则是红色, 指向的是目录则是蓝色
ll jack/a.png

#目录软链接示例
mkdir /soft/nginx1.1 -p
ln -s /soft/nginx1.1/ /soft/nginx   # soft下nginx.1.1目录软连接到soft/nginx
ll /soft/nginx                      # 查看链接指向

#软链接使用场景
1.软件升级
2.企业代码发布 
3.不方便目录移动

# 软件升级和代码发布的方式,如服务器安装了redis, redis-server和redis-cli需要加入到环境变量
# 问题:
redis-3.2.1---->编译安装
redis-3.2.1/bin 把原文件bin路径配置到环境变量,bin目录下是redis的执行文件
一旦软件升级到redis-4.2.1, redis3.2.1就不能用,需要重新配置环境变量
                
解决方案:
ln -s redis-3.2.1/bin/redis /usr/bin/redis  #把redis启动文件软连接到/usr/bin/,/usr/bin/路径在环境变量中
软件升级
ln -snf redis-4.2.1/bin/redis /usr/bin/redis #修改软链接,把新的redis执行文件软连接到/usr/bin/,不用重新配置环境变量
# 如果升级的版本有问题,要用回老版本,直接软链接redis---> redis-3.2.1回去

7.4 硬链接实践

#文件硬链接示例
ln  /root/file /tmp/file_hard
ll /tmp/file_hard

#PS:目录不能创建硬链接,硬链接文件可以用rm命令删除

7.5 硬链接与软链接区别

1)ln命令创建硬链接,ln -s命令创建软链接。
2)目录不能创建硬链接,并且硬链接不可以跨越分区系统。
3)目录软链接特别常用,并且软链接支持跨越分区系统。
4)硬链接文件与源文件的inode相同,软链接文件与源文件inode不同。
5)删除软链接文件,对源文件及硬链接文件无任何影响。
6)删除文件的硬链接文件,对源文件及链接文件无任何影响。
7)删除链接文件的源文件,对硬链接无影响,会导致软链接失效。
8)删除源文件及其硬链接文件,整个文件会被真正的删除。

 

posted @ 2022-10-02 23:43  不会钓鱼的猫  阅读(287)  评论(0编辑  收藏  举报