>> >> >> Reference << << << <<<<<<Ref>>>>>>
linux command
Update: 2026-01-14

Command in Linux

Linux命令系统是基于Shell(常见的有bash, zsh, fish)的交互环境

所以“命令系统”不是内核强制规定的,而是围绕Unix哲学发展出来的一整套生态:

“做一件事,并且把它做好。通过管道组合小工具,完成大任务”

命令的组成结构

在Linux中,一个命令通常由命令名+选项+参数组成

ls -l /home/user

选项有两种风格

这套风格来自GNU工具链

命令来源

终端命令的来源主要来自于以下几个模块

/bin

bin=binary,存放可执行程序(二进制文件)

存在意义

系统最小可用,即:
在系统刚启动时、还没挂载其他分区时就能用

/bin, /usr/bin

目录含义
/bin启动和救援必须
/usr/bin普通用户命令
/sbin管理员命令
/usr/sbin非关键管理员命令

在大多数现代发行版中

/bin -> /usr/bin
/sbin -> /usr/sbin
ls -l /bin

可以看到

/bin -> usr/bin

这被称作usr merge,可以简化目录结构,减少重复,容器/initramfs更干净

bin中的程序形态

1. ELF二进制

file /bin/ls

输出类似

ELF 64-bit LSB executable

这是编译好的C程序,由内核直接加载执行

2. Shell脚本

file /bin/sh

可能是

symbolic link to dash

#!/bin/sh

但这并不代表用户可以自己往/bin内放程序
这需要root权限,可能破坏系统一致性,还可能导致包管理器冲突
正确的做法是\

目的位置
个人脚本~/bin
本地工具/usr/local/bin
系统包交给 apt/pacman

/bin中程序的来源

/bin不是一个“统一来源”的目录,它是多个软件包 + 多种构建方式的集合

它大致包含:

1.GNU coreutils: GNU官方,C语言实现,所有Linux必备 2.Shell相关:来源于不同项目bash,sh,dash,zsh等 3.util-linux:系统工具集 4.发行版自带/历史遗留工具 5.符号链接

bin 是通过PATH找到的

echo $PATH

常见包含

/usr/local/bin:/usr/bin:/bin

当敲下ls时,Shell实际做的是

1.在/usr/local/bin找 2.再/usr/bin 3.再/bin

Shell内置命令

Shell内置命令是指那些直接由Shell提供支持、实现并在Shell环境中执行的命令。它们不依赖于外部可执行文件,而是内建在Shell中。内置命令执行起来非常高效,因为它们不需要启动新的进程来执行任务,直接由Shell解释执行
不同的Shell会有不同或额外的命令,下面是bash中的内置命令,可以通过man bash显示Bash的说明书,中有一个专门的章节详细描述来所有内置命令

alias ll='ls -l'
unalias ll
trap 'echo "Caught signal!"' SIGINT
if [ condition  ]; then
    # commands
fi
for i in {1..5}; do
    echo $i
done
while [ condition  ]; do
        # commands
done
case $variable in
  pattern1) command ;;
  pattern2) command ;;
  *) command ;;
esac
bg %1 # 将作业号为1的任务放入后台
fg %1
kill -9 1234 # 发送 SIGKILL信号,终止PID 1234的进程
source ~/.bashrc
. ~/.bashrc
test -f file.txt && echo "File exists"
let result=5+3
exec ls -l

GUN Utilities

GUN工具集(GNU Utilities)是指GNU项目提供的一整套自由软件开发与系统工具集合,它构成了现代Unix/Linux系统的基础生产力层

GNU Coreutils

GNU Coreutils是GNU最核心的部分,是GNU项目提供的一组最基础、最核心的用户空间命令行工具集合。它定义了一个最小可用的Unix用户空间长什么样。它包含日常必备的基础命令,覆盖三大类

文件与目录操作

ls

ls(list directory contents),用于列出目录内容

ls [options] [file/directory]

选项

-l

详细列表格式

