﻿---
title: Linux Commands
date: 2024-03-10
excerpt: 记录常用的Linux命令,快捷键和插件,以及推荐的terminal&shell;
tags:
  - Linux
cover: https://assets.vluv.space/cover/Dev/linuxcmds.webp
---

## Commands 分类

- CLI (Command Line Interface)：较灵活但因繁琐而难记；如 `cd` 、`ls` 等命令
- TUI (Termianl User Interface)：试图在字符终端上提供友好的用户界面，如 `vim`、`htop` 等
- GUI (Graphical User Interface)：直观易记但不灵活。如 `explorer`、`Finder` 等

## 文件操作

Linux 系统中，文件操作是非常重要的一部分，以下是一些常用的文件操作命令及其作用：

### 目录操作

- ls 列出目录内容

  - 作用：显示指定目录下的文件和文件夹列表。
  - 查询指定文件夹下的文件个数`ls -A <folder_path> wc -l`

  `-rwxrwxrwx`中`-`表示类型为普通文件，若为`d`则表示为目录。`rwx rwx rwx`分别表示文件所有者、组用户以及其它用户对该文件的权限，第一个`efterklang`为文件所有者，第二个为文件所有者所在的组，1093 表示文件大小(Byte)，时间为 last modified time，结尾为 file name

  ```shell
  $ ls -l ./
  total 4
  -rwxrwxrwx 1 efterklang efterklang 1093 Dec 20 17:02 LICENSE
  drwxrwxrwx 1 efterklang efterklang 4096 Jun  9 20:50 backdrops
  drwxrwxrwx 1 efterklang efterklang 4096 Apr 26 14:57 colors
  drwxrwxrwx 1 efterklang efterklang 4096 May 31 18:06 config
  drwxrwxrwx 1 efterklang efterklang 4096 May 25 16:57 events
  drwxrwxrwx 1 efterklang efterklang 4096 May 26 10:28 utils
  -rwxrwxrwx 1 efterklang efterklang  516 May 27 12:19 wezterm.lua
  ```

- cd 改变当前目录
  - 作用：切换当前工作目录到指定的路径。
  - cd ~ 切换到用户主目录 cd / 切换到根目录 cd .. 切换到上一级目录 cd - 切换到上次工作目录
  - 现代的 cd 替换命令: zoxide,z
- pwd 打印工作目录
  - 作用：显示当前工作目录的完整路径。
- cp 复制文件或目录
  - 作用：将文件或目录从一个位置复制到另一个位置。
- mv 移动或重命名文件
  - 作用：移动文件或目录到新的位置，或者重命名文件或目录。
  - 重命名/移动文件 `mv <old_name> <new_name>` `mv <old_path> <new_path>`
  - 将指定文件夹下的所有文件移动到另一个指定的目录`mv <source_folder>/* <target_folder>`
- rm 删除文件或目录
- touch 创建空文件或更新文件时间戳
- mkdir 创建目录
- rmdir 删除空目录

### 权限设置

- chmod 更改文件或目录权限
- chown 更改文件或目录的所有者
- chgrp 更改文件或目录的组
- cat 连接文件并打印到标准输出
  - 作用：显示文件的内容。
- more 分页显示文件内容
  - 作用：分页显示文件的内容，便于查看长文件。
- less 显示文件内容，支持前后翻页
  - 作用：显示文件的内容，支持向前和向后翻页。
- head 显示文件的开头部分

  - 作用：显示文件的前几行，默认是前 10 行。

  ```bash
  head filename.txt  # 显示文件的前10行
  head -n 20 filename.txt  # 显示文件的前20行
  ```

- tail 显示文件的结尾部分

  - 作用：显示文件的最后几行，默认是最后 10 行。

  ```bash
  tail filename.txt  # 显示文件的最后10行
  tail -n 20 filename.txt  # 显示文件的最后20行
  tail -f filename.txt  # 实时显示文件新增的内容
  ```

- find 搜索文件
  - 作用：在指定目录及其子目录下搜索符合条件的文件。
- diff 比较文件差异
  - 作用：比较两个文件或目录的差异。
- ln 创建链接
  - 作用：创建文件或目录的硬链接或符号链接。
- du 磁盘使用情况
  - 作用：显示文件或目录占用的磁盘空间。
- df 磁盘空间使用情况
  - 作用：显示文件系统磁盘空间的使用情况。
- tar 打包压缩或解压文件
  - 作用：创建、查看或解压缩 tar 包。
