文件和目录
创建、删除、拷贝、移动和重命名
创建
1
2
3
4
5$ touch filename # 创建空文件
$ mkdir dirname # 创建目录
$ mkdir -m 700 dirname # 创建目录并指定权限
$ mkdir -p outerdir/innerdir # 递归创建目录注:如果要创建的文件已存在,
touch
不会创建新的空文件,也不会创建一个文件而覆盖原来的文件,而仅仅是刷新已存在文件的最后修改时间(时间戳)。删除
1
2
3
4
5
6$ rmdir dirname # 删除空目录
$ rmdir -p outerdir/innerdir # 递归删除空目录
$ rm filename # 删除文件
$ rm -r dirname # 删除目录及其下的文件和目录
$ rm -rf dirname # 删除目录及其下的文件和目录,且没有提示注:
rmdir
只能删除空目录,而rm
可以删除非空的目录。拷贝
拷贝文件和目录使用
cp
命令。基本用法:1
2
3$ cp file1 file2 target_dir # 将 file1 和 file2 拷贝到目标目录
$ cp file target_dir/new_filename # 将 file 拷贝到目标目录并重命名
$ cp -r dir target_dir # 拷贝目录到目标目录cp
命令的其他常用参数:-p
:如果某用户 user1 去拷贝其他用户的文件,新文件的所属用户和用户组都会变成 user1。若加-p
参数,可以原封不动地拷贝。-f
:当目标位置有同名文件时,系统会询问是否覆盖,加上-f
可以跳过询问,直接覆盖。
移动和重命名
移动文件和目录使用
mv
命令。基本用法:1
2$ mv file1 dir1 target_dir # 将 file1 和 dir1 移动到目标目录
$ mv file target_dir/new_filename # 将 file 移动到目标目录并重命名- 使用
mv
在移动目录时不需要像cp
命令一样加上-r
参数。 mv
命令也有一个-f
参数,作用与cp
的-f
参数相同。- linux 中没有提供专门的重命名命令,可以用
mv
命令重命名文件和目录。即mv old_filename new_filename
- 使用
文件与目录的权限
查看文件内容
cat
:将文件内容全部输出到终端上。用法:1
$ cat filename
使用
cat
时,如果输出的文件较大,内容超出终端的缓冲区,前面的内容就看不到了,所以cat
一般用于查看小文件。head
和tail
:将文件的 头/尾 输出到终端上,常用于查看日志文件,因为日志文件的更新内容就是在头或尾,而且日志文件通常会非常大,无法使用cat
或文本编辑器查看。1
2$ head filename # 显示文件的前 10 行
$ head -20 filename # 显示文件的前 20 行tail
用法与head
类似。less
和more
:相当于只读编辑器,只能查看文件内容而不能修改。less
功能比more
稍强,所以一般使用less
。1
$ less filename
less
移动光标、翻页、查找字符串等操作都与vim
相同。
文件链接
硬链接与符号链接
创建链接文件
创建硬链接
1
$ ln 文件名 链接文件名
创建符号连接
1
$ ln -s 文件名 链接文件名
打包和压缩文件
使用 tar 打包文件
tar
:tape archive(磁盘档案卷,因为最初是为了将文件打包在磁带上,所以叫此名)
由于 tar
命令的历史很久远,所以它的参数的配置方式和其他命令有一些不同。
常见使用方法:
打包文件和目录
1
$ tar -cf archived_file.tar file1 dir1 # 将 file1 和 dir1 打包成 archived_file.tar
-c
代表创建打包文件(create);-f
后必须紧跟打包文件名(filename),所以上面的命令不能写成tar -fc
。- 注:打包后的文件是一个新文件,源文件不会被替换。打包后的文件大小大于被打包文件的大小的总和,因为打包时
tar
命令会添加一些额外的信息。 - 打包和解包文件时若加
-v
参数,会显示打包或解包过程的详细信息。
解包文件
1
2$ tar -xf archived_file.tar # 将 archived_file.tar 解包
$ tar -xf archived_file.tar -C target_dir # 将 archived_file.tar 解包到指定目录其他常用操作
1
2
3
4$ tar -tf archived_file.tar # 列出 archived_file.tar 中的文件
$ tar -f archived_file.tar --delete filename # 删除 archived_file.tar 中的某个文件
$ tar -f archived_file.tar -r filename # 向 archived_file.tar 中添加文件
$ tar -f archived_file1.tar -A archived_file2.tar # 将 archived_file2.tar 的内容追加到 archived_file1.tar
使用 gzip 和 bzip2 压缩文件
gzip
是 linux 中最常用的压缩命令。
1 | $ gzip file1 file2 # 将 file1 和 file2 分别压缩为 file1.gz 和 file2.gz,并替换源文件 |
- 使用
-1
~-9
参数可以指定压缩比率,数字越大,压缩程度越高,压缩越慢,压缩后文件越小。若不指定压缩比率,则默认为6
。 gzip
只有压缩功能,不提供打包功能,所以gzip
的操作对象只能是某个文件,即使使用-r
参数,也只是递归地将指定目录中的所有文件单独压缩,并不会连接在一起。bzip2
的用法与gzip
基本相同,只是采用了不同的压缩算法。
使用 tar 打包并压缩文件
tar
命令提供了一个 -z
参数,可以在打包文件的同时调用 gzip
命令来压缩,产生一个 .tar.gz
文件,相当于先使用 tar
打包,再用 gzip
压缩。
1 | $ tar -czf file.tar.gz file1 dir1 # 将 file1 和 dir1 打包并压缩成 file.tar.gz |
与
-z
参数类似的还有-j
和-J
参数。如果将上面的
-z
参数换成-j
参数,则使用bzip2
压缩,压缩后的文件后缀约定为.tar.bz2
;如果换成
-J
参数,则使用xz
压缩,压缩后的文件后缀约定为.tar.xz
。使用
tar
打包并压缩时,压缩过程的压缩比率为默认值,即6
。
各种压缩格式对比
压缩速度:zip
> tar.gz
> tar.bz2
> rar
> tar.xz
压缩比率:zip
< tar.gz
< tar.bz2
< rar
< tar.xz
除了这个格式外,常见的压缩格式还有 .7z
,对应的压缩工具是 7z
,由于 7z
与 xz
采用了相同的压缩算法,所以压缩后的文件大小基本相同。
zutils 工具包
若想不解压文件而对压缩文件进行某些操作,可以使用 zutils 工具包中的命令。
zcat
:将压缩文件的内容显示在终端上(与 cat
命令类似,只不过操作对象是压缩文件)
zgrep
:与 grep
命令类似,只不过操作对象是压缩文件。
注意:zutils 工具包中的工具只适用于被压缩成 zip
或 gz
格式的单个文本文件。
zutils
主要针对 gz
格式文件,类似的还有 bzip2
提供的 bzutils
工具包和 xz
提供的 xzutils
。
查找文件
查找文件通常使用两个命令:locate
和 find
。
locate 命令
1 | $ locate 关键词 |
locate
命令后跟一个关键词,只要路径中包含此关键词的文件都会被查出来(模糊查询)。locate
命令实际上只是在/var/lib/mlocate/mlocate.db
这个数据库中查(这个数据库记录了整个系统上所有文件和目录的路径信息),所以速度很快。但有些新产生的文件可能查不到,因为这个数据库默认每天才更新一次。系统管理员可以使用updatedb
命令手动更新该数据库。
find 命令
find
命令是 Linux 上的主要查找命令,功能比 locate
强大的多。它直接在硬盘上查找文件,所以精度高,但速度慢。
基本用法:
1 | $ find 要查找的目录 查找条件1 查找条件2 ... |
常用查找条件:
1 | -name filename # 指定文件或目录名。注意:find 是精确查询,如果要模糊查询,可以使用通配符。 |
-mmin
用法和含义与-mtime
相似,只是将 “天” 换成 “分钟”。-atime
和-amin
用法也相似,只是将 “内容发生过改动” 换成 “文件被读取/执行过”。-ctime
和-cmin
用法也相似,只是将 “内容发生过改动” 换成 “文件属性被修改过”。
文件编码
常见的编码方式:
- UTF-8:Unicode 的一种实现,可以表示世界上的所有文字。
- GB2312:ISO-8859-1 的一种,国内常用,只能表示简体中文和英文。
- BIG5:ISO-8859-1 的一种,台湾常用,只能表示繁体中文和英文。
Linux 下的乱码问题一般与下列因素有关:
- 系统默认支持的语系:与 ``/etc/sysconfig/i18n` 有关。
- 终端(如 bash)的语系:与
LANG
这个环境变量有关。 - 打开的文件乱码:主要与文件编码和软件的默认编码有关,如果打开文件的软件默认编码与文件编码不同,则会出现乱码。
使用 iconv
命令修改文件的编码方式:
1 | $ iconv -f 原编码 -t 新编码 文件名 [-o newfilename] |
由于 UTF-8 中也包含繁体字,所以如果直接将 BIG5 编码的繁体字转换为 UTF-8,仍然是繁体字。可以先将 BIG5 转换为 GB2312,再转换成 UTF-8,这样可以将 BIG5 编码的繁体字转换为 UTF-8 编码的简体字:
1 | $ iconv -f big5 -t gb2312 filename | iconv -f gb2312 -t utf8 -o newfilename |
行尾结束符
不同操作系统,文本文件的行尾结束符是有区别的:
操作系统 | 转义字符 | 英文缩写 | 英文名 | 中文名 | vim 中显示 |
---|---|---|---|---|---|
Windows | \r\n |
CRLF | carriage return line feed | 回车换行 | ^M$ |
Unix / Linux | \n |
LF | line feed | 换行 | $ |
Mac | \r |
CR | carriage return | 回车 | ^M |
转换行尾结束符:
1 | # CRLF --> LF |
-k
:不改变源文件时间戳- 如果不加
-n
选项,会原地转换;如果加了-n
,源文件不会改变,转换后的内容被写入 newfile 中。
拓展:回车与换行的区别与来历
Linux 目录树的结构
用户与用户组
vim 文本编辑器
四种模式
一般模式,插入模式,命令行模式,可视模式。
- 一般模式下:
- 插入、替换:
i
:在光标所在字符前插入内容。a
:在光标所在字符后插入内容。I
:在行首插入内容。A
:在行尾插入内容。o
:在光标所在行下一行插入内容。O
:在光标所在上一行插入内容。r
:按下后再按一个字符,将光标所在处原来的字符替换为这个字符。R
:进入替换模式。
- 删除:
x
:删除光标所在字符。nx
:从光标所在字符算起,向后删除 n 个字符。dd
:删除光标所在行。ndd
:从光标所在行算起,向下删除 n 行。D
/d$
:删除光标所在位置至行尾的所有字符。d^
:删除光标所在位置至行首的所有字符。J
:删除光标所在行的换行符。.
:重复上一次删除操作。
- 复制、粘贴:
yy
:复制光标所在行。nyy
:从光标所在行算起,向下复制 n 行。p
:在光标所在行的下一行粘贴内容。P
:在光标所在行的上一行粘贴内容。.
:重复上一次粘贴操作。
- 撤销、重做:
u
:撤销一次编辑。Ctrl
+r
:撤销一次撤销操作。
- 定位:
h
/j
/k
/l
:光标向 左/下/上/右 方向移动一位。nh
/nj
/nk
/nl
:光标向 左/下/上/右 方向移动 n 位。gg
:光标移动到文件首行行首。G
:光标移动到文件尾行行首。0
/^
:光标移动到当前行首。$
:光标移动到当前行尾。nG
:光标移动到第 n 行行首。n$
:光标下移 n 行,并定位到行尾。n[Enter]
:n 为数字,光标向下移动 n 行。
- 查找字符串:
/words
:查找 words,按n
查找下一个,N
查找上一个。?words
:查找 words,按n
查找上一个,N
查找下一个。
- 翻页:
Ctrl+f
:向下翻页。Ctrl+b
:向上翻页。
- 插入、替换:
- 插入模式下:按
[ESC]
退出到一般模式。 - 一般模式下输入
:
进入命令行模式。命令行模式下:w
:将修改写入文件。q
:退出 vim。wq
:写入并退出。w!
:文件没有写权限,但当前用户可以修改文件时,可以用该命令强制写入。wq!
:强制写入并退出。q!
:放弃修改并退出,!
告诉 vim 无需保存。e!
:撤销全部操作。w 文件名
:将文件另存为。w! 文件名
:将文件另存为,若已存在,则强行覆盖。!
:暂时退出,按任意键回来继续编辑。数字
:光标移动到第 n 行行首。/words
、?words
:查找字符串。用法与一般模式下的相同。1,20s/words1/words2/gc
:将 1~20 行的 words1 替换为 words2。s
和g
是替换命令,加c
表示由用户一个一个决定要不要替换,不加c
则直接替换。行数可以是数字,也可以是$
,$
表示末行。r 文件名
:读取指定文件,将其内容插入到当前文件光标所在行的后面。
- 可视模式:
- 分为 可视模式,可视行模式,可视块模式。
- 可视模式:一般模式下按
v
进入,可选择字符。 - 可视行模式:一般模式下按
V
进入,可选择块。 - 可视块模式:一般模式下按
Ctrl
+v
进入,可选择块。
- 可视模式:一般模式下按
- 可视模式常用操作:
- 大多数一般模式下的操作。
- 复制:
y
,粘贴:p
,删除:d
,插入:I
。 - 按
[ESC]
退出到一般模式。
- 分为 可视模式,可视行模式,可视块模式。
多文件编辑
同时打开多个文件:vim file1 file2
在命令行模式下输入 xn
切换到下 x 个文件,输入 xN
切换到上 x 个文件,输入 files
查看打开的文件的信息。
多窗口功能
进入 vim 后,命令行模式下输入 sp filename
分割窗口。没有 filename
则分割窗口并在新窗口中编辑当前文件,有 filename
则分割窗口并在新窗口中编辑指定文件。
按 Ctrl
+w
+j
光标移动到下一个窗口;按 Ctrl
+w
+k
光标移动到上一个窗口。
光标移动到想关闭的窗口,按 Ctrl
+w
+q
或 输入 :q
关闭窗口。
环境参数设置
命令行模式下:
set all
:查看所有环境参数。set nu
:显示行号。set nonu
:不显示行号。set autoindent
:与上一行自动对齐。set tabstop=4
:设置制表符宽度。set shiftwidth=4
:设置自动缩进的宽度。filetype indent on
:根据文件类型自动缩进。syntax on/off
:是否显示关键词颜色。set bg=dark/light
:设置色调样式。dark 和 light 是两种不同样式,默认为 light。set
:显示与默认值不同的设置值。set ruler
:显示右下角状态栏。set showmode
:显示左下角状态栏
如果在 vim 中输入上面的设置,这些设置只会在当前 vim 中有效,重启 vim 就无效了。
永久设置环境参数:将以上设置添加到 /etc/vimrc
或 ~/.vimrc
文件中。如果添加到 /etc/vimrc
中,所有用户都会拥有这些设置;如果添加到 ~/.vimrc
中,仅该家目录的拥有者拥有这些设置。
shell
事实上,Linux 只是一个操作系统内核(Kernel),Linux 内核加上一系列应用软件才构成了 Linux 发行版(如 Ubuntu,CentOS 等)。用户无法直接操作 kernel,而是通过 kernel 的 “外壳” 程序,也就是所谓的 shell 来与 kernel 进行沟通,这就是 kernel 与 shell 的形象命名关系。
系统中的 shell 都记录在 /etc/shells 文件中,该文件被系统用来在运行某些服务时查询用户可以使用的 shells。
用户登录后,系统会根据 /etc/passwd 文件选择 shell 供用户使用。
bash 基础
bash(Bourne Again SHell) 是 大多 Linux 系统所默认的 shell,所以 bash 是必须要学的。
常用内置命令
cd
:切换当前工作目录。alias
:为命令设置别名。type
:查看命令是内置命令、外部命令还是命令别名。1
2
3
4$ type command
# 若一个命令有多个属性,加上 -a 选项可以显示所有属性且按执行顺序排序,否则只显示最先执行的那个属性
$ type -a command
为命令设置别名
可以使用 alias
为命令设置别名,方便使用:
1 | $ alias ll='ls -l' |
取消别名:
1 | $ unalias ll |
显示当前已设置的所有别名:
1 | $ alias |
alias
设置的别名只在当前终端中有效,如果要永久设置,可以修改 ~/.bashrc 文件。
历史命令
使用过的所有命令都会记录在 ~/.bash_history 文件中,默认数量上限为 1000 个。
用户登录时,bash 会读取 ~/.bash_history 文件中的命令到内存,此后用户输入的命令也都会暂时存储在内存中,用户注销时,bash 又将内存中的命令都写入 ~/.bash_history 文件。
快速使用历史命令:
1 | $ !66 # 执行第 66 条命令 |
history
命令:
1 | $ history # 显示所有历史命令 |
命令执行的判断依据
1 | $ cmd1; cmd2 # 先执行 cmd1,再执行 cmd2 |
注:&&
、||
联用时没有优先级,只有从左到右的顺序。
通配符
*
:匹配任意长度字符串。?
:匹配任意一个字符。[]
:匹配方括号内的任意一个字符。例如:file[0-9].txt
可以匹配 file0.txt ~ file9.txtfile[0,5,a].txt
可以匹配 file0.txt,file5.txt,filea.txt{}
:与[]
的第二种用法相似,但能匹配字符串,而[]
只能匹配一个字符。^
/!
:与[]
,{}
联用,表示不匹配某些字符,例如:file[^0-8].txt
无法匹配 file0.txt ~ file8.txt,可以匹配 file9.txt,filea.txt ~ filez.txt
bash 中的变量
配置 bash
bash 登录信息与欢迎消息
修改
/etc/issue
文件可以自定义 bash 的登录信息,可以通过一些转义字符显示一些动态的内容:转义字符 含义 \d
本地日期 \t
本地时间 \n
主机名 \r
操作系统版本(相当于 uname -r
)\s
操作系统名称 \v
操作系统版本 \o
域名 \m
硬件等级 \l
是第几个终端机接口 修改
/etc/motd
文件可以自定义欢迎信息,常用来提示登录的用户一些事项。
bash 的环境配置文件
输入输出重定向
输入输出重定向:把原本要从键盘获得的输入重定向为从文件或其他流获得;将原本要输出到屏幕上的输出流重定向为输出到文件或其他流中。
输入输出重定向涉及到三种流:
- 标准输入流(
stdin
,文件描述符0
) - 标准输出流(
stdout
,文件描述符1
) - 标准错误输出流(
stderr
,文件描述符2
)
重定向输出流
使用 >
和 >>
可以重定向输出流,区别是,当目标文件已存在,>
会用新内容覆盖原文件内容(相当于 C 语言文件打开方式中的 w
方式),而 >>
则是将新内容追加到原文件尾部(相当于 a
方式)。
将标准输出重定向到文件中:
1
2
3$ command 1> filename
$ command 1>> filename
$ command >> filename # 不写 1 或者 2,也是重定向标准输出将标准错误输出重定向到文件中:
1
2$ command 2> filename
$ command 2>> filename将所有输出重定向到文件中:
1
$ command &>> filename
标准输出和标准错误输出重定向到不同文件中:
1
$ command 1>> filename1 2>> filename2
标准输出和标准错误输出重定向到一个文件中,但分离开:
1
$ command 1> filename 2> filename
标准输出和标准错误输出的相互重定向:
1
2$ command 1>&2 # 将标准输出重定向到标准错误输出
$ command 2>&1 # 将标准错误输出重定向到标准输出注:如果有多个重定向,上面两种重定向要放到后面。例如:
1
$ find / -name abcd 1>>/dev/null 2>&1
输出流重定向的常见用途:
快速向某个文件写入少量内容,例如:
1
$ echo "export JAVA_HOME=/usr/local/jdk1.8.0" >> /etc/profile
保存命令的执行结果。
丢弃命令的错误输出,如:
1
$ find / -name xxx 2>> /dev/null
/dev/null
是一个字符设备文件,它就像一个黑洞,重定向到该文件的内容都会彻底消失。
重定向输入流
管道
常用管道命令
zsh
shell Script
磁盘管理
网络管理
查看和操纵网卡
常见网卡的命名:
- 以太网卡:
- eth0,eth1,……(eth 表示以太网,0 和 1 是序号)
- enp3s0(en 表示以太网,p3s0 代表 PCI 接口的物理位置为 (3, 0))
- 无线网卡:
- wlan0, wlan1, ……(wlan 表示无线局域网,0 和 1 是序号)
- wlp2s0(wl 表示无线局域网,p2s0 代表 PCI 接口的物理位置为 (2, 0))
- 本地回环:lo(不是真正的网卡,是一个模拟出来的网卡。该网卡为系统提供一个单机网络环境,一般用于网络程序的调试,许多程序的运行也需要这个网卡)
对网卡的操作主要使用 ifconfig
命令。
查看网卡:
1
2
3$ ifconfig # 查看所有已启动的网卡
$ ifconfig -a # 查看所有网卡,无论有没有被启动
$ ifconfig wlp2s0 # 查看指定网卡启动/关闭网卡:
1
2$ ifconfig wlp2s0 up # 启动网卡
$ ifconfig wlp2s0 down # 关闭网卡修改网卡属性:
1
2
3
4
5$ ifconfig wlp2s0 IP地址 # 修改IP地址
$ ifconfig wlp2s0 netmask 掩码 # 修改掩码
$ ifconfig wlp2s0 mtu MTU值 # 修改MTU(最大传输单元)
$ ifconfig wlp2s0 IP地址 netmask 掩码 mtu MTU值 # 可以连起来以简化书写注:
ifconfig
修改网卡参数只是暂时的,系统重启后就会恢复原样。
配置 TCP/IP 网络参数
其他常用命令
ping
1
$ ping -c 数据包个数 IP/域名 # 测试网络是否联通
dig
1
$ dig domain_name # 返回该域名对应的主机信息
netstat
1
2$ netstat -rn # 查看网关
$ netstat -nlutp # 查看开放的端口查看 DNS 服务器
1
$ cat /etc/resolv.conf
命令行下获取本机对外的 IP 地址
1
$ curl http://ifconfig.me