第一部分:Linux 命令行的基石

在开始学习具体命令之前,理解几个核心概念至关重要。

1. 什么是 Shell?

你输入的命令并不是由 Linux 内核直接处理的。你是在和一个叫做 Shell 的程序交互。Shell 是一个命令解释器,它接收你输入的命令,解释它们,然后请求操作系统(Linux 内核)来执行。

  • 常见的 Shell:
    • bash (Bourne Again SHell):绝大多数 Linux 发行版的默认 Shell。
    • zsh (Z Shell):功能更强大,配置更灵活,是很多开发者的最爱。
    • fish (Friendly Interactive SHell):开箱即用,有很好的自动补全和语法高亮功能。

本介绍将以最常见的 bash 为例。

2. 命令的基本结构

一个典型的 Linux 命令遵循以下结构:

1
command [options] [arguments]
  • command (命令):你要执行的程序的名称,例如 ls, cp, mkdir
  • options (选项/标志):用来修改命令的行为。通常以一个或两个破折号 (---) 开头。
    • 短选项:一个破折号后跟一个字母,例如 -l, -a。可以合并,如 -la
    • 长选项:两个破折号后跟一个单词,例如 --list, --all
  • arguments (参数):命令作用的对象,通常是文件名、目录路径、URL 等。

示例:
ls -l /home/user

  • ls 是命令。
  • -l 是选项(长格式列出)。
  • /home/user 是参数(要列出的目录)。

3. 关键概念

  • 当前工作目录 (Current Working Directory):你当前所在的目录位置。可以使用 pwd (Print Working Directory) 命令查看。
  • 路径 (Path):文件或目录在文件系统中的位置。
    • 绝对路径:从根目录 / 开始的完整路径,例如 /home/user/documents/report.txt
    • 相对路径:从当前目录开始的路径。
      • . 代表当前目录。
      • .. 代表上一级目录。
      • 例如,如果你在 /home/user,那么 documents/report.txt 就是一个相对路径。

第二部分:按功能分类的核心命令

下面我们将命令按照它们的常见用途进行分类介绍。

类别一:文件和目录管理

这是最基础也是最常用的一类命令。

  • ls (List):列出目录中的文件和子目录。

    • ls:列出当前目录内容。
    • ls -l:长格式显示,包含权限、所有者、大小、修改日期等详细信息。
    • ls -a:显示所有文件,包括以 . 开头的隐藏文件。
    • ls -h:与 -l 结合使用 (ls -lh),以人类可读的格式显示文件大小 (K, M, G)。
    • ls -t:按修改时间排序。
    • 组合使用ls -lath 是一个非常常用的组合。
  • cd (Change Directory):切换目录。

    • cd /path/to/directory:切换到指定目录。
    • cd ~cd:切换到当前用户的家目录。
    • cd ..:切换到上一级目录。
    • cd -:切换到上一次所在的目录。
  • pwd (Print Working Directory):显示当前工作目录的绝对路径。

  • mkdir (Make Directory):创建新目录。

    • mkdir new_folder:在当前位置创建名为 new_folder 的目录。
    • mkdir -p project/src/main-p 选项可以递归创建多层目录。
  • rmdir (Remove Directory):删除 目录。

  • touch (Touch):创建一个空文件,或更新已有文件的时间戳。

    • touch new_file.txt
  • cp (Copy):复制文件或目录。

    • cp source_file destination_file:复制文件。
    • cp source_file destination_folder/:将文件复制到指定目录。
    • cp -r source_folder destination_folder-r (recursive) 选项用于复制整个目录及其内容。
  • mv (Move):移动或重命名文件/目录。

    • mv old_name.txt new_name.txt:重命名文件。
    • mv file.txt /path/to/destination/:移动文件到另一个位置。
  • rm (Remove):删除文件或目录。这是一个非常危险的命令,删除后通常无法恢复!

    • rm file.txt:删除文件。
    • rm -r folder_name-r (recursive) 递归删除整个目录及其所有内容。
    • rm -f-f (force) 强制删除,不进行任何提示。
    • rm -rf / 是 Linux 中最臭名昭著的命令,会删除整个系统,请永远不要尝试!

类别二:文本处理

