切换目录

cd命令(change directory)用于改变目录:

  • cd <path>:切换到<path>目录下,可以是相对路径或/开头的绝对路径;
  • cd:缺省<path>则会回到家目录~
  • cd .. 返回上一级目录
  • cd -可以回到上一次所处的位置

查看目录

ls命令(list directory)用于列出目录下的文件,基本用法如下

  • ls <path>:列出目录下的所有文件
  • ls:缺省<path>则会列出当前目录下的文件

除此之外,还需要注意ls支持的一些选项

  • -a--all:除了普通文件,还显示以.开头的隐藏文件(文件夹),可以用ls -a | grep '^\.'过滤,只显示隐藏文件(文件夹)
  • -A--almost-all:和-a类似,但是不再显示...这两个特殊角色
  • -l:以列表模式显示文件信息,每一行包括文件的权限、链接数、所有者、组、文件大小、最后修改时间和文件名,对于链接还会显示指向的文件名
  • -F: 在条目的最后添加一个符号,以指示类型,包括*/=>@|,其中*代表可执行文件,/代表目录,@代表符号链接
  • -color=...:是否使用彩色输出,auto表示自动选择,always表示使用彩色输出,never表示不使用彩色输出,在不支持彩色的终端可能会产生一堆控制字符

这些选项可以组合使用,例如ls -al等效于ls -a -l,也可以通过别名对使用进行简化,例如在CentOS下的bash有如下的默认设置

1
2
alias ls='ls --color=auto'
alias ll='ls -l'

在Ubuntu下的bash有如下的默认设置

1
2
3
4
alias ls='ls --color=auto'
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'

创建命令

mkdir命令(make directory)用于创建空目录:

  • mkdir <demo>:新建空目录<demo>
  • mkdir -p a/b/c:创建多级目录,如果中间目录不存在则自动创建,通常用于确保某个目录存在

touch命令可以创建一个空文件,如果同名文件已经存在,touch不会修改它的实际内容,但是会更新一下它的创建时间等信息。

在服务器上直接编辑文件需要使用vim,过于复杂不做讨论,我们可以用远程文件传输替代在服务器上直接修改文件,误打开vim时使用:q!可以强制退出vim并且不做任何修改。

删除命令

rmrmdir命令(remove,remove directory)用于删除文件/空目录:

  • rm <demo>:删除文件或目录 <demo>
  • rm -f <demo>:强制删除文件或目录 <demo>
  • rm -i <demo>:询问互动式删除 <demo>,需要确认一遍文件名
  • rm -r <path>:递归删除路径<path>,常用于删除非空目录和里面的全部内容
  • rmdir <demo>:删除空目录<demo>,注意只能删空目录

拷贝和移动命令

cpmv是拷贝和移动命令(copy,move):

  • cp <demo> <path>:把文件或目录 <demo> 拷贝到 <path> 目录(要求目录已经存在)
  • cp <demo1> <demo2>:把文件或目录 <demo1> 拷贝为 <demo2>
  • cp <demo> <path>/<demo2>:上面两种操作的组合:拷贝+重命名
  • mv <demo> <path>:把文件或目录 <demo> 移动到 <path> 目录(要求目录已经存在)
  • mv <demo1> <demo2>:把文件或目录 <demo1> 重命名为 <demo2>
  • mv <demo> <path>/<demo2>:上面两种操作的组合:移动+重命名

注意这些命令的具体行为可能有多种解释,下面以cp为例,对于mv同理

1
cp source target

根据实际情况,有以下几种可能:

  • 如果target不存在,这个命令会被解释为:通过复制source文件来创建新的target文件;
  • 如果target存在:
    • 如果target是一个文件,这个命令会被解释为:使用source文件对原本target文件的内容进行覆盖;
    • 如果target是一个命令,这个命令会被解释为:将source文件复制到target目录下以创建同名文件。

更好的做法是对目录总是使用/结尾

1
cp source target/

这样可以保证target/一定会被解释为目录,如果该目录不存在则会报错,否则会将source文件复制到target目录下以创建同名文件。

查询信息

  • clear:清屏(ctrl+l也可以)
  • whowhoami:显示当前用户名,两者的判定规则略有区别,尤其是涉及用户切换时
  • pwd(print working directory):显示当前目录
  • echo:输出内容到控制台,例如echo 'hello'输出字符串,echo $PATH输出PATH环境变量
  • cal 显示日历表
  • date 输出日期时间,例如Mon Oct 3 21:59:14 CST 2022,注意这里CST是中国时区的缩写
  • history 10 查看最近执行的 10 条历史命令,!3可以再次执行 history 中编号为 3 的命令