-rw-r--r--  1 ljf12825 users   4096 Jan 12 20:31 main.cpp
[1]        [2]  [3]      [4]    [5]     [6]         [7]
权限与类型 硬链接数  所有者    所属组   大小     时间        文件名
文件类型

第1个字符

字符含义
-普通文件
d目录
l符号链接(软链接)
c字符设备
b块设备
p管道
s套接字
权限位

后9个字符



cd

cd(Change Directory),用于在文件系统的目录之间进行导航

特殊符号

pwd

pwd(Print Working Directory),用于显示当前所在的目录的完整路径

参数

为什么需要pwd?

mkdir

mkdir(Make Directory),用于在系统中创建新的目录

基本语法

mkdir [options] directoryname...

基本用法

mkdir folder1
mkdir folder1 folder2 folder3
mkdir "my folder"

mkdir 'another folder'
mkdir folder-with-dash
mkdir folder_with_underscore
mkdir "folder with space"

常用选项

mkdir -p dir1/dir2/dir3

如果父目录不存在,会自动创建,如果目录存在,不会报错

一次性创建多层目录结构

mkdir -p project/{src,test,docs,logs}
# 创建:project/src, project/test, project/docs, project/logs
mkdir -m 755 public_dir
mkdir -m 700 private_dir
mkdir -v new_folder
# 输出:mkdir: create directory 'new_folder'

rmdir / rm -r

删除空目录,空是指,只含...,哪怕有任何文件或子目录(即使是隐藏的),都会失败

rmdir存在的意义就是安全性优先,防止误操作

rmdir -p a/b/c

# a/
# |__b/
#    |__c/

删除c -> b变空了删除b -> a变空了删除a,否则停下

rm -r递归删除目录

cp:复制文件或目录

cp用来复制文件/目录

cp [options] source destination
cp [options] source... directory
情况行为
目标不存在新建
目标是文件覆盖
目标是目录复制到目录里

OPTIONS

-r/-R 递归复制
cp -r src dst

没有这个选项不能复制目录,-r-R在GNU cp中基本等价
会跟随目录结构,不会自动保留元数据

-a 归档模式
cp -a src dst

等价于

cp -dR --preserve=all

会保留以下内容

复制目录,90%场景都应该使用-a

-f/-i 覆盖行为控制
cp -i a b
cp -f a b
-d/-P 不解引用软连接
cp -d link dst

复制的是link本身,而不是link指向的文件

-L 解引用软连接
cp -L link dst

复制链接指向的内容,得到的是普通文件

--preserve
cp --preserve=mode,ownership,timestamps file dst

cp -p file dst

可保留属性

属性说明
mode权限
ownershipuid/gid
timestamps时间
links硬链接
xattr扩展属性
contextSELinux

-a = 全保留

--no-preserve 不保留

cp -a --no-preserve=ownership src dst
-u 只在更新时复制
cp -u src dst

目标不存在或源比目标新时执行

--remove-destination
cp --remove-destination src dst

先删dst再复制,可避免只读文件覆盖失败

--sparse
cp --sparse=always src dst

保留空洞

cp --reflink-auto a b
-v 显示过程
--parents 将dst作为父目录
cp --parents a/b/c.txt dst

结果

dst/a/b/c.txt
cp vs rsync
场景推荐
简单复制cp
大目录增量rsync
断点续传rsync
网络rsync
保留全部属性cp -a / rsync -a

mv:移动或重命名

mv(move),用于移动或重命名文件和目录

基本功能

1.移动文件/目录:将文件从一个位置移动到另一个位置 2.重命名文件/目录:在原地更改文件/目录名 3.覆盖文件:如果目标文件已存在,默认会覆盖(无警告)

基本语法

mv [options] src/dir src/dir
选项
选项描述
-i交互模式,覆盖前询问确认
-f强制模式,不询问(默认行为)
-n不覆盖已存在的文件
-u只移动比目标文件新的文件
-v详细模式,显示操作过程
-b覆盖前为目标文件创建备份
-t dir先将目标目录指定,然后是要移动的文件

