Linux学习笔记
A 概念
一 linux 终端
linux 终端也称为虚拟控制台,是 linux 从 UNIX 集成来的标准特性。显示器和键盘合称为终端,因为他们可以对系统进行控制所以又称为控制台。通常情况下, linux 默认开启6个虚拟终端。如果默认启动界面选择了图形界面,类似于 windows 桌面系统,那么X Window 在第1个虚拟终端上。
二 shell
shell 是一个命令解释器,它可以用来启动、挂起、停止程序,还允许用户编写由 shell 命令组成的程序。
1 shell 种类
shell 有多种不同的版本,在 linux 的 /etc 目录下的 shells 文件中列出了系统可以接受的 shell 以及他们的命令。
cat /etc/shells # 列举系统可以接受的 shell
chsh -l
其中,“/bin/nologin“ 并不是一种 shell,它是作为被禁用用户 shell 的替代物(不用 shell 的用户所用的),用来显示账号不可用信息。
ls -al /bin/sh # 显示 shell 的详细信息
bash 是指 GUN 的 Bounre Again shell,是 GNU 操作系统上默认的 shell.
系统变量 $ SHELL 记录系统当前正在使用的 shell。
echo $ SHELL # 查看系统当前正在使用的 shell
linux 系统默认的 bash 是对 ksh 和 ash 的改进,增加和增强了许多特性,还包含了许多其他 shell 的特点,具有灵活和强大的编程接口,同时又有很好的用户界面
2 shell 命令的基本格式
shell 命令解释程序包含了一些内置命令,由 shell 自身执行。除了内置命令,还有一部分独立的程序实现的命令,用于对 linux 功能进行扩展,成为外置命令,由 shell 调用这些程序执行命令,例如命名 vi 是 vi 编辑器软件对应的命令,是外置命令。
bash 有40多个内置命令,最多可以有12个命令行参数,同时支持对命令行进行编辑。
命令名 [选项] <参数1> <参数2>...
方括号代表可选。命令可能具有0个或多个参数。
[选项] 是对命令的特别定义,可以理解为更具体的告诉命令做什么。以 “-” 开始的选项通常只有一个字母,多个选项可以用一个 "-" 连接起来。比如 "ls -a-l" 和 "ls -al"是相同的。有的选项以 “--” 开头,这些选项通常是一个单词,比如 --number,很多 "--" 格式的选项都有用 “-” 加上第一个字母的简写形式。
在命令、选项和参数之间用空格或制表符(tab)隔开。连续的空格被 shell 解释为一个空格。
3 使用命令的基本方法
输入命令,然后回车执行命令。命令完成后会返回到提示符状态。如果没有此命令,会提示 "bash:....:command not found"
linux 命令是严格区分大小写的,同一个单词大写和小写作为不同的命令。
可以用 ";" 将两个命令隔开,从而可以在一行中输入多个命令,按回车后 shell 将依次执行这些命令。
shell 到达行位时会自动换行,可以使用反斜杠 "" 或者分号 ";"在多个命令行上输入很长的单个命令或者多个命令。
4 命令自动补齐与历史记录
命令、目录名或者文件名的一个或几个字母时,按下 tab 键,shell 会在相关的目录下自动查找匹配的项,自动补全命令、目录名或者文件名。如果一次 tab 出不来就按两次。用自动补全可以提高效率。
5 shell 提示符
"#" 符号结尾的命令提示符,表明该 shell 的用户是 root 用户。
"$" 符号结尾的命令提示符,表明是 root 以外的用户。
默认的其他提示符:[登录用户名 @ 主机名 当前目录]
"~" 表示当前目录是该用户的主目录。
可以定制 shell 的提示符,以显示系统信息或正在进行的工作。 可以参考文档 Bash Prompt HOWTO,或者 bash 自己的帮助文档。
6 输入输出重定向
shell 命令是控制台命令,使用标准输入输出设备,即从键盘接受输入,将结果显示在显示器上。可以将 shell 命令的输入输出重定向到其他文件或设备。
X # 某一个命令
X < file # < 输入重定向符。 X 命令在执行过程中需要从控制台输入数据,该命令可从文件 file 中读取数据。
x > file # > 输出重定向符。 X 命令的输出结果写入文件 file 中,如果file中原来有数据,则将原有数据清除。
x >> file # >> 不清除 file 文件中的原有内容,而是将新数据附加在原数据之后。
ls -l > lsresult # 控制台不显示目录信息。会将信息存储到 lsresult 中
7 管道
在 linux 系统中,管道是一种先进先出的单向数据通道。利用管道符号 "|",可以将多个命令组合到一起,把前一个命令的结果当做下一个命令的输入,最终得到多个命令依次处理的结果。
ls 查看当前文件目录
grep 检索数据中符合匹配条件的文本。
三 文件与目录的概念
1 文件
文件是 linux 系统用来存储信息的基本结构,它是被命名的存储在某种介质上的一组信息的集合。linux 文件均为无结构的字符流形式。文件名是文件的标识,它有字母、数字、下划线和句点组成的字符串构成。linux 要求文件名的长度不超多 255 个字符,用户应该选择具有意义的文件名以便于记忆。
linux 系统中有三种基本类型的文件:普通文件、目录文件和设备文件。
- 普通文件
- 文本文件。 以文本的 ASCII 码的形式存储在计算机中。它是以 “行” 为基本结构的一种信息和存储方式。
- 二进制文件。以文本的二进制形式存储在计算机中,用户一般不能直接读懂他们,只有通过相应的软件才能将其显示出来。常见的可执行程序、图形、图像、声音等文件都是二进制文件。
- 目录文件
- 目录用于管理和组织系统中的大量文件。在 linux 系统中,目录以文件的形式存在,目录文件存储了一组相关文件的位置、大小等与文件有关的信息。简称为目录。
- 设备文件
- linux 把每一个 I/O 设备都堪称一个文件,与普通文件一样处理,这样可以使文件与设备的操作尽可能统一。
2 目录
linux 目录将所有文件的说明信息采用树形结构组织起来。整个文件系统有一个根,根上再分叉,叉上再分叉,叉上也可以长叶子。根和叉统称为目录或文件夹。而叶子则是一个个的文件。事件证明。此种结构的文件系统效率比较高。
以根目录 '/' 为起点,所有其他目录都由根目录派生而来。用户可以浏览整个系统,可以进入任何一个授权进入的目录。
实际上,各个目录结构之下都会有一些文件和子目录。系统在建立每一个目录时,都会为它设定两个目录文件,一个是 '.',代表该目录自己。另一个是 '..',代表该目录的父目录。对于根目录,'.' 和 '..' 都代表其自己。
用户可以创建文件或目录,可以移动或复制文件或目录,可以和系统中的其他用户共享目录和文件。用户可以很方便地从一个目录切换到另一个目录,还可以设置目录和文件的权限。
根目录是 linux 系统的特殊目录,操作系统本身的驻留程序存放在以根目录开始的专用目录中,有时称为系统目录。上图根目录下的目录就是系统目录。
3 工作目录、用户主目录和路径
- 工作目录与用户主目录。
- 工作目录。用户登录 linux 系统后,所在的目录被为“工作目录”或“当前目录”。工作目录是可以随时改变的。工作目录用“.”表示,其父目录用“..”表示。
- 用户主目录。是系统管理员在增加该用户时为该用户建立起来的目录,每个用户都由自己的主目录。默认情况下用户主目录是/home目录下与用户名相同的目录。不同用户的主目录一般不会相同,也可以改变用户的主目录。用户刚登录系统时,默认是在用户主目录下。用户可以通过 "~" 字符来引用自己的主目录。
- 路径
- 路径指从树形结构中的某个目录到某个文件的一条道路。此路径的主要构成是目录名称,中间用“/”分开。路径分为绝对路径和相对路径。
- 绝对路径。从根目录开始的路径,也称为完全路径。
- 相对路径。从用户工作目录开始的路径。
- 路径指从树形结构中的某个目录到某个文件的一条道路。此路径的主要构成是目录名称,中间用“/”分开。路径分为绝对路径和相对路径。
- 通配符
- linux 允许使用特殊字符(通配符)来引用多个文件名。常用的有 "*"、"?"、"["、"]" 和 "-" 组成的字符组模式。
- 通配符 "*"。 匹配文件中的任意字符或字符串。但不是与句点开头的文件匹配。因为他们是隐藏文件。
- 通配符 "?"。匹配任意一个字符。
- 字符组模式 ”[]“。 匹配字符组中的任意一个。其中 "-" 用于表示范围。当 "-" 处于方括号外面或者 "*"、"?" 处于方括号内时,将失去通配符的作用。
- 转义字符。如果希望通配符失去其本身的作用,则需要使用转义字符 ”\“,让他们变成普通字符。
- linux 允许使用特殊字符(通配符)来引用多个文件名。常用的有 "*"、"?"、"["、"]" 和 "-" 组成的字符组模式。
4 文件与目录的基本操作。
4.1 显示文件的命令
1 文件查看和连续命令 cat
cat [选项] <file1> ...
# 把文件串接后显示在标准输出上
主要选项的含义
- -n 或 --number: 由1开始对所有输出的行数进行编号。
- -b 或 --number-nonblank:和 -n 相似。只不过对空白行不编号。
- -s 或 --squeeze-blank:当遇到有两行以上的空白行时,就替换为一行的空白行。
- -v 或 --show-nonprinting:? 显示不可打印的字符。
2 分屏显示命令 more
more [选项] <file> ...
# 类似于 cat,可将文件显示在屏幕上,但是它每次只显示以页,一页即为当前虚拟终端的一屏大小。显示文件时,按空格键可以显示下一页,按 q 可退出。h 给出帮助信息。还具有搜索字符串的功能。
主要选项的含义
- -<num>: 指定屏幕显示的行数为 num 行
- -f:计算行数时。计算的时实际的行数而非自动换行后的行数
- -s:遇到连续两行以上的空白,合并成一行
- +/<string>:在文件中搜寻字符串 string。然后显示字符串所在页的内容
- +<num> 从第 num 行开始
3 按页显示命令 less
less [选项] <file> ...
# 类似于 more。不同的是 less 允许使用者往回卷动以浏览看过的地方,同时 less 并不是一开始就读入整个文件,因此在遇见大型文件时,会比较快。
主要选项的含义
- -i: 在查找时忽略大小写
- -p<string>:查找指定的字符串,并从符合条件的地方开始显示。
4.2 复制、删除和移动命令
1. 复制命令 cp
cp [选项] <source> <dest>
或者 cp [选项] <source> ... <directory>
# 将一个文件拷贝至另一个文件,或一个或多个文件拷贝至另一个目录。
主要选项的含义
- -r:若 source 中含有目录,则递归地将目录下的文件也依序拷贝至另一个目录。深拷贝。
- -f:若目的地存在同名的文件,则在复制前先将其删除再进行复制。
- -a:尽可能将文件模式、所有者、时间标签、链接等信息按照原状予以复制,并且递归地复制子目录中的文件。
2. 删除命令 rm
rm [选项] <name> ...
# 逐个删除指定的文件或目录。默认情况下,<name> 为文件名,rm 命令不删除目录,只有指定 -d 选项才能删除指定的目录。
主要选项的含义:
- -i: 删除前逐一询问确认
- -f: 强制删除,即使原文件属性为只读,也直接删除而无需确认
- -r: 递归地删除目录下的内容。深度删除。
3. 移动或重命名命令 mv
mv [选项] <source> <dest>
或 mv [选项] <source> ... <directory>
# 将一个文件重命名为另一个文件,或将数个文件移至另一个目录。
主要选项含义如下
- -i : 若目的地已有同名文件,则先询问是否覆盖原文件。
- -f : 强制移动,如果目的地有同名文件,则覆盖原文件
4.3 创建和删除目录命令
1 创建目录命令 mkdir
mkdir [-p] <dirName> ...
# 如果指定目录不存在,则建立之。
# -p 表示,若要建立的目录的上层目录尚未建立,则一并建立上层目录。
在 aaa 文件夹下创建 bbb。-p 表示如果没有 aaa,则先创建 aaa,再建立 bbb。
2 删除目录命令 rmdir
rmdir [-p] <dirName>
# 删除空目录 dirName,如果目录 dirName 非空,则会出现报错信息。
# -p 表示,删除底层目录后,如果他的上层目录也变成空目录,则将其一并删除。
4.4 切换工作目录和显示目录命令
1 切换工作目录命令 cd
cd <dirName>
# dirName 可以用绝对路径或者相对路径来表示
cd || cd ~
# 切换至当前用户的主目录
cd ../..
# 切换到当前目录的上上层目录
cd /
# 切换到根目录
2 显示当前路径命令 pwd
pwd
# 显示用户当前所在的目录
3 查看目录命令 ls
ls [选项] [<name>...]
# 列出文件或者目录的信息。 name 是文件或者目录名,默认情况下列出当前工作目录的信息。如果给定文件或者目录名则列出指定文件或者目录。
主要选项的含义:
- -a: 显示所有文件及目录。ls 默认将 " . " 开头的文件和目录进行隐藏,不会显示。
- -d: ,如果 name 参数是一个目录。不加 -d 默认是展示该目录下的文件。加上之后仅显示目录的名字。-d 和 -l 选项一起使用,可以列出目录的属性信息。
- -l:使用长格式、除文件名外,还显示文件的类型、权限、硬链接的个数、所有者名、群组名、文件大小(字节为单位)、修改时间等详细信息;如果列表是目录,则在最前面给出 "总用量..." 表示该目录占用的总块数(1块 = 1034字节)
- -r: 将文件以相反顺序显示,默认情况下按文件或目录名的英文字母顺序显示。
- -t: 将文件依修改时间排序,新的排在前面。
- -A : 同 -a,但不列出 “ . ” 以及 " .. "文件。
- -F : 在列出的文件名后以符号表示文件的类型。
- 一般文件之后不加符号
- 可执行文件加 " + "
- 目录加 " / "
- 符号链接加 " @ "
- 管道加 " | "
- 套接字加 " = "
- -R : 若目录下有文件,则递归地列出目录下的文件。
概念补充
1 关于 linux 文件权限中的属主、与属主同一组的用户、其他用户的概念
- 属主。我买了一台电脑,我是电脑所有者。我就是属主。
- 组用户。我可以把的电脑中的文档进行共享。将我的读者加入一个用户组。
- 其他用户。路人甲。既不是我,也不是组用户的人。
举例说明:
- 某文件权限为7,则代表可读、可写、可执行(4+2+1)
- 某文件权限为6,则代表可读、可写(4+2)
- 某文件权限为5,则代表可读、可执行(4+1)
- 某文件权限为3,则代表可写、可执行(2+1)
- 某文件权限为2,则代表可写(2)
- 某文件权限为1,则代表可执行(1)
-l 选项详解:
ls -l my-exercise/
drwxr-xr-x 4 root root 4096 11月 13 00:17 node-app
第一段权限相关解释
- d: 第 1 位。表示文件类型。
- d 目录文件
- l 链接文件
- - 普通文件
- p 管道。具体概念?
- rwx: 第 2-4 位。表示文件的属主拥有的权限。r 是读,w 是写,x 是执行。这里表示属主同时拥有读写和执行的权限。
- r-x: 第 5-7 位。表示文件属主所在同一个组的用户所具有的权限。
- r-x: 第 9-10 位。表示其他用户所具有的权限。
所有字段的解释
- 第一段 : 相关文件的类型和权限相关展示
- 第二段 : 文件硬链接数或目录子目录数
- 第三段 : 文件拥有者
- 第四段 : 文件拥有者所在的组
- 第五段 : 文件大小(以字节为单位)
- 第六段 : 文件创建的月份
- 第七段 : 文件创建的日期
- 第八段 : 文件创建的时间
- 第九段 : 文件名 (如果是一个符号链接,那么会有一个 “->”箭头符号,后面根一个它指向的文件)
常用shell
ls -ld a # 显示 a 文件的具体信息
ls -lt s* # 列出当前目录下以 s 开头的文件的详细信息。新的在前面
ls -lR /bin # 将 bin 目录下的所有目录以及文件的详细信息列出
ls -AF # 列出当前目录下所有文件及目录。并在文件末尾展示文件的类型。
5 查找与定位命令
5.1 查找文件或者目录命令 find
find 命令按照用户指定的条件,从指定的目录开始检索,找到所有满足匹配准则的文件。指定的条件可以是文件名、文件大小或者文件修改日期等。
find [path...] [expression]
# 从 path 开始查找文件,将符合 expression 规定的文件列出来。
dd在 " - " 、 "("、")"、"," 或者 "!" 开始的参数作为 expression 参数,在这之前的参数都被认为是要搜索的路径。
# 如果不给路径,则使用当前工作目录
# 如果不给出 expression。则使用 "-print" 作为默认的 expression
expression 常用选项说明
- -cmin
: 早过去 n 分钟被修改过 - -empty : 内容为空的文件
- -name
: 文件名称符合 name 的文件 - -iname
: 忽略大小写查找 - -size <n 单位> : 文件大小是 n 个单位。
- b: 512 位的区块
- k: kilobytes
- w: 两个字节组成的字
- -type : 文件类型。d、c、b、p、f、l、s 之一。
# 查找当前目录下名为 1.txt 的文件
find . -name 1.txt
# 查找当前目录下 20 分钟之内被改过的文件
find . -cmin -20
# 查找当前目录下的目录文件
find . -type d
# 查找当前目录下大小不超过 2KB 的文件
find . -size -2k
5.2 文件定位命令 locate
locate [选项] <search string>
locate 可以快速地搜寻系统内是否有满足查询条件的文件。其工作原理是:先建立一个包括系统内所有文件名称以及路径的数据库,之后当寻找文件时就只需查询这个数据库,而不必实际深入文件系统了。它还存储文件的访问权限以及所有者信息,从而保证用户不能看到他们无权访问的文件。
数据库的创建可以在 crotab 中自动执行。
todo 具体命令暂不研究。
5.3 文件内容检索命令 grep
find 和 locate 都是根据文件名或者文件属性查找文件,而 grep 命令则可以检索文件的内容,找到文件中满足匹配模式的文本行。
grep [选项] <string> <file> ...
# string 是准备检索的字符串或者正则表达式。file 是准备从中检索的文件。
主要选项的含义:
- -i : 表示进行比较时忽略大小写。
- -n : 在所显示的结果中给出文本行在文件中的行号。
- -v : 取反。表示检索不包含给定字符或者模式的所有文本行。
6 链接命令 ln
链接分为两种,硬链接和软连接。硬链接必须在同一个文件系统中,软链接可以跨越不同的文件系统,并且可以对目录创建链接。不论是硬链接还是软链接都不会将原本的文件复制一份,因而只会占用非常少量的磁盘空间。
- 硬链接:一个文件是另一个文件的别名,他们不可区分。可以理解为指针,两个不同的指针指向的是同一处内存空间。即硬链接指向的是系统中的同一份文件,同一个区块。
- 软链接(符号链接): 是一个特殊的文件,内容不是真正的数据,而是指向另一个文件的路径名,存的是所指向文件的绝对路径。访问软链接文件时,实际访问的文件会被系统替换为软链接所代表的绝对路径。类似于 winodws 的快捷方式或 osx 系统的替身的概念。
ln [选项] <source> <dest>
# 该命令产生一个从 dest 到 source 的链接。
主要选项的含义:
- -f : 链接时先将与 dest 同名的文件删除
- -i : 在删除与 dest 同名的文件时先进行询问
- -s : 创建软链接。默认创建硬链接
7 创建文件、改变文件或目录时间的命令 touch
touch [选项] <file1> [file2 ...]
# 修改指定文件的访问时间和修改时间记录,默认修改为当前时间。如果指定文件不存在则创建该文件。
主要选项的含义
- -a : 只改变文件的访问时间记录
- -m : 只改变文件的修改时间记录
- -c : 如果指定的文件不存在,不会建立新的文件。与 --no-create 的效果一样。
- --no-create: 与 -c 含义一致
- -t
: 设定文件的时间记录
# 将 file 文件的时间记录改为现在的时间。若文件不存在,则新建一个文件
touch file
# 修改 file 文件的时间记录
touch -t 1505061803 file