Skip to content

Shell 命令备忘

约 1824 个字 45 行代码 预计阅读时间 7 分钟

基本命令

在路径中,. 表示的是当前目录,而 .. 表示上级目录:

文件权限:drwxrwxr-x 第一个字符 d 表示是一个文件夹。然后接下来的九个字符,每三个字符构成一组。 (rwx). 它们分别代表了文件所有者(Owner),用户组(Group) 以及其他所有人(Others)具有的权限。其中 - 表示该用户不具备相应的权限。

最简单的重定向是 < file> file。这两个命令可以将程序的输入输出流分别重定向到文件

使用 >> 来向一个文件追加内容。

| 操作符允许我们将一个程序的输出和另外一个程序的输入连接起来

命令 详细
cd change directory:切换目录
ls 列出当前目录,-l 带详细参数
pwd print working directory:显示当前工作目录
mv 用于重命名或移动文件
cp 拷贝文件
rm 删除文件,-r 可以递归删除
mkdir make directory:创建文件夹
tree 目录结构
broot 更加便捷的目录结构
man command_name 返回command_name的用户手册
which command_name 返回与command_name关联的可执行文件的路径

Shell 脚本

Bash中的字符串通过'"分隔符来定义,但是它们的含义并不相同。以'定义的字符串为原义字符串,其中的变量不会被转义,而 "定义的字符串会将变量值进行替换。

Bash中的字符串通过'"分隔符来定义,但是它们的含义并不相同。以'定义的字符串为原义字符串,其中的变量不会被转义,而 "定义的字符串会将变量值进行替换。

退出码可以搭配 &&(与操作符)和 ||(或操作符)使用,用来进行条件判断,决定是否执行其他程序。它们都属于短路运算符(short-circuiting) 同一行的多个命令可以用;分隔。

false && echo "Will not be printed"
#

false ; echo "This will always run"
# This will always run
  • 通配符 - 当你想要利用通配符进行匹配时,你可以分别使用 ?* 来匹配一个或任意个字符。例如,对于文件foo, foo1, foo2, foo10bar, rm foo?这条命令会删除foo1foo2 ,而rm foo* 则会删除除了bar之外的所有文件。
  • 花括号{} - 当你有一系列的指令,其中包含一段公共子串时,可以用花括号来自动展开这些命令。这在批量移动或转换文件时非常方便。
convert image.{png,jpg}
# 会展开为
convert image.png image.jpg

cp /path/to/project/{foo,bar,baz}.sh /newpath
# 会展开为
cp /path/to/project/foo.sh /path/to/project/bar.sh /path/to/project/baz.sh /newpath

# 也可以结合通配使用
mv *{.py,.sh} folder
# 会移动所有 *.py 和 *.sh 文件

# 下面命令会创建foo/a, foo/b, ... foo/h, bar/a, bar/b, ... bar/h这些文件
touch {foo,bar}/{a..h}

注意,脚本并不一定只有用 bash 写才能在终端里调用。比如说,这是一段 Python 脚本,作用是将输入的参数倒序输出:

#!/usr/local/bin/python
import sys
for arg in reversed(sys.argv[1:]):
    print(arg)

内核知道去用 python 解释器而不是 shell 命令来运行这段脚本,是因为脚本的开头第一行的 shebang

shebang 行中使用 env 命令是一种好的实践,它会利用环境变量中的程序来解析该脚本,这样就提高来您的脚本的可移植性。env 会利用我们第一节讲座中介绍过的PATH 环境变量来进行定位。 例如,使用了env的shebang看上去时这样的#!/usr/bin/env python

查找文件

1. fd 命令

fd 是一个简单、快速和用户友好的 find 替代品。它有更简单的语法和色彩输出,而且默认忽略 .gitignore 中的文件。

sudo apt install fd-find

注意:在 Ubuntu 中,fd 命令实际上被命名为 fdfind,以避免与另一个名为 fd 的已存在软件包冲突。因此,你应该使用 fdfind 而不是 fd 来运行该程序。如果你希望将 fdfind 命令改为 fd,你可以通过创建一个别名来实现。

常用命令和示例:

  1. 搜索当前目录及子目录中的所有 .rs 文件:
fd "\.rs$"
  1. 在指定目录中搜索所有 .py 文件:
