文件属性
谈到Linux
文件管理,首先我们需要了解的就是,我们要对文件做些什么事情?
其实无非就是对一个文件进行创建、复制、移动、查看、编辑、压缩、查找、删除、等等
如:当我们想修改系统的主机名称,是否应该知道文件在哪,才能去做对应的修改?
# linux目录结构
几乎所有的计算机操作系统都是使用目录结构组织文件。具体来说就是在一个目录中存放子目录和文件,而在子目录中又会进一步存放子目录和文件,以此类推形成一个树状的文件结构,由于其结构很像―棵树的分支,所以该结构又被称为“目录树”;
Windows
:以多根的方式组织文件C:\ D:\
Linux
:以单根的方式组织文件/
# 命令相关目录/bin
- 存放命令相关的目录
/bin
普通用户使用的命令/bin/ls,/bin/date
/sbin
管理员使用的命令/sbin/service
# 用户家相关目录/home
- 存放用户相关数据的家目录,比如
windows
不同的用户登陆系统显示的桌面背景不一样/home
普通用户的家目录,默认为/home/username
/root
超级管理员root
的家目录,普通用户无权操作
# 系统文件目录/usr
- 存放系统相关文件的目录
/usr
相当于C:\windows
/usr/local
软件安装的目录,相当于C:\Program
/usr/bin/
普通用户使用的应用程序(重要)/usr/sbin
管理员使用的应用程序(重要)/usr/lib
库文件Glibc 32bit
/usr/lib64
库文件Glibc 64bit
# 系统启动目录/boot
- 存放系统启动时内核与
grub
引导菜单/boot
存放的系统启动相关的文件,如:kernel,grub
(引导装载程序)
# 配置文件目录/etc
/etc
存放系统配置文件目录,后续所有服务的配置都在这个目录中/etc/sysconfig/network-script/ifcfg-
,网络配置文件/etc/hostname
系统主机名配置文件
# 设备相关目录/dev
/dev
存放设备文件的目录,比如硬盘,硬盘分区,光驱,等等/dev/null
黑洞设备,只进不出。类似于垃圾回收站/dev/random
生成随机数的设备/dev/zero
能源源不断的产生数据
# 可变的目录/var
/var
存放一些变化文件,比如/var/log/
下的日志文件./var/tmp
,进程产生的临时文件/tmp
,系统临时目录(类似于公共厕所)
# 虚拟系统目录/proc
- 虚拟的文件系统(如对应的进程停止则
/proc
下对应目录则会被删除) /proc
,反映当前系统正在运行进程的实时状态,类似于汽车在运行过程中的仪表板,能够看到汽车的油耗、时速、转向灯、故障等等
# 文件路径定位
在我们开始操作文件之前,首先需要对文件的路径进行定位。
# 为什么要进行定位
- 你要在哪个目录下创建文件?
- 你要将文件复制到什么地方?
- 你要删除的文件在什么地方?
# 如何对文件进行定位
比如:/etc/hostname
整个文件中包含文件名称以及文件所在的位置,我们将这个叫做路径,也就是说我们是通过路径对文件进行定位。例:下图所示的message
所在的路径是?
FQ1:
/home/boy/file
和/home/gir1/file
是否是同一个文件?FQ2:
/abc/test
和abc/test
是—样的吗?
# 绝对路径与相对路径
- 绝对路径:只要从
/
开始的路径,比如/home/alice/file
- 相对路径:相对于
当前目录
来说,比如a.txt ./a.txt ../bob/a.mp3
.
和..
的是什么意思- 一个点代表当的是当前目录;
- 两个点代表的是当前目录的上层目录;
- 所谓的(.)和(..)目录实际上属于相对路径的一种表示形式;
# 路径切换命令cd
例子如下:
# cd绝对路径:cd /etc/hostname
# cd相对路径:cd test/abc cd . cd ..
--------------------------------------
# cd #切换目录,例:cd /etc
# cd - #切换回上一次所在的目录
# cd ~ #切换回当前用户的家目录,注意:root和普通用户是否有所不同吗?
# cd . #代表当前目录,一般在拷贝、移动等情况下使用cp /etc/hostname ./
# cd .. #切换回当前目录的上级目录
2
3
4
5
6
7
8
# Linux基础命令
# 文件操作类命令
# touch文件创建
# touch file #无则创建,有则修改时间
# touch file2 file3
# touch /home/od/file4 file5
# touch file{a,b,c} #{}集合,等价touch a b c
# touch file{1..10}
# touch file{a..z}
2
3
4
5
6
# mkdir目录创建
# 选项:-v:显示详细信息 -p:递归创建目录
# mkdir dir1
# mkdir /home/ob/dir1 /home/ob/dir2
# mkdir -v /home/ob/{dir3,dir4}
# mkdir -pv /home/ob/dir5/dir6
# mkdir -pv /home/{ob/{diu,but},boy}
2
3
4
5
6
# tree显示目录结构
# 选项:-L:显示目录树的层级
# tree /home/ob/ #显示当前目录下的结构
/home/ob/
├—─ but
├─— dir1
├—─ dir2
├─— dir3
├─— dir4
├─— dir5
│ └── dir6
└── diu
2
3
4
5
6
7
8
9
10
11
# cp文件或目录复制
# 选项:-v:详细显示命令执行的操作 –r:递归处理目录与子目录 ―p:保留源文件或目录的属性
# cp file /tmp/file_copy
# cp name /tmp/name #不修改名称
# cp file /tmp/ #不修改名称
# cp -p file /tmp/file_p #-p保持原文件或目录的属性
# cp -r /etc/ /tmp/ #复制目录需要使用-r参数,递归复制
# cp -rv /etc/hosts /etc/hostname /tmp #拷贝多个文件至一个目录
# cp -rv /etc/{hosts,hosts.bak}
# cp -rv /etc/hosts{,-org}
2
3
4
5
6
7
8
9
# mv文件移动命令
# mv file file1 #原地移动算改名
# mv file1 /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 #移动多个目录至同一个目录
2
3
4
5
6
7
8
9
10
# rm文件或目录删除
# 选项:-r:递归 -f:强制删除 -v:详细过程
# rm file.txt #删除文件,默认rm存在alias别名, rm -i所以会提醒是否删除文件
# rm -f file.txt #删除文件,不提醒
-------------------------------------
# rm -r dir/ #递归删除目录,会提示
# rm -rf dir/ #强制删除目录,不提醒(慎用)
2
3
4
5
6
# 文件查看类命令
# cat命令
# cp /etc/passwd ./pass
# cat pass #正常查看文件方式
# cat -n pass #-n显示文件有多少行
# cat -A pass #查看文件的特殊符号,比如文件中存在tab键
# tac pass #倒序查看文件
2
3
4
5
# less-more命令
# less /etc/services #使用光标上下翻动,空格进行翻页,q退出
# more /etc/services #使用回车上下翻动,空格进行翻页,q退出
2
# head-tail命令
# head pass #查看头部内容,默认前十行
# head -n5 pass #查看头部5行,使用-n指定
# tail pass
# tail -20 /var/log/secure
# tail -f /var/log/messages #-f查看文件尾部的变化
# tailf /var/log/messages #查看文件尾部的变化
2
3
4
5
6
7
# grep过滤数据
# grep "^root" pass #匹配以root开头的行
# grep "bash$" pass #匹配以bash结尾的行
# grep -v "ftp" pass #匹配除了包含ftp的内容,其他全部打印
# 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行
2
3
4
5
6
7
8
# 文件下载类命令
# wget命令
# CentoS7 系统最小化安装默认没有wget命令,需要进行安装
# yum install wget -y
# 下载互联网上的文件至本地
# wget http://mirrors.aliyun.com/repo/centos-7.repo
# 将阿里云的centos-7.repo下载到/etc/yum.repos.d/并改名为CentOS-Base.repo -O参数指定
# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
2
3
4
5
6
7
8
# curl命令
# 仅查看这个url地址的文件的内容
# curl http://mirrors.aliyun.com/repo/centos-7.repo
# 将阿里云的centos-7.repo下载到/etc/yum.repos.d/并改名为CentOS-Base.repo -o参数指定
# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
2
3
4
5
# rz-sz命令
# yum install lrzsz -y #不安装软件则无法执行该命令
# rz #只能上传文件,不支持上传文件夹,不支持大于4个G上传,也不支持断点续传
# sz /path/file #只能下载文件,不支持下载文件夹
2
3
4
# 字符处理类命令
# sort命令
在有些情况下,需要对应一个无序的文本文件进行数据的排序,这时就需要使用sort
进行排序了。
sort [OPTION]... [FILE]...
# -r:倒序 -n:按数字排序 -t:指定分隔符(默认空格) -k:指定第几列,指定几列几字符(指定1,13.1,3.3)
# 1.首先创建一个文件,写入一写无序的内容
[root@web ~]# cat >> file.txt <<EOF
b:3
c:2
a:4
e:5
d:1
f:11
EOF
# 2.下面使用sort对输出的内容进行排序
[root@web ~]# sort file.txt
a:4
b:3
c:2
d:1
e:5
f:11
# 结果并不是按照数字排序,而是按字母排序。
# 可以使用-t指定分隔符,使用-k指定需要排序的列。
[root@web ~]# sort -t ":" -k2 sort.txt
d:1
f:11 #第二行为什么是11?不应该按照顺序排列?
c:2
b:3
a:4
e:5
# 按照排序的方式,只会看到第一个字符,11的第一个字符是1,按照字符来排序确实比2小。
# 如果想要按照数字的方式进行排序,需要使用-n参数。
[root@web ~]# sort -t ":" -n -k2 p.txt
d:1
c:2
b:3
a:4
e:5
f:11
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# uniq命令
如果文件中有多行完全相同的内容,当前是希望能删除重复的行,同时还可以统计出完全相同的行出现的总次数,那么就可以使用uniq
命令解决这个问题(但是必须配合sort
使用)。
uniq [OPTION]... [INPUT [OUTPUT]]
#选项:-c 计算重复的行
# 1.创建一个file.txt文件:
[root@web ~]# cat file.txt
abc
123
abc
123
# 2.uniq需要和sort一起使用,先使用sort排序,让重复内容连续在一起
[root@web ~]# sort file.txt
123
123
abc
abc
# 3.使用uniq去除相邻重复的行
[root@web ~]# sort file.txt | uniq
123
abc
# 4.-c参数能统计出文件中每行内容重复的次数
[root@www~]# sort file.txt | uniq -c
2 123
2 abc
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# wc命令
wc [OPTION]... [FILE]...
# 选项:-l:显示文件行数 -c:显示文件字节 -w:显示文件单词
# wc -l /etc/fstab #统计/etc/fstab文件有多少行
# wc -l /etc/services #统计/etc/services文件行号
# 扩展统计文件行号的方法
# grep -n ".*" /etc/services | tail -1
# cat -n /etc/services | tail -1
# awk '{print NR $0}' /etc/services | tail -1
2
3
4
5
6
7
8
9
10
# Linux文件属性
# 文件属性
当我们使用ls -l
列目录下所有文件时,通常会以长格式的方式显示,其实长格式显示就是我们windows
下看到的文件详细信息,我们将其称为文件属性,整个文件的属性分为十列。
[root@web ~]# ls -l ks.cfg
-rw-------. 1 root root 4434 May 30 13:58 ks.cfg
-rw-------. ①:第一个字符是文件类型,其他则是权限
1 ②:硬链接次数
root ③:文件属于哪个用户
root ④:文件属于哪个组
4434 ⑤:文件大小
May 30 13:58 ⑥⑦⑧:最新修改的时间与日期
ks.cfg ⑨:文件或目录名称
2
3
4
5
6
7
8
9
# 文件类型
通常我们使用颜色或者后缀名称来区分文件类型,但很多时候不是很准确,所以我们可以通过ls -l
以长格式显示一个文件的属性,通过第一列的第一个字符来近一步的判断文件具体的类型。
[root@web ~]# 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
drwxrwxrwt. 61 root root 8192 Jan 21 13:01 /tmp
2
3
4
5
6
7
8
文件类型说明
文件类型字母 类型含义 - 普通文件(文本,二进制,压缩,图片,日志等) d 目录文件 b 设备文件(块设备)存储设备硬盘/dev/sda,/dev/sr0 c 设备文件(字符设备),终端/dev/tty1 s 套接字文件,进程与进程间的一种通信方式(socket) l 链接文件 但有些情况下,我们无法通过
ls -l
文件的类型,比如:一个文件,它可能是普通文件、也可能是压缩文件、或者是命令文件等,那么此时就需要使用file
来更加精准的判断这个文件的类型[root@web ~]# file /etc/hosts /etc/hosts:ASCII text [root@web ~]# 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]=aa7ff68f13de25936a098016243ce 57c3c982e06, stripped [root@web ~]# file /dev/sda /dev/sda:block special [root@web ~]# file /dev/tty1 /dev/tty1:character special [root@web ~]# file /etc/grub2.cfg /etc/grub2.cfg:broken symbolic link to `../boot/grub2/grub.cfg [root@web ~]# file /home /home:directory
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
PS:Linux文件扩展名不代表任何含义,仅为了我们能更好的识别该文件是什么类型。
# Linux链接文件
# Inode与Block
- 文件有文件名与数据,在Linux上被分成两个部分︰数据
data
与文件元数据metadata
- 1.数据
data block
,数据块是用来记录文件真实内容的地方,我们将其称为Block
- 2.元数据
metadata
,用来记录文件大小、创建时间、所有者等信息,我们将其称为inode
- 3.需要注意:
inode
并不包含文件名称,inode
仅包含文件的元数据信息,具体来说有以下内容:- 文件的字节数
- 文件的User ID Group ID
- 文件的读、写、执行权限
- 文件的时间戳
- 链接数,即有多少文件名指向这个
inode
- 文件数据block的位置
- 1.数据
- 每个
inode
都是一个编号,操作系统是通过inode
来识别不同的文件。- 对于系统来说,文件名只是
inode
便于识别的别名,或者绰号。(便于我们人识别。) - 表面上,用户是通过文件名打开的文件,实际上系统内部这个过程分为如下三步:
- 首先,系统找到这个文件名对应的
inode
编号 - 其次,通过
inode
编号,获取inode
信息 - 最后,根据
inode
信息,找到文件数据所在的block
,读出数据。
- 首先,系统找到这个文件名对应的
- 对于系统来说,文件名只是
# 软连接
- 什么是软连接︰
- 软链接相当于
windows
的快捷方式,软链接文件会将inode
指向源文件的block
当我们访问这个软链接文件时,其实访问的是源文件本身;
- 软链接相当于
- 软连接使用场景
- 软件升级
- 代码发布
软链接场景实践
# 1.准备网站1.1版本代码 [root@web ~]# mkdir /data/rainbow-v1.1 -p [root@web ~]# echo "123" > /data/rainbow-v1.1/index.html # 2.创建软链接 [root@web ~]# ln -s /data/rainbow-v1.1/ /data/rainbow [root@web ~]# ll /data/ drwxr-xr-x. 2 root root 6 3月 5 12:23 dir lrwxrwxrwx. 1 root root 19 3月 10 12:09 rainbow -> /data/rainbow-v1.1/ drwxr-xr-x. 2 root root 24 3月 10 12:09 rainbow-v1.1 # 3.检查网站程序 [root@web ~]# cat /data/rainbow/index.html 123 # 4.新更新一个网站的程序代码 [root@web ~]# mkdir /data/rainbow-v1.2 [root@web ~]# echo "456” > /data/rainbow-v1.2/index.html # 5.升级 [root@web ~]# rm -f /data/rainbow && ln -s /data/rainbow-v1.2/ /data/rainbow [root@web ~]# cat /data/rainbow/index.html 456 # 6.回退 [root@web ~]# rm -f /data/rainbow && ln -s /data/rainbow-v1.1/ /data/rainbow [root@web ~]# cat /data/rainbow/index.html 123
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 硬连接
硬链接类似于超时有多个门,无论丛哪个门进入,看到的内容都是一样的。如果关掉一扇门,那影响进入超市?
回到系统中,我们对硬链接的解释:不同的文件名指向同一个inode
,简单的说就是指向同一个真实的数据源。
- 硬链接与软链接区别
ln
命令创建硬链接,ln -s
命令创建软链接- 目录不能创建硬链接,并且硬链接不可以跨越分区系统;
- 软链接支持对目录创建,同时也支持跨越分区系统;
- 硬链接文件与源文件的
inode
相同,软链接文件与源文件inode
不同; - 删除文件的软链接文件,对源文件及硬链接文件无任何影响;
- 删除文件的硬链接文件,对源文件及链接文件无任何影响;
- 删除链接文件的源文件,对硬链接无影响,会导致软链接失效;
- 删除源文件及其硬链接文件,整个文件会被真正的删除;