使用

1.重命名文件

mv oldfile.txt newfile.txt
# 将 oldfile.txt 重命名为 newfile.txt

2.移动单个文件

mv file.txt /home/user/documents/
# 将 file.txt 移动到 documents 目录

3.移动多个文件到目录

mv file1.txt file2.txt file3.txt /target/directory/
# 将三个文件移动到目标目录

4.移动目录

mv dir1/ dir2/
# 如果 dir2 不存在:将 dir1 重命名为 dir2
# 如果 dir2 存在:将 dir1 移动到 dir2/ 目录下

5.交互模式(避免误覆盖)

mv -i source.txt target.txt
# 如果 target.txt 已存在,会询问是否覆盖

6.显示移动过程

mv -v file.txt /backup/
# 输出:'file.txt' -> '/backup/file.txt'

7.不覆盖现有文件

mv -n file.txt existing.txt
# 如果 existing.txt 存在,则不移动/覆盖

8.只移动较新的文件

mv -u newfile.txt oldfile.txt
# 只当 newfile.txt 比 oldfile.txt 新时才移动

9.覆盖前创建备份

mv -b source.txt target.txt
# 如果 target.txt 存在,会先备份为 target.txt~

rm:删除文件

rm(remove),用于删除文件或目录

rm删除的文件通常无法恢复,不像图形界面会进回收站

Linux没有回收站,除非特殊配置,删除操作立即生效

基本语法

rm [options] file/dir...
常用选项
选项描述
-f强制删除,不提示
-r-R递归删除(用于目录)
-i交互模式,删除前询问
-v显示详细过程
-d删除空目录
--preserve-root不删除根目录(默认)
--no-preserve-root允许删除根目录

rm不是把文件内容清零,而是删除目录项(文件名),减少inode的引用技术,当引用计数为0 -> 数据库可被复用
rm内部调用unlink()/unlinkat()
rm为什么不提示成功:No news is good news rm可以删除正在使用的文件,进程仍能访问,文件名消失,程序结束后才真正释放空间

cat

cat(concatenate),把输入的内容原样输出到标准输出(stdout)

用法

查看文件内容
cat a.txt

a.txt的内容一次性全部输出,不分页,不暂停

同时查看多个文件
cat a.txt b.txt

输出顺序

a.txt内容
b.txt内容

中间不会自动加分隔符

合并文件
cat a.txt b.txt > all.txt

cat与重定向

从标准输入读取
cat

然后输入

hello
world

^D(EOF)
终端输出

hello
world
手动创建文件
cat > test.txt

输入内容 -> ^D结束

Here Document
cat << EOF > config.ini
[server]
port=8080
host=127.0.0.1
EOF

shell把内容交给cat

参数

cat 不适合大文件,它会一次全部输出,终端会被卡住

tac,cat的反向,输出方向和cat相反,从文档末尾->文档开头

more/less

moreless都是用于分页查看文件内容的工具,通常被称为分页器(pagers)

特性moreless
诞生时间1978年1984年
名称含义显示更多更少即是更多
向后滚动不支持支持
向前搜索不支持支持
向后搜索不支持支持
行号显示有限支持支持
文件内跳转有限灵活
查看多个文件支持支持
跟随模式不支持支持
内存使用较少较多
默认位置通常默认安装更现代的默认

lessmore的增强版,现在基本都用less

more

基本语法
more [options] file
常用选项
选项说明
-d显示提示信息
-f不折叠长行
-l忽略换页符
-p从指定行开始
-s将多个空行压缩为一行
+n从第n行开始显示
+/pattern从匹配模式的第一行开始
基本操作
按键功能
空格f向下翻一页
Enter向下翻一行
=显示当前行号
:f显示文件名和行号
qQ退出
/字符串向前搜索字符串(有限)

less

Less is more 少即是多,功能比more更多