- gzip 压缩或解压文件
  - 作用：使用 gzip 程序压缩或解压文件。

nohup 命令可以在退出 shell 后继续运行进程，`nohup <command> &`
例如 `nohup python ./train.py >> train.log 2>&1 &`

## 用户管理

### 用户登录系统

超级用户的用户名为 root，密码在安装系统时已设定，当用户正确地输入用户名和口令后，就能合法地进入系统。
普通用户在建立了普通用户账号以后就可以进行登录了。

- `su root` 临时切换到 root 用户，需要输入密码，切换后环境变量不变，取得 root 的部分权限，且只能使用当前用户 path 路径中的命令，不能使用 root 用户 path 路径中的独有命令
- `su - root` 切换为 root 用户，需要输入密码，切换后环境变量改变，几乎可以不受限制的做任何事
- `su - <user_name>` 切换用户
- `su - username -c <command>`:Execute a command as another user
- `exit/logout` 退出当前用户

### 账号管理

Linux 用户对账号的管理分为：增、删、改三个方面：

**增加新用户**
`useradd <option> <user_name>`
-c comment，指定一段注释性描述。
-d 目录，指定用户主目录，如果此目录不存在，则同时使用-m 选项，可以创建主目录。
-g 用户组，用来指定这个用户默认的用户组。
-G 用户组，一般配合‘-a’来完成向其它组添加。
-s Shell 文件，指定用户的登录 Shell。
-u 用户号，指定用户的用户号，如果同时有-o 选项，则可以重复使用其他用户的标识号。

**删除用户**

删除用户账号就是要将/etc/passwd 等系统文件中的该用户记录删除，必要时还删除用户的主目录。删除一个已有的用户账号使用 userdel 命令，其格式如下：

`userdel <option> <user_name>`
常用的选项是-r，它的作用是把用户的主目录一起删除。

**修改用户**

使用 usermod 命令，其格式如下：
`usermod <option> <user_name>`

常用的选项包括-c,-d,-m,-g,-G,-s,-u 以及-o 等，这些选项的意义与 useradd 命令中的选项一样，可以为用户指定新的资源值。
修改用户账号就是根据实际情况更改用户的有关属性，如用户号、主目录、用户组、登录 Shell 等。

### 用户权限管理

命令`chmod` 用于修改文件的访问权限

- format: `chmod <mode> <file>`
- mode:
  - user: u(user，所有者),g(group，同组用户),o(other，其它用户),a(all)
  - operation: +（添加权限）、-（移除权限）或 =（设置权限）
  - permission: r(read)、w(write)、x(execute)、s(setuid，设置用户 ID)、t(setgid，设置组 ID)

## Regular Expression

`grep` 是一种强大的文本搜索工具，它允许用户在文件中搜索匹配特定模式的行。这里有一些 `grep` 的使用案例：
[RIPgrep GUIDE](https://github.com/BurntSushi/ripgrep/blob/master/GUIDE.md)

参数

- i: 忽略大小写 ignore
- n: 显示行号 number
- v: 反向匹配 invert
- r/R: 递归搜索，即在目录及其所有子目录中搜索文件(ps:ripgrep 默认支持递归搜索) recursive
  - R 支持软链接的解引用

1. **基本搜索**：在文件中搜索特定的文本。例如，如果你想在文件 `example.txt` 中搜索单词 "hello"，你可以使用以下命令：

   ```bash
   grep "hello" example.txt
   ```

2. **递归搜索**：`grep` 可以递归地在目录中搜索文件。例如，如果你想在当前目录及其所有子目录中搜索单词 "hello"，你可以使用 `-r` 或 `-R` 选项：

   ```bash
   grep -r "hello" .
   ```

3. **反向匹配**：`grep` 还可以找出不匹配特定模式的行。例如，以下命令会显示 `example.txt` 中所有不包含 "hello" 的行：

   ```bash
   grep -v "hello" example.txt
   ```

4. **指定开头/结尾**

   ```bash
    grep "^May" dairy.md # 匹配以May开头的行
    grep "hello$" example.txt # 匹配以hello结尾的行
   ```

## Emacs Mode ShortCuts

```wikitext
Ctrl + L clear
Ctrl + K 删除从光标位置到行尾的内容
Ctrl + U 删除从光标位置到行首的内容
Ctrl + A：移动光标到行首
Ctrl + E：移动光标到行尾
Ctrl + R：搜索历史命令
Ctrl + C：终止进程
Ctrl + D：退出 shell
Tab：自动补全
```