查看文件

  • cat <file> 查看<file>的全部内容,cat -n <file>会显示行号。通常cat会搭配管道符使用,例如使用cat <file> | more搭配more命令查看大文件
  • head <file> 查看<file>的开头几行(默认显示10行内容,可以加参数修改行数,例如-n 20,下同)
  • tail <file> 查看<file>的末尾几行
  • tail -f <file> 动态更新地查看<file>文件的末尾几行,适合监控动态增长的日志文件,例如tail -f /var/log/syslog
  • more <file> 一页一页地查看 <file>
  • less <file> 一页一页地查看 <file>,而且使用比 more 更便利,支持向前翻页;加载大文件时会部分读取,因此不会很卡。

有时候一个文件太大了,我们只需要截取中间的一部分来输出(如果是头部或尾部,直接使用headtail即可),使用cat全部输出不太方便,在vim中复制又不方便,可以参考下面的做法:

  1. 使用vim查看文件,开启行号显示:set number
  2. 确定需要输出的片段的起止行
  3. 执行shell命令:!awk -n "5,10p" filename

如果已经确定了片段的起止行,也可以直接在shell中使用awk -n "5,10p" filename

对于tail -f <file>,在Windows上的powershell有相似的命令,可以用于监控动态增长的日志

1
Get-Content -Path <file> -Wait

查找文件

find命令用于查找文件,下面提供几个例子:

  • 查找/home目录下(包括子目录下)的名称为 a.txt 文件 find /home -name a.txt 也支持文件名通配符
  • 查找/opt目录下(包括子目录下)的拥有者为 username 的文件 find /opt -user username
  • 查找/home目录下(包括子目录下)的大小超过 200M 的文件 find /home +200M (+n 大于 -n 小于,n 等于;支持的单位有 k,M,G 等)

修改文件属性

修改文件权限的指令是chmod(change mode),常见用法如下

  • chomd u=rwx,g=rx,o=x filename:u 是拥有者,g 是所在组,o 是其他用户,直接指定文件的各个权限
  • chmod u+x filenamechmod u-x filename:给拥有者增加/撤销该文件的执行权限
  • chmod 777 filename:使用二进制编码来简写,例如 777 代表二进制的111111111,也就是给三类用户所有权限,例如 751 就是111101001

即使是普通用户自己创建的文件,也不会自动拥有它的所有权限,可以使用命令给自己拥有的文件赋予合理的权限,root 用户拥有绝对的能力,即使一个文件非它创建,它也可以修改这个文件的权限。

通常情况下,普通用户对自己的家目录有完全的权限,对/etc/tmp/opt之类的目录中的文件,只有读和执行的权利,只有对目录下属于用户自己的文件拥有写的权限。

最常见的情景是,直接创建的一个 shell 脚本是不能直接执行的(在目录中不是绿色的),使用chmod 777 filename或者类似指令赋予足够的权限,变成绿色。

1
2
3
4
# 这样总可以执行
sh ./a.sh
# 这个必须对a.sh拥有执行权限才可以
./a.sh

修改文件拥有者和文件所在组的指令是chown(change owner),常见用法如下

  • chown newowner filename:修改文件拥有者
  • chown :newgroup filename:修改文件所在组
  • chown newowner:newgroup filename:同时修改文件拥有者和文件所在组

补充:对于chmodchown命令,加上-R选项才会进行递归修改,否则对于目录只会修改目录自身,不会修改其中的子目录和子文件。

输出重定向

在Linux的shell中可以通过如下方式将输出重定向:

  • 标准输出重定向到指定文件:>采用覆盖方式,>>采用追加方式。若目标文件不存在则会自动创建,下同。例如cat a.txt > b.txtecho hello >> a.txt
  • 错误输出重定向到指定文件:2>采用覆盖方式,2>>采用追加方式。
  • 合并标准输出和错误输出重定向到指定文件:&>采用覆盖方式,&>>采用追加方式。
  • 一个特别的用法:do_something > /dev/null,将命令产生的标准输出重定向到 /dev/null,相当于将输出内容都丢弃到“垃圾桶”。

有时存在这样的需求:将标准输出流输出到控制台的同时保存到指定文件中记录,可以使用tee命令实现,例如