在 Linux 中,一切皆文件。处理文本是核心技能。

  • cat (Concatenate):查看、合并文件内容。

    • cat file.txt:在终端显示 file.txt 的全部内容。
    • cat file1.txt file2.txt > new_file.txt:将两个文件合并成一个新文件。
  • less / more:分页查看文件内容。less 功能更强,允许前后翻页。

    • less large_log_file.log
    • less 中,使用箭头键或 PageUp/PageDown 翻页,按 / 进行搜索,按 q 退出。
  • head / tail:查看文件的开头或结尾部分。

    • head -n 20 file.txt:查看文件的前 20 行(默认是 10 行)。
    • tail -n 20 file.txt:查看文件的后 20 行。
    • tail -f /var/log/syslog-f (follow) 选项可以实时监控文件的追加内容,常用于查看日志。
  • grep (Global Regular Expression Print):在文本中搜索匹配的行。

    • grep "error" log.txt:在 log.txt 中查找包含 “error” 的行。
    • grep -i "error" log.txt-i (ignore case) 忽略大小写。
    • grep -r "keyword" /path/to/dir-r (recursive) 递归在目录中所有文件中搜索。
    • grep -v "debug"-v (invert match) 显示不匹配的行。
  • wc (Word Count):统计文件的行数、单词数、字节数。

    • wc -l file.txt:只统计行数。
    • wc -w file.txt:只统计单词数。
    • wc -c file.txt:只统计字节数。

类别三:系统信息与管理

  • uname: 显示系统信息。

    • uname -a:显示所有详细信息(内核名称、版本、主机名等)。
  • df (Disk Free):查看磁盘空间使用情况。

    • df -h-h (human-readable) 以更易读的格式显示。
  • du (Disk Usage):查看文件或目录占用的磁盘空间。

    • du -sh /path/to/dir-s (summary) 只显示总大小,-h 以易读格式显示。
  • free: 查看内存和交换空间使用情况。

    • free -h:以易读格式显示。
  • top / htop: 实时显示系统进程和资源占用情况。htop 是一个更强大、更友好的版本,通常需要单独安装。

  • date: 显示或设置系统时间。

  • history: 显示当前用户执行过的历史命令。

类别四:进程管理

  • ps (Process Status):列出当前运行的进程。

    • ps aux:显示所有用户的所有进程(BSD 风格)。
    • ps -ef:显示所有进程的完整格式(System V 风格)。
    • 通常两者结合 grep 使用,如 ps aux | grep nginx 来查找 nginx 进程。
  • kill: 向进程发送信号(通常是终止)。

    • kill PID:终止指定 PID (Process ID) 的进程(发送 TERM 信号)。
    • kill -9 PID:强制杀死进程(发送 KILL 信号),这是一种最后的手段。
  • killall: 按进程名称杀死进程。

    • killall firefox
  • jobs, fg, bg: 作业控制。

    • 在一个命令后按 Ctrl+Z 可以将其暂停并放到后台。
    • jobs:查看后台作业。
    • bg:让一个暂停的作业在后台继续运行。
    • fg %N:将第 N 个作业切换到前台运行。

类别五:权限和所有权

  • chmod (Change Mode):修改文件或目录的权限。

    • 权限分为读(r=4)、写(w=2)、执行(x=1)三种。
    • 对象分为所有者(u)、所属组(g)、其他用户(o)。
    • 数字模式chmod 755 script.sh
      • 7 = 4+2+1 (rwx) -> 所有者有读、写、执行权限。
      • 5 = 4+0+1 (r-x) -> 所属组有读、执行权限。
      • 5 = 4+0+1 (r-x) -> 其他用户有读、执行权限。
    • 符号模式
      • chmod u+x file.txt:为所有者(u)增加(+)执行(x)权限。
      • chmod g-w file.txt:为所属组(g)移除(-)写(w)权限。
      • chmod o=r file.txt:将其他用户(o)的权限设置为(=)只读(r)。
    • chmod -R 755 /path/to/dir:递归修改目录及内部所有内容的权限。
  • chown (Change Owner):修改文件或目录的所有者和所属组。

    • chown user:group file.txt
    • chown -R user:group /path/to/dir:递归修改。
  • sudo (Superuser Do):以超级用户(root)的权限执行命令。

    • sudo apt update:需要 root 权限才能更新软件包列表。

类别六:网络

  • ping: 测试与另一台主机的网络连通性。

    • ping google.com
  • ip / ifconfig: 查看和配置网络接口。ip 是现代 Linux 系统中推荐的命令。

    • ip addr showifconfig:显示所有网络接口的 IP 地址等信息。
  • ssh (Secure Shell):安全地远程登录到另一台主机。

    • ssh user@hostname
  • scp (Secure Copy):通过 SSH 安全地在本地和远程主机之间复制文件。

    • scp local_file.txt user@remote:/path/:本地复制到远程。
    • scp user@remote:/path/remote_file.txt .:远程复制到本地当前目录。
  • rsync: 一个功能更强大的文件同步工具,支持增量同步。

  • wget / curl: 从网络上下载文件。curl 功能更强大,常用于 API 测试。

    • wget https://example.com/file.zip
    • curl -O https://example.com/file.zip
  • netstat / ss: 显示网络连接、路由表等信息。ssnetstat 的现代替代品,速度更快。

    • ss -tunlp:显示所有监听中的 TCP/UDP 端口及对应的程序。

