Linux 常用命令
切换目录
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
2alias ls='ls --color=auto'
alias ll='ls -l'
在Ubuntu下的bash有如下的默认设置 1
2
3
4alias 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
并且不做任何修改。
删除命令
rm
和rmdir
命令(remove,remove
directory)用于删除文件/空目录:
rm <demo>
:删除文件或目录<demo>
rm -f <demo>
:强制删除文件或目录<demo>
rm -i <demo>
:询问互动式删除<demo>
,需要确认一遍文件名rm -r <path>
:递归删除路径<path>
,常用于删除非空目录和里面的全部内容rmdir <demo>
:删除空目录<demo>
,注意只能删空目录
拷贝和移动命令
cp
和mv
是拷贝和移动命令(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
也可以)who
和whoami
:显示当前用户名,两者的判定规则略有区别,尤其是涉及用户切换时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 更便利,支持向前翻页;加载大文件时会部分读取,因此不会很卡。
有时候一个文件太大了,我们只需要截取中间的一部分来输出(如果是头部或尾部,直接使用head
和tail
即可),使用cat
全部输出不太方便,在vim
中复制又不方便,可以参考下面的做法:
- 使用
vim
查看文件,开启行号显示:set number
- 确定需要输出的片段的起止行
- 执行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 filename
,chmod u-x filename
:给拥有者增加/撤销该文件的执行权限chmod 777 filename
:使用二进制编码来简写,例如 777 代表二进制的111111111
,也就是给三类用户所有权限,例如 751 就是111101001
即使是普通用户自己创建的文件,也不会自动拥有它的所有权限,可以使用命令给自己拥有的文件赋予合理的权限,root 用户拥有绝对的能力,即使一个文件非它创建,它也可以修改这个文件的权限。
通常情况下,普通用户对自己的家目录有完全的权限,对/etc
,/tmp
,/opt
之类的目录中的文件,只有读和执行的权利,只有对目录下属于用户自己的文件拥有写的权限。
最常见的情景是,直接创建的一个 shell
脚本是不能直接执行的(在目录中不是绿色的),使用chmod 777 filename
或者类似指令赋予足够的权限,变成绿色。
1 | 这样总可以执行 |
修改文件拥有者和文件所在组的指令是chown
(change
owner),常见用法如下
chown newowner filename
:修改文件拥有者chown :newgroup filename
:修改文件所在组chown newowner:newgroup filename
:同时修改文件拥有者和文件所在组
补充:对于chmod
和chown
命令,加上-R
选项才会进行递归修改,否则对于目录只会修改目录自身,不会修改其中的子目录和子文件。
输出重定向
在Linux的shell中可以通过如下方式将输出重定向:
- 标准输出重定向到指定文件:
>
采用覆盖方式,>>
采用追加方式。若目标文件不存在则会自动创建,下同。例如cat a.txt > b.txt
,echo hello >> a.txt
- 错误输出重定向到指定文件:
2>
采用覆盖方式,2>>
采用追加方式。 - 合并标准输出和错误输出重定向到指定文件:
&>
采用覆盖方式,&>>
采用追加方式。 - 一个特别的用法:
do_something > /dev/null
,将命令产生的标准输出重定向到/dev/null
,相当于将输出内容都丢弃到“垃圾桶”。
有时存在这样的需求:将标准输出流输出到控制台的同时保存到指定文件中记录,可以使用tee
命令实现,例如
1
2ls -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中可以使用adduser
和deluser
这两个命令进行基本的用户管理,交互非常方便。
某些Linux发行版例如CentOS可能只有更基础的
useradd
和userdel
命令可以使用, 这两个命令的使用比较复杂,需要提供很多参数,adduser
和deluser
可以理解为对它们的封装,在使用上对用户更加友好。
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
4kill id
# kill force
kill -9 id
查询手册
Linux中的命令实在是太多了,记不住用法的时候可以查询自带的手册,使用man
命令(manual),
例如man ls
可以查询ls
命令的用法,直接q
就可以退出了。
man
手册进行了一个基础的分类,包括:
- 用户命令
- 系统调用
- C库函数
- 设备和特殊文件
- 文件格式和约定
- 游戏和演示
- 杂项
- 系统管理命令
这种分类可以避免一些重名问题,例如printf
既是一个用户命令,也是一个C库函数,我们需要指定分类数字才能正确查询到对应的手册。
1
2man 1 printf
man 3 printf
缺省时,因为1
的优先级更高,只会显示用户命令printf
的手册。
1
man printf
man
提供的手册非常详细,但是也过于繁琐,有一些更简洁的工具可以直接提供示例,例如tldr
(TOO
LONG, DO NOT READ)。 1
2apt-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
16top - 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
12NAME 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
6Filesystem 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