1
2
ls -l | tee ls.log
ls -l | tee -a ls.log # -a append

补充:对于Window上的powershell,同样也支持使用>>>将标准输出重定向,对于错误输出则需要其它的语法,丢弃标准输出可以使用do_something > $null,或者使用do_something | Out-Null

符号链接

Linux系统的符号链接(软链接)效果可以大致理解为Windows系统的快捷方式。

基本使用如下(必须加上-s选项)

1
ln -s /path/to/original/file /path/to/symlink

这个命令会创建符号链接/path/to/symlink,它指向的目标文件为/path/to/original/file

对于软链接的访问会直接访问到目标文件,例如使用 vim 打开。对软链接的重命名,得到的结果仍然是一个指向原本目标文件的软链接。 对软链接的删除只会删除符号链接自身,不会影响指向的文件;

注:

  • 如果不使用-s选项就会创建硬链接,硬链接的机制和软链接是完全不同的,它和实际文件在文件系统中的地位是等价的,都指向同一个实际内存;
  • 如果软链接失效(指向的文件不存在),可能在 ls 命令中显示红色警告;
  • 实际上硬链接和软连接都是文件系统的概念,在Windows中也有同样的概念,Windows中的快捷方式只是Explorer提供的,而非文件系统。

用户管理

在Ubuntu中可以使用adduserdeluser这两个命令进行基本的用户管理,交互非常方便。

某些Linux发行版例如CentOS可能只有更基础的 useradduserdel 命令可以使用, 这两个命令的使用比较复杂,需要提供很多参数,adduserdeluser可以理解为对它们的封装,在使用上对用户更加友好。

adduser 用于创建新用户并为其设置初始信息

1
sudo adduser <username>

在执行 adduser <username> 命令时,会提示依次输入以下信息:

  • 密码:要求为新用户设置一个密码。
  • 全名:用户的全名(GECOS 信息)。
  • 电话号码:可选的用户电话信息。
  • 其他信息:还会提示填写办公室位置等信息。
  • 确认信息:在信息输入完毕后,会要求确认这些信息是否正确。

除了密码之外的内容可以缺省跳过即可。

adduser 实际会自动执行以下步骤:

  • 创建用户的家目录。(最好在创建之前,保证新用户的家目录是不存在的)
  • 为用户设置默认的 shell(通常是 /bin/bash)。
  • 将用户添加到与其用户名同名的用户组中。
  • 配置 /etc/passwd/etc/shadow/etc/group/etc/gshadow 等文件。

deluser 用于删除用户及其相关信息

1
sudo deluser <username>

删除用户主要是针对用户信息的删除,而不是用户的数据文件。 默认情况下会保留被删除用户的其家目录,以及用户所拥有的所有文件,但是也可以通过特定选项达到彻底删除的效果。

用户切换

使用su user可以切换到user用户,但是不会加载user用户的某些环境变量和配置文件, 更好的做法是su - user,它会完整进行一次user用户的登录过程,并且登陆后默认在user用户的家目录中。

杀死进程

如果某个进程卡死了,可以使用ctrl+z将其挂起,然后使用下面的命令按照关键字查找进程id(关键字可以是用户名或者具体命令的单词)

1
ps -aux | grep <keyword>

然后可以杀死对应进程

1
2
3
4
kill id

# kill force
kill -9 id

查询手册

Linux中的命令实在是太多了,记不住用法的时候可以查询自带的手册,使用man命令(manual), 例如man ls可以查询ls命令的用法,直接q就可以退出了。

man手册进行了一个基础的分类,包括:

  1. 用户命令
  2. 系统调用
  3. C库函数
  4. 设备和特殊文件
  5. 文件格式和约定
  6. 游戏和演示
  7. 杂项
  8. 系统管理命令

这种分类可以避免一些重名问题,例如printf既是一个用户命令,也是一个C库函数,我们需要指定分类数字才能正确查询到对应的手册。

1
2
man 1 printf
man 3 printf

缺省时,因为1的优先级更高,只会显示用户命令printf的手册。

1
man printf

man提供的手册非常详细,但是也过于繁琐,有一些更简洁的工具可以直接提供示例,例如tldr(TOO LONG, DO NOT READ)。

1
2
apt-get install tldr
tldr --update # 更新数据(非常多)

tldr展示的内容会更加简洁,使用例如

1
tldr tar

CPU和内存监控

free命令可以显示当前系统的内存和交换分区的使用情况。

1
free -h