类别七:搜索

  • find: 在文件系统中按条件搜索文件。

    • find /path/to/search -name "*.log":按文件名搜索。
    • find . -type f -mtime -7:在当前目录(.)下查找类型为文件(-type f)且在过去7天内被修改过(-mtime -7)的文件。
    • find . -size +100M:查找大于 100MB 的文件。
  • locate: 使用一个预先建立的数据库来快速查找文件,速度比 find 快,但可能不是最新的。

    • sudo updatedb:更新数据库。
    • locate my_file.conf

类别八:归档和压缩

  • tar (Tape Archive):将多个文件或目录打包成一个 .tar 文件,也可以结合压缩工具使用。

    • tar -cvf archive.tar /path/to/dirc(reate) 创建,v(erbose) 显示过程,f(ile) 指定文件名。
    • tar -xvf archive.tarx(extract) 解包。
    • tar -tvf archive.tart(est) 查看包内文件列表。
    • 结合 gzip 压缩 (.tar.gz.tgz)
      • 压缩:tar -czvf archive.tar.gz /path/to/dir
      • 解压:tar -xzvf archive.tar.gz
    • 结合 bzip2 压缩 (.tar.bz2): 使用 -j 选项。
    • 结合 xz 压缩 (.tar.xz): 使用 -J 选项。
  • zip / unzip: 用于处理 Windows 中常见的 .zip 格式。

    • zip -r archive.zip /path/to/dir
    • unzip archive.zip

类别九:软件包管理

不同的 Linux 发行版使用不同的包管理器。

  • Debian/Ubuntu (使用 APT)

    • sudo apt update:刷新可用软件包列表。
    • sudo apt upgrade:升级所有已安装的软件包。
    • sudo apt install package_name:安装一个新包。
    • sudo apt remove package_name:卸载一个包。
    • apt search keyword:搜索软件包。
  • Red Hat/CentOS/Fedora (使用 DNF/YUM)

    • sudo dnf check-update
    • sudo dnf upgrade
    • sudo dnf install package_name
    • sudo dnf remove package_name
    • dnf search keyword

第三部分:命令的组合与重定向

单个命令功能有限,但将它们组合起来,威力无穷。

1. I/O 重定向

  • > (输出重定向):将命令的 标准输出 (stdout) 重定向到一个文件(会覆盖文件原有内容)。

    • ls -l > file_list.txt:将 ls -l 的结果写入 file_list.txt
  • >> (追加重定向):将标准输出追加到文件末尾。

    • echo "New log entry" >> app.log
  • < (输入重定向):将文件的内容作为命令的 标准输入 (stdin)

    • wc -l < file_list.txt:统计 file_list.txt 的行数。
  • 2> (错误重定向):将命令的 标准错误 (stderr) 重定向到一个文件。

    • command_that_fails 2> error.log
  • &>2>&1: 将标准输出和标准错误都重定向到同一个地方。

    • ./run_script.sh > script.log 2>&1

2. 管道 (Pipe |)

管道是 Linux 中最强大的功能之一。它将前一个命令的 标准输出 直接作为后一个命令的 标准输入,形成一个处理流水线。

经典示例:

  1. 统计当前目录下的文件数量:

    1
    ls -l | grep "^-" | wc -l
    • ls -l:列出详细信息。
    • grep "^-":筛选出以 - 开头的行(这些是文件,目录以 d 开头)。
    • wc -l:统计最终结果的行数。
  2. 查找占用 CPU 最多的 5 个进程:

    1
    ps aux --sort=-%cpu | head -n 6
    • ps aux --sort=-%cpu:列出所有进程,并按 CPU 使用率降序排序。
    • head -n 6:取前 6 行(包括标题行)。

第四部分:如何获取帮助?

你不可能记住所有命令和选项。学会如何查找帮助至关重要。

  • man (Manual):查看命令的官方手册页。这是最权威的帮助来源。

    • man ls:查看 ls 的手册。在 man 页面中,按 q 退出。
  • command --help: 大多数命令都支持 --help 选项,可以快速显示其用法和选项列表。

    • ls --help
  • info: 提供比 man 更详细的 GNU 文档。

    • info coreutils
  • aproposman -k: 根据关键词搜索相关的 man 页面。

    • apropos "copy files"