1 系统目录结构
1.1 系统目录介绍
Linux下一切皆文件,在Linux中是如何对不同的文件进行管理的,首先在Linux中将相同类型的文件存在指定的目录中,不同的发行商可能采用不同的标准去归类创建不同的目录,这样就会造成很多管理上的困扰。于是就有了所谓的Filesystem Hierarchy Standard(FHS)
标准,其主要的目的是规范每个特定的目录下应该要存放什么文件。这样就能方便用户对文件进行管理。
Linux中的目录结构在逻辑上是以树状的形式存在的,可以通过以下明林查看根目录以及子目录:
[root@localhost ~]# tree -L 1 /
/
├── bin -> usr/bin
├── boot
├── dev
├── etc
├── home
├── lib -> usr/lib
├── lib64 -> usr/lib64
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var
19 directories, 0 files
1.2 Linux的目录结构
- /bin: 用户命令存放的位置相当于Windows中的
C:\Windows\system32
; - /sbin:系统管理使用的工具程序;
注意:在Centos 7中/bin和/sbin两个目录是/usr/bin和/usr/sbin目录的软链接(Windows中的快捷方式)
- /boot: 引导加载器必须用到的各种静态文件,主要有Kernel,initramfs(initrd),grub等;
-
/dev: 存储特殊文件或设备文件,设备有字符设备(线性设备)和 块设备(随机设备)两种类型;
系统的磁盘文件存放在/dev目录下,比如/dev/sda3:
- sd: 磁盘类型,特殊磁盘类型vd(KVM)
- a: 磁盘排序,第一块磁盘为a,第二块磁盘为b,以此类推
-
3: 代表一块磁盘的分区编号
- 1-4: 表示主分区或扩展分区(前四个分区是并行存在,也就是说编号为1的分区 后可以为编号为3的分区)
- 5- : 表示逻辑分区(逻辑分区的编号必须按照排序号进行)
- /etc: 系统程序的配置文件,只能为静态文件;
- /home: 普通用户的家目录集中位置。一般每个普通用户的家目录是此目录下与用户同名额子目录;
- /root: 管理员的家目录;
-
/lib: 为系统启动或根文件系统上的应用程序(/bin,/sbin等)提供共享库,以及为内核提供内核模块;
- libc.so.*: 动态链接的C库
- ld*: 运行时链接器/加载器
- modules: 用于存储内核模块的目录
- /lib64: 64位系统特有的存放64位共享库的路径;
注意:在Centos 7中/lib和/lib64两个目录是/usr/lib和/usr/lib64目录的软链接
- /media: 便携式设备挂载点,一般cdrom、floppy、u盘等都是挂载在该目录下;
- /mnt:其他文件系统的临时挂载点;
- /opt:附加应用程序的安装位置,可选路径;
- /srv: 当前主机为服务提供的数据,主机特有的;
- /tmp:为那些会产生临时文件的程序提供的用于存储临时文件的目录,可提供所有用户执行写入操作,有特有权限;
-
/usr: 全局共享只读文件目录,重要性仅次于根目录;
- ./bin, ./sbin, ./lib, ./lib64
- ./include: C程序头文件
- ./share: 命令手册页和自带文档等架构特有的文件存储位置
- ./local: 另一个层级目录,让系统管理员安装本地应用程序,也通常用于安装第三方程 序
- ./XllR64: X-Windows程序安装位置
- ./src: 程序源码文件的存储位置
- /var: 存储常发生变化的数据文件;
- /proc:基于内存的虚拟文件系统,用于实现为内核及进程存储其他相关信息,它们多为内核参数,例如
net.ipv4.ip_forward
,虚拟为net/ipv4/ip_forward
,存储在/proc/sys/
目录下,因此其完整路径为/proc/sys/net/ipv4/ip_forward
; - /sys:sysfs文件系统的挂载点,为虚拟文件系统提供了一种比proc更为理想的访问内核数据的途径,主要作用于为管理Linux设备提供一种统一模型的接口。
2 文件路径定位
Linux系统的文件目录是以目录树的形式存储的,那么在Linux系统中我们如何能够找到一个文件所在的位置?联想现实生活中,我们要去某个地方去找某个人,首先必须先知道那个人在什么地方,然后依照路线去找到那个人。同样在Linux系统中要找到一个文件,首先要知道该文件大概在哪个目录下,然后通过路径去找到该文件。于是就有了相对路径和绝对路径:
2.1 相对路径
相对路径:根据当前环境
相对路径,关键点在于当前在什么路径下。假设当前目录在/usr/local
下,那么它的上层目录(/usr
目录);
2.2 绝对路径
绝对路径:唯一的路径
Linux系统采用了目录树的文件组织结构,在Linux下每个目录或文件都可以从根目录处开始寻找。比如/usr/bin
目录,这种从根目录开始的全路径被称为"绝对路径",绝对路径一定是以"/"
开头的,如何确认当前所在的目录,可以使用pwd
命令查看:
[root@localhost ~]# pwd
/root
3 目录管理命令
对于目录的管理主要有,创建和删除目录,以及目录的移动或者重命名。这节主要看在Linux下如何创建和删除目录,下节结合文件的管理对目录的移动和重命名进行说明。在介绍创建和删除目录之前,先看一下两个命令:
3.1 ls命令
ls - list directory contents
列出指定目录下的内容。
基本用法:
[root@localhost ~]# ls /
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
常用选项:
-a --all 列出所有文件,包括隐藏的文件
-l 以长格式的方式列出文件信息
-d 显示目录本身,不显示目录中的内容
-h 人性化显示,按照我们习惯的单位显示文件大小
-i 显示文件的i节点号
ls
命令使用案例:
## 以长格式显示所有文件
[root@localhost ~]# ls -al
## 显示目录本身的信息
[root@localhost ~]# ls -ld /etc
drwxr-xr-x. 144 root root 8192 Feb 25 21:01 /etc
## -l选项以长格式显示文件信息
[root@localhost ~]# ls -l
total 8
. 1 root root 1257 Aug 28 00:13 anaconda-ks.cfg
ls -l
用来显示文件详细信息,那么-l
选项显示这7列分表代表什么:
-
第一列:权限,
-rw-r--r--
- 第一个横杆代表文件的类型:
- -: 代表普通文件
- d: 代表目录
- l: 表示链接文件
- b: 表示块设备文件
- c: 表示字符设备文件
- s: 管道文件
-
rw-
代表文件所属者的权限:- r: 写权限
- w: 读权限
- x: 执行权限
-
r--
代表文件所属组的权限 -
r--
代表文件其他用户的权限
- 第二列:引用计数。文件的引用激素代表该文件的硬链接个数,而目录的引用计数代表该目录有多少个一级子目录。
- 第三列:文件所有者 ,也就是这个文件属于哪个用户。默认所有者是问价的建立者。
- 第四列:所属组。默认所属组是文件建立用户的有效组,一般情况下就是建立用户的所在组。
- 第五列:文件大小。默认单位是字节。
- 第六列:文件修改时间。文件状态修改时间或文件数据修改时间都会更改这个时间,注意这个时间不是文件的创建时间。
- 第七列:文件名。
3.2 cd命令
change director
,cd
命令用于切换目录,也就是让当前用户切换到指定的目录下。
基本用法:
[root@localhost ~]# cd /etc
[root@localhost etc]# pwd
/etc
cd
特殊用法:
[root@localhost ~]# cd - #切换至上次所在目录
[root@localhost ~]# cd ~ # 切换至当前用户的家目录
[root@localhost ~]# cd # 切换至当前用户的家目录
[root@localhost ~]# cd . # .代表当前目录,一般在拷贝、移动文件等情况下使用
[root@localhost ~]# cd .. # 切换至当前目录的上级目录
3.3 mkdir命令
make directory
创建一个当前目录下不存在的目录
基本用法:
[root@localhost ~]# mkdir a
常用选项:
-p 递归创建目录,如果上级要创建目录的上级目录不存在则创建,如果不存在不报错
-v 显示创建目录详情
示例:
## 在/tmp/viktor目录下创建a_c、a_d、b_c、b_d目录:
[root@localhost ~]# mkdir -pv /tmp/viktor/{a,b}_{c,d} # 这块使用了命令行展开,之后说明
3.4 rmdir命令
rmdir - remove empty directories
,删除空目录
基本用法:
[root@localhost ~]# rmdir -v a
如果该目录下有文件或者目录,rmdir命令就不能将该目录删除。
4 文件管理命令
Linux一切皆为文件,在对Linux进行配置时,很大程度上就是处理文件的过程,所以掌握文件的相关操作是非常有必要的文件的一般操作有:创建、复制、删除、移动、重命名、以及查看文件相关的信息。
4.1 touch命令
touch - change file timestamps
,当文件不存在时创建文件,当文件存在时更新文件的时间戳信息。
[root@localhost ~]# touch /tmp/viktor_{1..10}.txt
[root@localhost ~]# touch filename
[root@localhost ~]# touch filename_1 filename_2
[root@localhost ~]# touch /home/server/file5 file5
[root@localhost ~]# touch file{1..10}
[root@localhost ~]# touch file{a..z}
4.2 stat命令
stat - display file or file system status
,stat
命令可以查看一个文件或者一个文件系统的相关的信息。
基本用法:
[root@localhost ~]# stat filename
4.3 cp命令
cp - copy files and directories
,cp
命令用来对文件或目录进行复制。
基本用法:
cp 源文件/目录 目标文件/目录
cp命令在复制文件或者目录的过程中,牵涉到用户所要复制的文件或者目录时一个还是多个,目标文件或者目录是否存在,存在以及不存在会是什么样的情况,下面分别来看下cp命令中的单源复制和多源复制时注意事项:
单源复制:
cp [OPTION]… [-T] SOURCE DEST
- 情况1:如果目标不存在,则事先创建此文件,并复制源文件的内容至目标文件中;
- 情况2:如果目标存在,并且是非目录文件,则覆盖目标文件;
- 情况3:如果目标存在,并且是目录文件,则先在目标目录下创建一个与源文件同名的文件,并复制源文件的内容。
多源复制:
cp [OPTION]… SOURCE… DIRECTORY
cp [OPTION]… -t DIRECTORY SOURCE…
- 情况1:如果目标不存在,报错;
- 情况2:如果目标存在,并且是非目录,错误;
- 情况3:如果目标存在,并且是目录,分别复制每个文件夹至目标目录中,并保持原名。
常用选项:
-i: 交互式复制,如果目标文件存在,提醒用户是否覆盖;
-f: 强制覆盖目标文件;
-r –R: 递归复制目录;
-d: 复制符号链接文件本身,而非其指向的源文件;
-a: -dR --preserve=all, archive,用于实现归档;
--preserve =
mode: 权限
ownership: 属主和属组
timestamps: 时间戳
context: 安全标签
xattr: 扩展属性
links: 符号链接
all: 上述所有属性
4.4 rm命令
rm - remove files or directories
,rm
命令用来删除指定的文件或目录。
基本用法:
rm [OPTION]… FILE...
常用选项:
-r: 递归删除(一般在删除目录时使用)
-f: 强制性删除,不提醒用户
-v: 删除时显示详细过程
4.5 mv命令
mv - move (rename) files
,mv
用来移动(重命名)文件或目录。
基本用法:
mv [OPTION]... [-T] SOURCE DEST
mv
命令也牵扯到单源移动和多源移动:
单源移动:对于单源移动,分为目标是否为目录,以及目标文件是否存在。
- 情况1:目标为目录, 此时会将源文件移动到指定的目录下
- 情况2:目标为文件并该文件存在, 此时会提醒用户是否覆盖目标文件,使用-f选项可以强制移动;
- 情况3:目标为文件并且该文件不存在,此时,如果目标不存在,就会创建相应的目标文件,然后将源文件移动至目标文件,相当于对源文件进行重命名;
多源移动:对于多源移动,目标必须为目录,否则会报错。
4.6 练习
## 在用户家目录下创建6个文件 song1.mp3 ~ song6.mp3
[root@localhost ~]# touch song{1,2,3,4,5,6}.mp3
## 把上述创建的songX.mp3文件移动到/Music目录(不存在则创建)
[root@localhost ~]# mkdir /Music
[root@localhost ~]# mv song* /Music/
## 在用户家目录下创建三个目录,分别为 friends, family, work
[root@localhost ~]# mkdir friends family work
## 切换到friends目录下,把/Music目录下的song1.mp3 ~ song6.mp3拷贝到当前目录
[root@localhost ~]# cd friends/
[root@localhost friends]# cp /Music/song* ./
## 切换到family目录下,把/Music目录下的song1.mp3 ~ song6.mp3移动到当前目录
[root@localhost ~]# cd family/
[root@localhost family]# mv /Music/song* ./
5 文件查看命令
Linux中有许多用来查看文件内容的命令,这些命令用在查看文件时的不同需求下,包括cat、more、less、head、tail命令,其中more和less命令属于分页显示文件的命令。
5.1 cat命令
cat - concatenate files and print on the standard output
,cat
命令用来读取文件的内容,一次性将文件读取到内存中,之后显示的终端屏上。只适用于读取小文件。该命令还有像文件中写入内容的功能。
基本用法:
cat [OPTION]... [FILE]...
常用选项:
-n: 显示行号
-A: 显示文件中的所有字符,包括回车符和TAB符
特殊用法:
## 使用cat命令向指定的文件中写入内容:
[root@localhost ~]# cat >> a.txt <<EOF
5.2 more命令
more - file perusal filter for crt viewing
,more
命令用来分页显示文件内容,适用于读取大文件的内容。
基本用法:
[root@localhost ~]# more anaconda-ks.cfg
翻页翻行功能:
空格键翻页;回车键一次滚动一行
more
命令的缺点在于,对于文件的内容只能向后查看。相对于more
命令,less
命令更加灵活。
5.3 less命令
less - opposite of more
,less
命令用来查看文件内容,相对于more
命令,由于less
命令能够反复的对文件内容进行查看,而被广泛利用,man手册中就使用的less
命令来查看命令使用手册。
基本用法:
[root@localhost ~]# less anaconda-ks.cfg
翻屏:
空格键: 向文件尾翻一屏;
b: 向文件首部翻一屏;
Ctrl+d: 向文件尾部翻半屏;
Ctrl+u: 向文件首部翻半屏;
回车键: 向文件尾部翻一行;
k: 向文件首部翻一行;
G: 跳转至最后一行;
#G: 跳转至指定行;
lG: 跳转至文件首部;
文本搜索:
/keyword: 从文件首部向文件尾部依次查找;
?keyword: 从文件尾部向文件首部依次查找;
n: 与查找命令方向相同;
N: 与查找命令方向相反;
退出:
q: quit
5.4 head命令
有时候用户只需要查看文件的首部几行或者尾部几行,那么head和tail命令就能派上用场。
head - output the first part of files
,显示指定文件的指定几行,默认显示文件的头10行。
基本用法:
[root@localhost ~]# head /etc/passwd
常用选项:
-n: 指定显示文件头n行
[root@localhost ~]# head -n 3 /etc/passwd
5.5 tail命令
tail - output the last part of files
,显示文件尾的任意行,默认显示倒数10行。
基本用法:
[root@localhost ~]# tail /etc/passwd
常用选项:
-n: 指定显示文件倒数n行
-f: 追踪显示文件末尾的内容(经常使用在对日志文件的监控)
[root@localhost ~]# tail -n 3 /etc/passwd
[root@localhost ~]# tail -n 3 -f /var/log/messages
6 文件下载命令
wget //文件下载
-O //指定下载地址。更改名称
-T //超时时间
-q //安静下载(不显示wget输出)
--spider //网络爬虫
curl //文件下载
curl –o http://www.baidu.com
yum install lrzsz
rz //文件上传
sz //文件下载
sz filename
7 命令查找命令
对于系统管理员来说,有时候需要在系统中查找一个文件,或者是查找一个命令以及该命令手册所在的位置,这样就能方便管理员的管理,那么在文件和命令的查找所用的命令有locate
, which
, whereis
, find
(后面详解),下面分别介绍这些命令的用法:
7.1 locate命令
locate - find files by name
,locate
命令通过文件名来查找文件。
基本用法:
[root@localhost ~]# locate /etc/p
locate
命令会查找指定目录下包含给出字符串开头的所有文件。locate /etc/p
就会查找/etc
目录下以p
开头的所有文件。
常用选项:
-i: 查找时忽略大小写
该命令的优点在于查找速度快,因为其存在一个数据库,每次查找命令在这个数据库中查找。但是,该命令查找不是实时查找,如果有一个新文件,但是数据库没有更新,那么通过locate
命令就查找不到,这也是其缺点所在,通过updatedb
命令更新locate
数据库。find
命令可以实时查询文件,但是在查找的效率上比不上locate
命令。
7.2 which命令
which - shows the full path of (shell) commands
,which
命令会显示当前shell下命令二进制文件所存的路径。只能查找系统PATH
变量中所包含的目录下的命令(绝对路径)。
基本用法:
[root@localhost ~]# which locate
7.3 whereis命令
whereis - locate the binary, source, and manual page files for a command
,whereis
命令显示定位某个命令的二进制文件、源码以及该命令手册文件的路径。非PATH
变量查找,所以查找的范围比which
要广。
基本用法:
[root@localhost ~]# whereis ls
常用选项:
-b 仅查找二进制文件
-m 仅查找命令手册文件
-s 仅查找源文件
8 字符处理命令
对文本文件进行处理时,有时候需要对文件中的一些字符进行处理,比如说按照某个字段对文件中内容进行排序、或者是统计文件中内容重复的行数等操作,那么和这些操作相关的命令就是字符处理命令。
8.1 sort命令
sort - sort lines of text files
,对文本文件中的每一行进行排序。
基本用法:
[root@localhost ~]# sort /etc/passwd
不加任何选项的sort命令,默认以文件中的第一个字段以及空格为分隔符进行排序。
常用选项:
-r: 倒序
-n: 按数字排序
-t: 指定分隔符(默认为空格)
-k: 指定第几列,指定第几列第几个字符(指定1,1 3.1,3.3)
sort
的用法示例1:
- 首先创建一个文件
[root@localhost ~]# cat >> sort.txt <<EOF
> b:3
> c:2
> a:4
> e:5
> d:1
> f:11
> EOF
- 对sort.txt文件进行排序
[root@localhost ~]# sort sort.txt ## sort默认从小到大排序。
a:4
b:3
c:2
d:1
e:5
f:11
- 按照数字对sort.txt文件中的行进行排序
[root@localhost ~]# sort -t ":" -k2 sort.txt
d:1
f:11
c:2
b:3
a:4
e:5
看到输出的内容,可能有一个疑问,为什么第二行的是11,这一行不应该是排在最后一行的吗?上面使用的命令只会看到第一个字符,11的第一个字符是1,按照字符的排序确实比2小。如果想要按照数字的形式进行排序,需要使用-n选项。
[root@localhost ~]# sort -t ":" -n -k2 sort.txt
d:1
c:2
b:3
a:4
e:5
f:11
## 按照第二列的数字对sort.txt文件进行逆序排序。
[root@localhost ~]# sort -t: -k2nr sort.txt
f:11
e:5
a:4
b:3
c:2
d:1
sort
用法示例2:
- 创建如下文件:
[root@localhost ~]# cat >> test.txt <<EOF
> 192.168.3.1
> 192.168.3.2
> 192.168.3.3
> 192.168.2.20
> 192.168.2.21
> 192.168.2.22
> 192.168.0.151
> 192.168.0.152
> 192.168.0.153
> 192.168.1.10
> 192.168.1.11
> 192.168.1.12
> 192.168.1.1
> 192.168.2.2
> 192.168.3.3
> 192.168.2.20
> 192.168.1.21
> 192.168.2.22
> 192.168.0.151
> 192.168.1.152
> 192.168.0.153
> 192.168.3.10
> 192.168.1.11
> 192.168.3.12
> EOF
- 针对第三列的第一个字符,第四列的第一个字符到第三个字符排序
[root@localhost ~]# sort -t. -k3.1,3.1n -k4.1,4.3n test.txt
192.168.0.151
192.168.0.151
192.168.0.152
192.168.0.153
192.168.0.153
192.168.1.1
192.168.1.10
192.168.1.11
192.168.1.11
192.168.1.12
192.168.1.21
192.168.1.152
192.168.2.2
192.168.2.20
192.168.2.20
192.168.2.21
192.168.2.22
192.168.2.22
192.168.3.1
192.168.3.2
192.168.3.3
192.168.3.3
192.168.3.10
192.168.3.12
8.2 uniq命令
uniq - report or omit repeated lines
,如果文件中有多行完全相同的内容,当然是希望能删除重复的行,同时还可以统计出完全相同的行出现的总次数,那么就可以使用uniq
命令解决这个文件(但是必须配合sort命令使用)。
基本用法:
[root@localhost ~]# cat uniq.txt | sort | uniq
uniq
命令需要结合sort
命令一起使用,先使用sort
进行排序,让文中重复的内容连续出现在一起,然后再去重。
常用选项:
-c: 计算重复的行出现的次数
[root@localhost ~]# cat uniq.txt | sort | uniq -c
8.3 cut命令
cut - remove sections from each line of files
,cut
命令用来截取文件中每一行的指定字段。
常用选项:
-d: 指定分隔符
-f: 数字,取第几列,比如-f3,6 取第三列和第六列
-c: 按字符取(空格也算)
cut
命令使用案例:
## 过滤出文件里server以及552408925。
[root@localhost ~]# cut -d" " -f2,6 server.com
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。