输出形如

1
2
3
               total        used        free      shared  buff/cache   available
Mem: 7.4Gi 2.1Gi 4.2Gi 3.0Mi 1.1Gi 5.1Gi
Swap: 2.0Gi 3.0Mi 2.0Gi

top命令(table of processes)可以实时显示系统进程和资源使用情况,包括 CPU、内存等。(q可以退出)

1
top

输出形如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
top - 21:05:47 up 12 days, 13:50,  2 users,  load average: 1.04, 1.21, 1.66
Tasks: 334 total, 1 running, 333 sleeping, 0 stopped, 0 zombie
%Cpu(s): 3.6 us, 0.1 sy, 0.0 ni, 96.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 26385062+total, 25013684+free, 10826344 used, 2887432 buff/cache
KiB Swap: 32767996 total, 32767996 free, 0 used. 25193814+avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
28967 xxxxxx 20 0 19.467g 8.531g 152140 S 102.0 3.4 151:43.66 MATLAB
31585 xxxxxx 20 0 166192 2876 1944 R 0.3 0.0 0:00.08 top
1 root 20 0 49184 5560 2440 S 0.0 0.0 0:33.60 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.13 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.25 ksoftirqd/0
8 root rt 0 0 0 0 S 0.0 0.0 0:00.60 migration/0
9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
10 root 20 0 0 0 0 S 0.0 0.0 2:23.79 rcu_sched
11 root rt 0 0 0 0 S 0.0 0.0 0:03.06 watchdog/0

对于头部信息的解读:

  • 第一行:系统时间,系统运行时间,当前登录的用户数量,系统负载平均值(低于1代表空闲,高于1代表繁忙)
  • 第二行:当前总进程数,正在执行的进程数
  • 第三行:进程占用的 CPU 百分比
    • 3.6 us代表用户空间进程占用,包括大部分应用程序;
    • 0.1 sy代表内核空间进程占用,用于执行系统内核和驱动程序等;
    • 96.4 id代表CPU空闲时间占比。
  • 第四行:系统总内存量,空间的内存量,已使用的内存量

对于进程列表的解读:

  • PID:进程ID。
  • USER:进程所有者的用户名。
  • PR:进程优先级。
  • NI:进程的 nice 值(优先级调整值)。
  • VIRT:进程使用的虚拟内存总量。
  • RES:进程使用的常驻内存量。
  • SHR:进程使用的共享内存量。
  • S:进程状态(例如:R 运行、S 睡眠、D 不可中断睡眠、Z 僵尸、T 停止)。
  • %CPU:进程消耗的 CPU 百分比。(可能超过百分之一百,这是并行的原因)
  • %MEM:进程使用的内存百分比。
  • TIME+:进程使用的总 CPU 时间,单位为秒。
  • COMMAND:执行进程的命令名称或命令行。

htop是一个比top更好用的同类工具,但是通常需要额外下载。

cat /proc/cpuinfo命令可以直接获取CPU的信息,使用lscpu命令也可以获取CPU信息,可读性更高。

硬盘监控

lsblk命令(list block)可以列出所有块设备及其挂载点

1
lsblk

输出内容形如

1
2
3
4
5
6
7
8
9
10
11
12
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda 8:0 0 3.7T 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 3.7T 0 part
├─centos-root 253:0 0 300G 0 lvm /
├─centos-swap 253:1 0 31.4G 0 lvm
└─centos-home 253:2 0 17.9T 0 lvm /home
sdb 8:16 0 14.6T 0 disk
└─centos-home 253:2 0 17.9T 0 lvm /home
sr0 11:0 1 1024M 0 rom
sr1 11:1 1 1024M 0 rom

使用df命令(disk free)可以展示文件系统的硬盘空间使用情况

1
df -h

输出内容形如

1
2
3
4
5
6
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs 32G 0 32G 0% /dev
/dev/sda3 560G 194G 338G 37% /
/dev/sda1 477M 291M 157M 65% /boot
/dev/sdb1 16T 12T 3.0T 80% /home
...

这里的输出表明根目录/对应560G空间,已经使用了 37% 的空间, 用户目录/home对应16T空间,已经使用了 80% 的空间。

使用du命令(disk usage)可以展示test/目录下所有子项的硬盘空间使用情况

1
du -h test/

如果显示子项太多,可用使用-s选项则会进行汇总

1
du -sh test/

可以对输出结果按照大小进行排序

1
du -sh test/ | sort -hr