fd "\.py$" /path/to/directory
  1. 忽略大小写搜索文件:

    fd -I "filename"
    
    - -I 选项使搜索变为不区分大小写。

  2. 搜索并执行命令(例如,搜索 .log 文件并删除它们):

    fd "\.log$" -X rm
    
    - -X 选项后跟命令(这里是 rm),对搜索结果执行该命令。

  3. 结合使用正则表达式:

    fd "^[a-zA-Z]+\.(txt|md)$"
    
    - 这会搜索所有以 .txt.md 结尾的文件,文件名只包含字母。

2. find 命令

find 命令的基本语法是:

find [路径] [选项] [动作]

常用命令和示例:

  1. 搜索当前目录中的所有文件和目录:

    find .
    
  2. 在指定目录中搜索所有 .txt 文件:

    find /path/to/directory -type f -name "*.txt"
    
    • /path/to/directory 是你想要搜索的目录。
    • -type f 表示你只对文件感兴趣。
    • -name "*.txt" 限定了文件名必须以 .txt 结尾。
  3. 搜索大于 50MB 的文件:

    find / -size +50M
    
    • / 表示从根目录开始搜索。
    • -size +50M 表示搜索大于 50MB 的文件。
  4. 删除所有 .tmp 文件:

    find /path/to/directory -type f -name "*.tmp" -delete
    
    • -delete 动作会删除所有匹配的文件。
  5. 基于修改时间搜索文件(例如,过去 7 天内修改的文件):

    find /path/to/directory -type f -mtime -7
    
    • -mtime -7 表示搜索在过去 7 天内修改过的文件。

查找内容

1. rg (Ripgrep) 命令

rg 或 Ripgrep 是一个现代的文本搜索工具,它速度非常快,并默认递归地搜索。

安装:sudo apt-get install ripgrep

常用命令和示例:

  1. 在当前目录及子目录中搜索文本:

    rg "search_pattern" -A 5
    

    Ripgrep 默认递归搜索,这将在当前目录及其所有子目录中搜索 search_pattern

    -A 参数用于指定在匹配到的行后显示的附加行数,即上下文行数。

  2. 在指定目录中搜索文本:

    rg "search_pattern" /path/to/directory
    
  3. 只显示匹配的文件名:

    rg -l "search_pattern"
    

    -l 选项只会列出含有匹配文本的文件名。

  4. 搜索所有不匹配的行(反向搜索):

    rg -v "search_pattern" filename
    

    -v 选项会显示所有不包含 search_pattern 的行。

    filenamerg 命令中用于指定搜索范围的参数,可以是单个文件、多个文件,甚至是目录的路径。

  5. 搜索匹配特定文件模式的文件:

    rg "search_pattern" -g "*.rs"
    

    -g 选项可以指定一个 glob 模式,仅在匹配该模式的文件中进行搜索。

2. grep 命令

grep 是一个经典的命令行工具,用于在文件或者标准输入中搜索与正则表达式匹配的行。

常用命令和示例:

  1. 在文件中搜索文本:

    grep "search_pattern" filename
    
    这个命令会在 filename 文件中搜索含有 search_pattern 的所有行。

  2. 递归搜索目录中的所有文件:

    grep -r "search_pattern" /path/to/directory
    
    -r 选项让 grep 递归地搜索指定目录及其子目录中的所有文件。

  3. 显示匹配行的行号:

grep -n "search_pattern" filename
-n 选项会在输出中包含每个匹配行的行号。

  1. 只打印匹配的文件名,而不是匹配的内容:

    grep -l "search_pattern" /path/to/directory/*
    
    -l 选项只列出含有匹配文本的文件名。

  2. 在搜索中排除特定文件:

    grep --exclude=*.log "search_pattern" /path/to/directory
    
    --exclude 选项可以用来排除符合模式的文件。

Vim

用于normal mode的一些符号和命令

常用符号

符号 详细
j
k
/ 搜索模式
w word:词
0 跳到行初
$ 跳到行尾
gg 跳到文件头
G 跳到文件尾

常用命令

命令 详细
/ac 从当前位置找到第一个 ac,摁 n 下一个
. 重复上一次的命令
dd 删除当前行
d$ 删除到行尾
dG 删除到文件尾
ggdG 删除所有
o open a new line:在当前行之下插入行
5j 向下移动5行
5k 向上移动5行

Last update: May 14, 2024
Created: January 21, 2024