基本语法
less [options] file
常用选项
选项说明
-N显示行号
-i搜索时忽略大小写
-I搜索时智能忽略大小写
-S不换行(水平滚动)
-F如果文件小于一屏,自动退出
-X退出时不清理屏幕
-R显示原始控制字符(如颜色)
-M显示更多提示信息
+/pattern从匹配模式开始
+G直接跳转到文件末尾
操作
导航命令
按键功能
空格f向前翻一页
b向后翻一页
u向后翻半页
Enterej向前一行
yk向后一行
g跳到文件开头
G跳到文件末尾
10g跳到第10行
50%跳到文件的50%位置
搜索命令
按键功能
/pattern向前搜索匹配模式
?pattern向后搜索匹配模式
n重复上一次搜索(同方向)
N重复上一次搜索(反方向)
&pattern仅显示匹配的行
Esc+u关闭高亮显示
文件操作
按键功能
:e file打开新文件
:n查看下一个文件(多文件时)
:p查看上一个文件(多文件时)
:x查看第一个文件
h显示帮助
qZZ退出
标记和跳转
按键功能
mchar用字母标记当前位置
'char跳转到标记的位置
''跳转到上次的位置
特殊功能
按键功能
v用默认编辑器打开当前文件
!command执行shell命令
s file保存当前内容到文件
F跟随模式(实时查看日志,类似tail -f
使用示例

1.查看文件并显示行号

less -N lgofile.txt

2.查看压缩文件

# less可以直接查看压缩文件
less access.log.gz
less error.log.bz2
zcat file.gz | less # 替代方法

3.实时监控日志(跟随模式)

less +F /var/lgo/syslog
# 按 ^C 停止跟随,再按F恢复

4.查看命令输出

# 保留颜色输出
ls --color=always | less -R
grep --color=always "error" log.txt | less -R

# 查看进程,按内存排序
ps aux --sort=-%mem | less

5.查看多个文件

less file1.txt file2.txt file3.txt
# 使用 :n 和 :p 在文件间切换

6.查看文件特定部分

# 只查看包含"ERROR"的行
less -p ERROR log.txt

# 查看第100-200行
less +100 -p200 log.txt  # 从100行开始,显示到200行附近

7.在less中执行命令

# 在 less 中按 ! 然后输入命令
!ls -la  # 查看当前目录,按回车返回less

为什么需要分页器

分页器在特定场景下有不可替代的作用

head/tail

查看文件开头

基本用法
# 查看文件前10行(默认)
head filename.txt

# 查看指定行数(如5行)
head -n 5 filename.txt
head -5 filename.txt # 简写形式
常用选项
# 查看前100个字节
head -c 100 filename.txt

# 查看前1KB的内容
head -c 1k filename.txt

# 查看前1MB的内容
head -c 1M filename.txt

# 查看多个文件
head file1.txt file2.txt

# 显示文件名标题
head -v filename.txt

# 不显示文件名标题(默认多个文件时才显示)
head -q file1.txt file2.txt

tail

查看文件结尾

基本用法
# 查看文件最后10行(默认)
tail filename.txt

# 查看指定行数(如20行)
tail -n 20 filename.txt
tail -20 filename.txt # 简写形式
常用选项
# 实时监控文件变化(日志监控神器)
tail -f /var/log/syslog
# 当文件新增内容时,实时输出

# 监控文件变化,即使文件被重命名或重新创建
tail -F /var/log/app.log

# 查看最后100个字节
tail -c 100 filename.txt

# 从第10行开始显示到文件末尾
tail -n +10 filename.txt

# 查看最后50行并实时监控
tail -n 50 -f access.log

示例

# 查看第11-20行(先取前20行,再取最后10行)
head -n 20 file.txt | tail -n 10

# 查看第5到15行
sed -n '5,15p' file.txt # 替代方法

wc

wc(word count) 用来统计输出中的

默认输出三项

wc file.txt

输出

 120     900     6321 file.txt
lines   words   bytes

常用参数

只看行数

wc -l main.cpp

同时看多个

wc -l -w main.cpp

底层本质

wc -l

统计的是换行符\n数量

echo "你好" | wc -c # 7
echo "你好" | wc -m # 3

wc本质就是一个

while(read(buf)) {
    count '\n'
    count space-sep words
    count bytes
}

也就是说,wc是最理想的流式算法范例

grep

grep(Global Regular Expression Print),从文本流中,按规则筛选你想要的行

grep接受两种输入:

  1. 文件参数:grep pattern filename
  2. 标准输入:其他命令的输出

示例

grep "ERROR" server.log

server.log中,找出包含ERROR的所有行

参数

grep与正则表达式

正则表达式是grep的灵魂

1. 匹配任意一个字符
grep "pla.er" file.txt

匹配

2. 行首/行尾
grep "^ERROR" log.txt

以ERROR开头

grep "failed$" log.txt

以failed结尾

3. 数量限定(需要-E)
grep -E "a{3,5}" file.txt

匹配

4. 或条件
grep -E "ERROR|WARN" log.txt

其他

1. 显示高亮
grep --color=auto ERROR log.txt
2. 显示上下文
grep -C 3 ERROR log.txt

显示错误行前后3行

3. 多条件过滤
grep ERROR log.txt | grep timeout

等价于:同时包含ERROR和timeout

底层本质

grep本质是

while(read_line()) {
    if (regex_match(line))
        print(line);
}

关键是

touch

touch用来创建空文件,或者修改文件的时间戳(时间属性)

它主要做两件事情

  1. 文件不存在 -> 创建新文件
  2. 文件存在 -> 更新访问时间/修改时间

常见用法

创建空文件
touch a.txt

效果

等价于

> a.txt

touch更语义化,也更安全

一次创建多个文件
touch a.txt b.txt c.txt

时间戳相关

Linux每个文件至少有三个时间

时间含义
atime最后访问时间
mtime最后修改内容时间
ctime最后状态改变时间(权限等)

touch主要影响的是

1. 只改访问时间
touch -a file.txt
2. 只改修改时间
touch -m file.txt
3. 设置为指定时间
touch -t 202401231530 file.txt

格式

YYYYMMDDhhmm
4. 对齐另一个文件的时间
touch -r source.txt target.txt

target.txt的时间戳=source.txt

本质

touch就是一次open + utimensat系统调用封装

核心行为

  1. 如果文件不存在 -> open(0_CREAT)
  2. 如果存在 -> utime / utimensat 修改inode时间戳

diff

diff用来比较两个文件(或目录),输出它们之间的差异(difference)

基本用法

比较两个文件

diff a.txt b.txt

输出的是行级别的差异

a.txt

hello
world

b.txt

hello
linux
world

diff输出

1a2
> linux

意思是:在a.txt的第1行后,增加了一行linux

统一格式

diff -u a.txt b.txt

输出(unified diff)

--- a.txt
+++ b.txt
@@ -1,2 +1,3 @@
 hello
+linux
 world

这就是Git, patch, code review, PR背后统一使用的格式

git diff本质上就是一个高级版的diff + 内部算法 + 语义增强

输出符号

符号含义
+新增
-删除
未变化
@@变更块位置
---原文件
+++新文件

目录diff

diff -r dir1 dir2

递归比较整个目录树

比如用于比较两次构建产物差哪了

参数

| 参数 | 含义 | | -u | 统一格式 | | -r | 递归比较目录 | | -q | 只告诉你是否不同 | | -w | 忽略所有空白 | | -b | 忽略多个空格差异 | | -B | 忽略空行 | | -i | 忽略大小写 | | -I | 忽略匹配行 |

diff背后的算法

diff本质是一个经典CS问题:最长公共子序列(LCS)

给你两行文本

A B C D E F
A B X D E Y

找最长公共子序列

A B D E

然后推导出

这就是diff的数学本质

Git内部是优化版

打包压缩

Compress_Archive

权限与用户

系统与进程管理

输入输出与管道

常用工具命令

网络相关

软件包管理

帮助

命令查看