Shell 编程

Linux系统是一个类Unix操作系统,它采用分层的设计,其中Shell是用户与内核之间的接口层。用户可以通过Shell来执行各种系统命令、管理文件、启动进程等。

Shell通常被称为解释器,因为它解释和执行用户在命令行中输入的命令或脚本。Shell解释器接收用户的命令,并将其翻译为操作系统能够理解和执行的指令。这种解释性的特性使得用户能够直接与操作系统进行交互,同时也使得编写和执行脚本更为灵活。Shell解释器本身也是一个程序,它可以用不同的编程语言编写。常见的Shell解释器有Bash(Bourne Again SHell)、Zsh(Z Shell)、Fish等,它们分别用C语言编写。例如,Bash是用C语言实现的,而Zsh也是用C语言和一些模块化的代码实现的。每个Shell解释器的代码基础可能会有所不同,但它们的主要目标是提供一个交互式的命令行环境和执行脚本的能力。

Shell编程语言是一种脚本语言,主要用于编写Shell脚本。这种语言的主要目的是简化和自动化与操作系统的交互,通过一系列命令和控制结构来完成特定的任务。Shell编程语言并非像传统编程语言(如C、Java)那样被编译成机器码,而是由Shell解释器逐行解释执行。

任何编程语言都是由顺序语句、条件语句和循环语句构成,shell编程语言也不例外。下面将介绍shell编程的语法和常见命令。

数据类型

# 定义字符串变量
string_variable="Hello, World!"

# 定义整数变量
integer_variable=42

# 定义浮点数变量
float_variable=3.14

# 定义布尔变量
boolean_variable=true

# 定义数组
my_array=("apple" "banana" "orange")

# 定义关联数组
declare -A fruit_color
fruit_color=([apple]="red" [banana]="yellow" [orange]="orange")

# 打印数组元素
echo "Array Elements: ${my_array[@]}"

# 打印关联数组元素
for fruit in "${!fruit_color[@]}"; do
    echo "$fruit is ${fruit_color[$fruit]}";
done

运算符

##  算术运算符

  • +:加法
  • -:减法
  • *:乘法
  • /:除法
  • %:取余

# 例子

a=5
b=3
result=$((a + b))
echo "Arithmetic Result: $result"

##  关系运算符

  • -eq:等于
  • -ne:不等于
  • -gt:大于
  • -lt:小于
  • -ge:大于等于
  • -le:小于等于

# 例子
if [ $a -eq $b ]; then
    echo "Relation: a is equal to b"
else
    echo "Relation: a is not equal to b"
fi

##  逻辑运算符

  • &&:逻辑与(AND)
  • ||:逻辑或(OR)
  • !:逻辑非(NOT)

# 例子
if [ $a -gt 0 ] && [ $b -gt 0 ]; then
    echo "Logical: Both a and b are greater than 0"
else
    echo "Logical: At least one of them is not greater than 0"
fi

##  字符串运算符

  • =:相等
  • !=:不相等
  • -z:长度为零
  • -n:长度不为零

# 例子
str1="hello"
str2="world"
if [ "$str1" = "$str2" ]; then
    echo "String: Strings are equal"
else
    echo "String: Strings are not equal"
fi

特殊变量

1、$0
获取当前脚本的文件名
2、$n
获取当前脚本的第n个参数,如果n大于9,则要用大括号,例如${10},接的参数以空格隔开
3、$#
获取当前脚本的参数个数
4、$*
获取当前脚本的参数,不加引号和$@相同;如果加引号,如”$*”,则表示将所有参数视为单个字符串
5、$@
如果加双引号,传参是将参数视为不同的独立字符串。这是将多参数传递给其它程序的最佳方法,因为它会保留所有的内嵌在每个参数里的任何空白

## 示例:

set -- zhangsan lisi wangwu  # --表示清除所有的参数变量,重新设置后面的参数变量

echo $#         # 输出参数个数 3
echo $1         # zhangsan
echo $*         # zhangsan lisi wangwu
echo $@         # zhangsan lisi wangwu

for i in $*; do
   echo $i
done
# 输出:
# zhangsan
# lisi
# wangwu

for i in $@; do
   echo $i
done
# 输出:
# zhangsan
# lisi
# wangwu

echo "$*"       # zhangsan lisi wangwu
echo "$@"       # zhangsan lisi wangwu

for i in "$*"; do
   echo $i
done
# 输出:
# zhangsan lisi wangwu

for i in "$@"; do
   echo $i
done
# 输出:
# zhangsan
# lisi
# wangwu

条件语句

# 第一种

if [ condition ]; then
    # 代码块
elif [ another_condition ]; then
    # 代码块
else
    # 代码块
fi

# 第二种

case 值 in
    模式1)
        # 代码块1
        ;;
    模式2)
        # 代码块2
        ;;
    *)
        # 默认情况,如果没有匹配的模式
        ;;
esac

循环语句

# 第一种

for i in {1..5}; do
    # 循环体
done

# 第二种

# while 条件为真时执行循环

while [ condition ]; do
    # 循环体
done

# 第三种

# until 条件为假时执行循环

until [条件]
do
    # 代码块
done

读取文件

while IFS= read -r line; do
    echo "$line"
done < filename
# While循环读取每行,IFS是分隔符设置,read读取标准输入,-r用于防止反斜杠的转义

命令替换

命令替换:一种在Shell脚本或命令行中执行命令并用其输出替换原始命令的机制

两种方式:

1、result=`pwd`

2、result=$(pwd)

文件路径操作

##   获取文件的完整路径
1、realpath filename
2、readlink -f filename
##   通过路径获取文件名称或路径
1、dirname /opt/server/a.txt 
2、basename /opt/server/a.txt

Eval:执行字符串

##   用于执行字符串作为 Shell 命令

variable="World"

command="echo Hello, \$variable!"

eval $command

# 最终输出 Hello World

后台运行、脚本暂停、继续

1、通过在脚本结尾使用&符号在后台运行脚本
使用bash while_01.sh &命令,即使用&在后台运行脚本
使用nohup uptime.sh &命令,即使用nohup加&在后台运行脚本
2、常用操作
用法                                         说明
sh whilel.sh                         把脚本while1.sh放到后台执行(在后台运行脚本时常用的方法)
ctl+c                                    停止执行当前脚本或任务
ctl+z                                    暂停执行当前脚本或任务
bg                                       把当前脚本或任务放到后台执行,bg可以理解为background
fg                                      把当前脚本或任务放到前台执行,如果有多个任务,可以使用g加任务编号调出对应的脚本任务,如fg2,是指调出第二个脚本任务,fg可以理解为frontground
jobs                                    查看当前执行的脚本或任务
kill                                    关闭执行的脚本任务,即以“kill %number”的形式关闭脚本,这个任务编号,可以通过jobs来获得

定时任务Cron (Command Run On)

用于定期执行任务的系统工具,允许用户在预定的时间间隔内自动执行指定的命令或脚本

crontab -e            # 编辑当前用户的 cron 表
#  cron 表格式

# m h  dom mon dow   command

# 分钟 (minute): 表示一小时中的哪一分钟执行任务,范围是 0 到 59。

# 小时 (hour): 表示一天中的哪一小时,范围是 0 到 23。

# 日 (dom, day of month): 表示一个月中的哪一天,范围是 1 到 31。

# 月 (month): 表示一年中的哪一个月,范围是 1 到 12。

# 星期几 (dow, day of week): 表示一周中的哪一天,范围是 0(星期日)到 6(星期六)。

在Cron表达式中,每个字段都可以使用数字或者通配符 *。通配符 * 表示“任意值”,因此 * * * * * 表示每分钟都执行任务。

## 示例

# 示例1 每周一的凌晨5点执行命令
0 5 * * 1 tar -zcf /var/backups/home.tgz /home/

# 示例2 每分钟同步一下文件到服务器(-a增量更新,--delete删除不同)

* * * * * rsync -avz --delete -e "ssh -i /path/private/key" /local/path/ user@remote:/remote/path/

## 示例3 每天的7点到22点之间,每5分钟

*/5 7-22 * * *

常用文件管理命令

ls                                                           # 列出当前目录内容
cd /path/to/directory                              # 切换到指定目录
pwd                                                       # 显示当前工作目录
cp source_file destination                     # 复制文件
mv source destination                           # 移动文件
rm file_or_directory                               # 删除文件
mkdir new_directory                              # 创建新目录
rmdir empty_directory                           # 删除空目录
touch new_file                                       # 创建空文件
cat file_name                                         # 查看文件内容

zcat fime_name.gz                                # 查看压缩文件内容
head file_name                                      # 显示文件开头几行
tail file_name                                         # 显示文件末尾几行

wc -cwl file_name                                  # 统计文本字节数c、字数w、行数l

|                                                             # 管道符,将一个命令的输出传给另一个命令的输入

> file_name                                           # 输出重定向,将输出写入文件
>> file_name                                         # 追加重定向,将输出追加写入文件

ln source_file link_name                       # 创建硬链接
ln -s source_file link_name                   # 创建软链接

软件包管理命令 apt-get

## apt-get (Advanced Package Tool - Get )

sudo apt-get update                    # 更新软件包索引

sudo apt-get install nano             # 安装软件包(例如,安装 nano 文本编辑器)

sudo apt-get remove nano          # 删除软件包(例如,删除 nano 文本编辑器)

sudo apt-get upgrade                  # 升级系统上所有已安装的软件包到最新版本

Grep:只筛选

命令特点:

1、选用正则表达式或字符串一行一行地匹配搜索;

2、不能用行号选择特定行;

3、主要用于搜索行而不是列;

4、可输出整行或只匹配的字符;

5、从文件中的字符串提取另一个文件的行;

6、PATTERNS可以包含多个以换行符分隔的PATTERNS。

# 搜索文件中包含指定的 PATTERNS 的行
grep [OPTION]... PATTERNS [FILE]...

# PATTERNS 可以是正则表达式或字符串,每个 PATTERNS 之间以换行符分隔

# PATTERNS 选择和解释:
  -E, --extended-regexp    # 使用扩展正则表达式
  -F, --fixed-strings      # PATTERNS 是字符串
  -G, --basic-regexp       # PATTERNS 使用基本正则表达式
  -P, --perl-regexp        # PATTERNS 使用 Perl 正则表达式
  -e, --regexp=PATTERNS    # 使用指定的 PATTERNS 进行匹配
  -f, --file=FILE          # 从文件中获取 PATTERNS,每行一个
  -i, --ignore-case        # 在 PATTERNS 和数据中忽略大小写区别
      --no-ignore-case     # 不忽略大小写区别(默认)
  -w, --word-regexp        # 仅匹配整个单词
  -x, --line-regexp        # 仅匹配整行
  -z, --null-data          # 数据行以 0 字节结尾,而不是换行符

# 杂项:
  -s, --no-messages        # 抑制错误消息
  -v, --invert-match       # 选择非匹配行
  -V, --version            # 显示版本信息并退出
      --help               # 显示此帮助文本并退出

# 输出控制:
  -m, --max-count=NUM       # 选择指定数量的行后停止搜索
  -b, --byte-offset        # 在输出行中打印字节偏移量
  -n, --line-number        # 在输出行中打印行号
      --line-buffered      # 每行刷新输出
  -H, --with-filename      # 在输出行中打印文件名
  -h, --no-filename        # 在输出中抑制文件名前缀
      --label=LABEL        # 使用标签作为标准输入文件名前缀
  -o, --only-matching      # 仅显示匹配行中非空的部分,不整行
  -q, --quiet, --silent    # 抑制所有正常输出
      --binary-files=TYPE  # 假设二进制文件是 TYPE;TYPE 可以是 'binary'、'text' 或 'without-match'
  -a, --text               # 等同于 --binary-files=text
  -I                        # 等同于 --binary-files=without-match
  -d, --directories=ACTION  # 如何处理目录;操作可以是 'read'、'recurse' 或 'skip'
  -D, --devices=ACTION     # 如何处理设备、FIFO 和套接字;操作可以是 'read' 或 'skip'
  -r, --recursive          # 类似于 --directories=recurse;递归查找
  -R, --dereference-recursive # 同样,但会跟随所有符号链接
      --include=GLOB       # 仅搜索与通配符匹配的文件(文件 PATTERNS)
      --exclude=GLOB       # 跳过与通配符匹配的文件
      --exclude-from=FILE  # 跳过与文件中的任何文件 PATTERNS 匹配的文件
      --exclude-dir=GLOB   # 跳过与通配符匹配的目录
  -L, --files-without-match  # 仅打印没有选定行的文件名
  -l, --files-with-matches   # 仅打印包含选定行的文件名
  -c, --count              # 匹配的行计数
  -T, --initial-tab        # 使制表符对齐(如果需要的话)
  -Z, --null               # 在文件名后打印 0 字节

# 上下文控制:
  -B, --before-context=NUM  # 打印匹配前的 NUM 行上下文
  -A, --after-context=NUM   # 打印匹配后的 NUM 行上下文
  -C, --context=NUM         # 打印输出的 NUM 行上下文
  -NUM                      # 与 --context=NUM 相同
      --group-separator=SEP # 在具有上下文的匹配之间打印分隔符
      --no-group-separator  # 不为具有上下文的匹配打印分隔符
      --color[=WHEN], --colour[=WHEN] # 使用标记突出显示匹配的字符串;
                                      # WHEN 可以是 'always'、'never' 或 'auto'
  -U, --binary             # 不在行尾去除 CR 字符(适用于 MSDOS/Windows)

# 当文件为 '-' 时,读取标准输入。如果没有指定文件,则在递归时读取 '.';
# 否则读取 '-'
# 如果文件少于两个,则假定为 -h
# 如果选择了任何行,则退出状态为 0;否则为 1;如果发生任何错误且未给出 -q,
# 则退出状态为 2。

## 示例

# 在文件中搜索包含 'lisi' 的行,并排除这些行
grep -v "lisi" test.txt

# 从文件1中提取包含在文件2中的字符串的行
grep -F -f file1 file2

Sed:可筛选和更改原文件

# 用法:sed [OPTION]... {仅在没有其他脚本的情况下} [输入文件]...

# 行筛选与修改,可以直接修改原文档也可以输出流

# 选项:
  -n, --quiet, --silent     # 取消默认 sed 的输出,常与 sed 内置命令的连用
      --debug               # 注释程序执行过程
  -e script, --expression= script  # 允许多次编辑;将脚本添加到要执行的命令中
  -f script-file, --file= script-file  # 将脚本文件的内容添加到要执行的命令中
      --follow-symlinks    # 处理时跟随符号链接
  -i[SUFFIX], --in-place[=SUFFIX]  # 直接在文件中进行编辑(如果提供了后缀,则创建备份)
  -l N, --line-length=N    # 为 “l” 命令指定所需的换行长度
      --posix               # 禁用所有 GNU 扩展。
  -E, -r, --regexp-extended  # 在脚本中使用扩展的正则表达式(为了可移植性,请使用 POSIX -E)。
  -s, --separate           # 将文件视为单独的文件,而不是一个连续的长流。
      --sandbox            # 运行沙盒模式(禁用 e/r/w 命令)。
  -u, --unbuffered         # 从输入文件中加载最小量的数据,并更频繁地刷新输出缓冲区
  -z, --null-data          # 使用 NUL 字符分隔行
      --help               # 显示此帮助信息并退出
      --version            # 输出版本信息并退出

# sed 内置符
# 解释说明(带※的为重点)
a                          # 全拼 append,表示追加文本,在指定行后添加一行或多行文本※
d                          # 全拼 delete,表示匹配行的文本※
i                          # 全拼 insert,表示插入文本,在指定行前添加一行或多行文本※
p                          # 全拼 print,表示打印匹配行的内容,通常 p 会与选项 “-n” 一起使用※
s/regexp/replacement/g     # 匹配 regexp 部分内容,用 replacement 替换 regexp 匹配的内容,
                           # regexp 部分可以使用正则表达式,在 replacement 部分可以使用特殊字符 “&” 和 “1-9”
                           # 等匹配 regexp 的部分内容。在实战场景中,s/regexp/replacement/g 结尾常与 g 匹配做全局的替换※

# 如果未提供 -e、--expression、-f 或 --file 选项,则第一个非选项参数将被视为要解释的 sed 脚本。
# 所有剩余的参数都是输入文件的名称;如果没有指定输入文件,则读取标准输入。

# 示例:
# 文档 test.txt
# cat test.txt
# I am zhangsan
# I like badminton ball, billiard ball and Chinese chess
# my site is http://www.zhangsan.com
# my telephone is 123456

# 示例1、输出 test.txt 第2-3行的内容
sed -n '2,3p' test.txt   # -n 取消默认输出,利用 p 控制显示的行

# 示例2、过滤出含有 zhangsan 字符串的行,sed 命令的过滤功能,类似于 grep 的过滤,
# 不同的是需要用双斜线将需要过滤的字符串包含在中间。
sed -n '/zhangsan/p' test.txt

# 示例3、删除指定的行
sed -i '3d' test.txt     # 删除第3行
sed -i '5,8d' test.txt   # 删除5-8行

# 示例4、将文件中的 zhangsan 字符串全部替换为 lisi,sed 命令的替换功能,默认不会修改文件, 如果需要修改文件,则要用 -i 参数配合,这个命令在工作中比较常用。
sed 's#zhangsan#lisi#g' test.txt

# 示例5、g 表示全局替换,中间的间隔符号可以用 #@/ 等符号替代,前面表示需要替换的内容,后面表示替换后的内容,将文件中的 zhangsan 字符串全部替换为 lisi,同时将 telephone 号码 123456 改为 654321,sed 命令的 -e 参数,多项编辑功能
sed -e 's#zhangsan#lisi#g' -e 's#123456#654321#g' test.txt

# 示例6、在 test.txt 文件的第2行后追加文本,sed 命令的 a 字符功能
sed '2a hello' test.txt

# 示例7、也可以同时增加多行,不同的行之间使用 “\n” 间隔开,在 test.txt 文件的第2行插入文本,sed 命令的 i 字符功能
sed -i '2i test' test.txt

Awk:文本处理编程

Linux awk 命令 | 菜鸟教程

awk是一个强大的文本处理工具,通常用于在Unix和类Unix系统上进行文本和数据处理。它的名称是根据它的创始人Alfred Aho、Peter Weinberger和Brian Kernighan的姓氏首字母而来。awk要要用于从文本文件或数据流中提取和处理数据,支持文本匹配、模式识别、数据抽取和格式化输出

用法:awk [POSIX 或 GNU 风格选项] -f progfile [--] file ...
用法:awk [POSIX 或 GNU 风格选项] [--] 'program' file ...

POSIX 选项:                    GNU 长选项:(标准)
  -f progfile                 --file=progfile
  -F fs                      --field-separator=fs
  -v var=val                 --assign=var=val

短选项:                        GNU 长选项:(扩展)
  -b                         --characters-as-bytes
  -c                         --traditional
  -C                         --copyright
  -d[file]                   --dump-variables[=file]
  -D[file]                   --debug[=file]
  -e 'program-text'          --source='program-text'
  -E file                    --exec=file
  -g                         --gen-pot
  -h                         --help
  -i includefile             --include=includefile
  -l library                 --load=library
  -L[fatal|invalid|no-ext]   --lint[=fatal|invalid|no-ext]
  -M                         --bignum
  -N                         --use-lc-numeric
  -n                         --non-decimal-data
  -o[file]                   --pretty-print[=file]
  -O                         --optimize
  -p[file]                   --profile[=file]
  -P                         --posix
  -r                         --re-interval
  -s                         --no-optimize
  -S                         --sandbox
  -t                         --lint-old
  -V                         --version

## 示例

# 示例1: 打印文件的某一列
awk '{ print $2 }' filename

# 示例2: 计算文件中某一列的总和
awk '{ total += $1 } END { print "Sum: " total }' filename

# 示例3: 过滤并打印特定行
awk '/pattern/ { print }' filename

# 示例4: 打印包含特定字段的行
awk '$3 > 50 { print }' filename

# 示例5: 计算文件中每行字段的平均值
awk '{ total = 0; for (i=1; i<=NF; i++) total += $i; print "Average: " total/NF }' filename

# 示例6: 自定义字段分隔符并打印特定字段
awk -F',' '{ print $2 }' filename

# 示例7: 使用内置变量打印行号和行内容
awk '{ print NR, $0 }' filename

# 示例8: 格式化输出固定宽度的列
ps aux | awk '{ printf "%-10s %-10s %s\n", $1, $2, $11 }'

# 示例9: 在指定范围内执行操作
awk 'NR>=2 && NR<=5 { print $2, $3 }' filename

# 示例10: 删除重复行并打印唯一值
awk '!seen[$0]++' filename

Sort:排序

# 用法: sort [OPTION]... [FILE]...
#     或 sort [OPTION]... --files0-from=F
# 将所有文件的排序连接结果输出到标准输出。
# 如果没有指定文件或文件为 -,则读取标准输入。
# 长选项的强制性参数对于短选项也是强制性的。

# 排序选项:
  -b, --ignore-leading-blanks   # 忽略开头的空白字符
  -d, --dictionary-order        # 仅考虑空白和字母数字字符
  -f, --ignore-case             # 将小写折叠为大写字符
  -g, --general-numeric-sort    # 根据通用数值进行比较
  -i, --ignore-nonprinting      # 仅考虑可打印字符
  -M, --month-sort              # 比较(未知) < 'JAN' < ... < 'DEC'
  -h, --human-numeric-sort      # 比较人类可读的数字(例如,2K 1G)
  -n, --numeric-sort            # 根据字符串数值进行比较
  -R, --random-sort             # 随机排序,但对相同的键进行分组。
      --random-source=FILE      # 从 FILE 获取随机字节
  -r, --reverse                 # 反转排序的结果
      --sort=WORD               # 根据 WORD 进行排序:
                                # 通用数值 -g,人类可读数值 -h,月份 -M,
                                # 数值 -n,随机 -R,版本 -V
  -V, --version-sort            # 文本中的(版本)数字的自然排序

# 其他选项:
      --batch-size=NMERGE       # 一次合并最多 NMERGE 个输入;
                                # 要合并更多,请使用临时文件
  -c, --check, --check=diagnose-first  # 检查输入是否已排序;不进行排序
  -C, --check=quiet, --check=silent    # 类似于 -c,但不报告第一行错误
      --compress-program=PROG   # 使用 PROG 压缩临时文件;
                                # 使用 PROG -d 解压缩
      --debug                   # 对用于排序的行的部分进行注释,
                                # 并向 stderr 发出关于可疑用法的警告
      --files0-from=F          # 从文件 F 指定的以 NUL 结尾的名称读取输入
                                # 如果 F 为 -,则从标准输入读取名称
  -k, --key=KEYDEF             # 通过键进行排序;KEYDEF 指定位置和类型
                                # sort -k 2 按照第二行排列
  -m, --merge                  # 合并已排序的文件;不进行排序
  -o, --output=FILE            # 将结果写入 FILE,而不是标准输出
  -s, --stable                 # 通过禁用最后的比较来稳定排序
  -S, --buffer-size=SIZE       # 为主内存缓冲区使用 SIZE
  -t, --field-separator=SEP    # 使用 SEP 而不是非空格转为空格
  -T, --temporary-directory=DIR # 使用 DIR 作为临时目录,而不是 $TMPDIR 或 /tmp
                                # 多个选项指定多个目录
      --parallel=N             # 将并行运行的排序数量更改为 N
  -u, --unique                 # 去重:对于 -c,检查严格的顺序;
                                # sort -u 仅输出相等运行的第一个
  -z, --zero-terminated        # 行分隔符是 NUL,而不是换行符
      --help                   # 显示此帮助信息并退出
      --version                # 输出版本信息并退出

# KEYDEF 为 F[.C][OPTS][,F[.C][OPTS]],其中 F 为字段编号,C 为字段中的字符位置;
# 两者都是以 1 为起点,默认的停止位置为行的结尾。
# 如果既没有 -t 也没有 -b,则从前面的空白字符开始计算字段中的字符。
# OPTS 是一个或多个单字母排序选项 [bdfgiMhnRrV],它们覆盖该键的全局排序选项。
# 如果未指定键,则使用整行作为键。使用 --debug 来诊断不正确的键用法。
# SIZE 可以后跟以下乘法后缀:
# % 内存的 1%,b 1,K 1024(默认),以此类推,M、G、T、P、E、Z、Y。

# 示例:

sort -k 2       # 按照第二列排列

sort -u          #去重

Uniq:相邻去重

uniq [OPTION]... [INPUT [OUTPUT]]
# 只会相邻的去重!!!!!!

从输入(或标准输入)中过滤相邻的匹配行,将结果写入输出(或标准输出)。

如果没有选项,匹配的行将合并为第一次出现的行。

# 长选项的强制性参数对于短选项也是强制性的。
-c, --count                   # 在行前加上出现次数
-d, --repeated                # 仅打印重复的行,每组一个
-D                            # 打印所有重复的行
    --all-repeated[=METHOD]   # 类似于 -D,但允许用空行分隔组;
                               # METHOD={none(默认),prepend,separate}
-f, --skip-fields=N           # 避免比较前 N 个字段
    --group[=METHOD]          # 显示所有项目,用空行分隔组;
                               # METHOD={separate(默认),prepend,append,both}
-i, --ignore-case             # 比较时忽略大小写差异
-s, --skip-chars=N            # 避免比较前 N 个字符
-u, --unique                  # 仅打印唯一的行
                               # 只考虑相邻的!!!!
-z, --zero-terminated         # 行定界符是 NUL,而不是换行符
-w, --check-chars=N           # 在行中最多比较 N 个字符
    --help                    # 显示此帮助并退出
    --version                 # 输出版本信息并退出

字段是一系列空白字符(通常是空格和/或制表符),然后是非空白字符。在比较字符之前会跳过字段。

# 示例

uniq file.txt               # 基本去重
uniq -c file.txt           # 计数重复行
uniq -d file.txt           # 仅显示重复行
uniq -D file.txt          # 显示所有重复行
uniq -i file.txt            # 忽略大小写进行去重
uniq -u file.txt           # 仅打印唯一的行(只考虑相邻的)

Wc(word count计数)

wc [OPTION]... [FILE]...
  或:wc [OPTION]... --files0-from=F

为每个文件打印换行符、单词和字节计数,并在指定多个文件时打印总行数。一个单词是由空白字符分隔的非零长度字符序列。

如果没有指定文件,或者文件为 -,则读取标准输入。

下面的选项可以用来选择要打印的计数,总是按照以下顺序:换行符、单词、字符、字节、最大行长度。

  -c, --bytes               # 打印字节计数
  -m, --chars               # 打印字符计数
  -l, --lines               # 打印换行符计数
      --files0-from=F      # 从文件 F 中指定的以 NUL 结尾的名称读取输入
                            # 如果 F 为 -,则从标准输入读取名称
  -L, --max-line-length     # 打印最大显示宽度
  -w, --words               # 打印单词计数
      --help                # 显示此帮助并退出
      --version             # 输出版本信息并退出

## 示例

wc file.txt                 # 统计文件的行数、单词数、字节数
wc -l file.txt              # 只统计文件的行数
wc -w file.txt             # 只统计文件的单词数
wc -c file.txt             # 只统计文件的字节数
wc -m file.txt             # 只统计文件的字符数
wc -L file.txt              # 显示文件中最长行的长度

Cat:纵向合并

cat [OPTION]... [FILE]...
  或:cat [OPTION]... --files0-from=F

将文件的内容连接(concatenate)并输出到标准输出。纵向合并

如果没有指定文件,或者文件为 -,则读取标准输入。

将一段文字和文件纵向合并: echo "Hello World" | cat - 3.txt

  -A, --show-all          # 等同于 -vET
  -b, --number-nonblank   # 对非空输出行编号,会覆盖 -n
  -e                      # 等同于 -vE
  -E, --show-ends        # 在每行末尾显示 $ 符号
  -n, --number           # 对所有输出行编号
  -s, --squeeze-blank    # 抑制连续的空输出行
  -t                      # 等同于 -vT
  -T, --show-tabs        # 将 TAB 字符显示为 ^I
  -u                      # (忽略)
  -v, --show-nonprinting # 使用 ^ 和 M- 表示非打印字符,除了换行符和制表符
      --help             # 显示此帮助信息并退出
      --version          # 输出版本信息并退出

示例:
 cat f - g  # 输出文件 f 的内容,然后是标准输入,最后是文件 g 的内容。
 cat        # 将标准输入复制到标准输出。

Echo:类似Print

echo - 显示一行文本
echo [SHORT-OPTION]... [STRING]...
echo LONG-OPTION

描述
   将字符串 STRING(s) 输出到标准输出。

   -n                    # 不输出尾随的换行符
   -e                    # 启用反斜杠转义的解释
   -E                    # 禁用反斜杠转义的解释(默认)

   --help                # 显示此帮助信息并退出
   --version             # 输出版本信息并退出

如果启用了 -e,将会识别以下序列:
   \\                   # 反斜杠
   \a                   # 警告响铃(BEL)
   \b                   # 退格
   \c                   # 不再产生输出
   \e                   # 转义
   \f                   # 换页
   \n                   # 换行
   \r                   # 回车
   \t                   # 水平制表符
   \v                   # 垂直制表符
   \0NNN                # 八进制值为 NNN 的字节(1 到 3 个数字)
   \xHH                # 十六进制值为 HH 的字节(1 到 2 个数字)

注意:你的 shell 可能有自己的 echo 版本,通常会替代这里描述的版本。请查阅你的 shell 文档,了解它支持的选项详情。

Paste:横向合并

paste 命令用法:

  paste [OPTION]... [FILE]...

将由每个 FILE 中的顺序对应行以制表符分隔写入标准输出,实现横向合并。

如果没有指定 FILE,或者 FILE 为 -,则从标准输入读取。

选项包括:

  -d, --delimiters=LIST    # 重用 LIST 中的字符,而不是制表符
  -s, --serial             # 逐个文件粘贴,而不是并行粘贴
  -z, --zero-terminated    # 行分隔符是 NUL,而不是换行符
      --help               # 显示此帮助信息并退出
      --version            # 输出版本信息并退出

## 示例

paste file1.txt file2.txt                        # 将两个文件的内容以制表符分隔合并输出
paste -d',' file1.txt file2.txt                 # 使用逗号而不是制表符分隔两个文件的内容并输出
paste -s file1.txt file2.txt                    # 逐个文件粘贴两个文件的内容
paste -z file1.txt file2.txt                    # 将两个文件的内容以 NUL 分隔输出
echo -e "A\n1\nB\n2" | paste -          # 从标准输入读取两列数据,以制表符分隔输出

Exec:执行命令后退出

# exec 命令用法:
# 执行命令,用指定的程序替换当前的 shell。不创建子进程,执行该命令后自动退出。

exec [-cl] [-a name] [command [argument ...]] [redirection ...]

# 参数将成为命令的参数。如果未指定 COMMAND,则任何重定向将在当前 shell 中生效。

# 选项:
 -a name      # 将 NAME 作为零号参数传递给 COMMAND
 -c           # 以空环境执行 COMMAND
 -l           # 在零号参数中放置破折号(-)以供 COMMAND 使用

# 如果无法执行命令,则非交互式 shell 会退出,除非设置了 shell 选项 execfail。

# 退出状态:
# 除非未找到 COMMAND 或发生重定向错误,否则返回成功状态。

Export:导出变量或函数

# export 命令用法:
# 设置shell变量的导出属性。将每个名称标记为自动导出到随后执行的命令的环境中。如果提供了VALUE,则在导出之前赋值给VALUE。

export [-fn] [name[=value] ...] or export -p

# 选项:
-f      # 引用shell函数
-n      # 从每个名称中移除导出属性
-p      # 显示所有已导出的变量和函数的列表
--      # 禁用进一步的选项处理

# 退出状态:
# 除非给出无效的选项或NAME无效,否则返回成功。

# 示例:

# 1、设置环境变量:
export MY_VARIABLE=hello           # 将 MY_VARIABLE 设置为 hello

# 2、导出变量:
export MY_VARIABLE=world

# 3、显示已导出的变量和函数:
export -p

# 4、取消导出:
export -n MY_VARIABLE      # 取消 MY_VARIABLE 的导出属性,使其不再被传递到子进程

# 5、导出函数:
export -f my_function            # 将Shell函数 my_function 导出到子进程的环境中

Mv:移动、重命名文件

# mv 命令用法:
# 将 SOURCE 重命名为 DEST,或将一个或多个 SOURCE 移动到 DIRECTORY。

mv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY
mv [OPTION]... -t DIRECTORY SOURCE...

# 选项:
-b, --backup[=CONTROL]       # 对每个已存在的目标文件进行备份
-f, --force                  # 在覆盖之前不进行提示
-i, --interactive            # 在覆盖之前进行提示
-n, --no-clobber             # 不覆盖已存在的文件
--strip-trailing-slashes     # 从每个 SOURCE 参数中删除任何尾随斜杠
-S, --suffix=SUFFIX          # 覆盖通常的备份后缀
-t, --target-directory=DIRECTORY  # 将所有 SOURCE 参数移动到 DIRECTORY
-T, --no-target-directory    # 将 DEST 视为普通文件
-u, --update                 # 仅在源文件更新时间较新或目标文件不存在时才执行移动操作
-v, --verbose                # 解释正在执行的操作
-Z, --context                # 将目标文件的 SELinux 安全上下文设置为默认类型
--help                       # 显示此帮助信息并退出
--version                    # 输出版本信息并退出

# 备份后缀默认为“~”,除非使用 --suffix 或 SIMPLE_BACKUP_SUFFIX 进行设置。
# 版本控制方法可以通过 --backup 选项或通过 VERSION_CONTROL 环境变量进行选择。

# 示例:

# 1、移动文件或文件夹:
mv 文件或文件夹路径 目标文件夹路径

# 2、重命名文件或文件夹:
mv 原文件名 新文件名

# 3、将文件移动到上一级目录:
mv 文件名 ..

# 4、使用选项:
mv -i file directory    # 交互,在移动文件之前询问用户确认
mv -u file directory    # 更新,仅在源文件更新时间较新或目标文件不存在时才执行移动操作
mv -v file directory    # 详细,显示每次移动的操作。
mv -f file directory    # 强制,无需确认直接执行移动操作,可能会覆盖已存在的文件。
mv -n file directory    # 不覆盖,如果目标文件已存在,则不执行移动操作。

Read:读取用户输入等形式的输入

read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]

# 选项:
  -a array      将读取的单词按顺序分配给数组变量 ARRAY 的索引,从零开始
  -d delim      继续读取,直到读取到 DELIM 的第一个字符,而不是换行符
  -e            使用 Readline 获取行
  -i text       将 TEXT 用作 Readline 的初始文本
  -n nchars     读取 NCHARS 个字符后返回,而不是等待换行符,但如果在读取到 DELIMITER 之前读取的字符少于 NCHARS,则会遵循分隔符
  -N nchars     仅在读取完 Exactly NCHARS 个字符后返回,除非遇到 EOF 或读取超时,忽略任何分隔符
  -p prompt     在尝试读取之前输出字符串 PROMPT,无尾随换行符
  -r            不允许反斜杠转义任何字符
  -s            不要回显从终端输入的内容
  -t timeout    超时并在超过 TIMEOUT 秒内没有读取到完整的输入行时返回失败。TMOUT 变量的值是默认超时时间。TIMEOUT 可以是小数。如果 TIMEOUT 为 0,read 立即返回,而不尝试读取任何数据,仅在指定文件描述符上有可用输入时返回成功。如果超时,退出状态大于 128
  -u fd         从文件描述符 FD 中读取,而不是从标准输入中读取

# 退出状态:
# 返回代码为零,除非遇到文件结束、读取超时(此时大于 128)、变量赋值错误,或者将无效的文件描述符作为 -u 的参数。

## 示例

# 1. 读取用户输入并存储到变量
echo "What's your name?"
read name
echo "Hello, $name!"

# 2. 使用提示并读取用户输入
read -p "Enter your age: " age
echo "You are $age years old."

# 3. 读取多个值到数组
echo "Enter three favorite colors: "
read -a colors
echo "Your favorite colors are ${colors[0]}, ${colors[1]}, and ${colors[2]}."

# 4. 使用超时选项,等待用户输入或超时退出
read -t 5 -p "Enter something within 5 seconds: " userInput
if [ -z "$userInput" ]; then
    echo "Time's up!"
else
    echo "You entered: $userInput"
fi

# 5. 使用默认值
read -e -i "default_value" -p "Enter something (or press Enter for default): " userInput
echo "You entered: $userInput"

# 6. 从文件描述符读取
exec 3< input.txt  # Open "input.txt" on file descriptor 3
read -u 3 line     # Read a line from file descriptor 3
echo "Line read: $line"
exec 3<&-          # Close file descriptor 3

Shift:移动位置参数

## 移动位置参数

用法: shift [n]

将位置参数 $N+1,$N+2 ... 重命名为 $1,$2 ...。如果未指定 N,则默认为 1。

退出状态:

除非 N 为负数或大于 $#,否则返回成功状态。

## 示例:

#!/bin/bash

echo "Before shifting: \$1=$1, \$2=$2, \$3=$3"

# Shift the position parameters by 1
shift

echo "After shifting: \$1=$1, \$2=$2, \$3=$3"
 

# 如果你运行这个脚本并传递三个参数,

# 比如 ./script.sh arg1 arg2 arg3,脚本会输出:

Before shifting: $1=arg1, $2=arg2, $3=arg3

After shifting: $1=arg2, $2=arg3, $3=

Man:查看命令的帮助文档

用于查看命令的详细说明和使用方法。

示例:

man ls

Gzip:默认压缩或解压时不保留原文件压缩或解压;不能压缩目录

gzip [OPTION]... [FILE]...

# 选项:
  -c, --stdout           写入标准输出,保持原始文件不变
  -d, --decompress      解压缩
  -f, --force           强制覆盖输出文件并压缩链接
  -h, --help            提供帮助
  -k, --keep            保留(不删除)输入文件
  -l, --list            列出压缩文件内容
  -L, --license         显示软件许可证
  -n, --no-name         不保存或恢复原始名称和时间戳
  -N, --name            保存或恢复原始名称和时间戳
  -q, --quiet           禁止所有警告
  -r, --recursive       对目录进行递归操作
      --rsyncable       制作支持 rsync 的归档文件
  -S, --suffix=SUF      在压缩文件上使用后缀 SUF
      --synchronous     同步输出(系统崩溃时更安全,但速度较慢)
  -t, --test            测试压缩文件的完整性
  -v, --verbose         冗余模式
  -V, --version         显示版本号
  -1, --fast            压缩速度更快
  -9, --best            压缩得更好

# 在没有 FILE 或 FILE 为 - 时,读取标准输入。

# 解压使用 gzip -d 或 gunzip(gunzip 不是另一个命令,而是 gzip -d 命令的缩写)

## 示例

# 示例1: 压缩文件
gzip file.txt

# 示例2: 压缩并保留原文件
gzip -k file.txt

# 示例3: 解压缩文件
gzip -d file.txt.gz

# 示例4: 查看压缩文件内容列表
gzip -l file.txt.gz

# 示例5: 递归压缩目录
gzip -r directory

# 示例6: 压缩文件并指定后缀
gzip -S .backup file.txt

# 示例7: 测试压缩文件的完整性
gzip -t file.txt.gz

# 示例8:将文件压缩后输出到标准输出

gzip -c file.txt

Zcat:解压缩文件

zcat 和 gunzip 参数都一样!都用于解压缩文件,但它们有一些关键的区别。

1、输出方式:

zcat:将解压缩的文件内容直接输出到标准输出(通常是终端屏幕),而不修改原始文件或创建新文件。

gunzip:通常会解压缩文件并覆盖原始文件,如果使用-c选项,也可以将解压缩的内容输出到标准输出。

2、使用场景:

zcat 通常用于查看压缩文件的内容,而不需要解压或创建新文件。

gunzip 用于完全解压文件,将其还原为原始的非压缩文件。

3、命令行选项:

zcat 没有很多选项,因为其主要目的是在不修改文件的情况下查看压缩文件的内容。

gunzip 具有更多的选项,例如 -c(输出到标准输出)、-k(保留原始文件)、-l(列出压缩文件的信息)等。

Bzip2:默认压缩或解压时不保留原文件压缩或解压;不能压缩目录

bzip2 [flag和input file顺序不限]

# 选项:
  -h, --help         打印帮助信息
  -d, --decompress   强制解压缩
  -z, --compress     强制压缩
  -k, --keep         保留(不删除)输入文件
  -f, --force        覆盖现有输出文件
  -t, --test         测试压缩文件的完整性
  -c, --stdout       输出到标准输出端
  -q, --quiet        抑制非关键错误信息
  -v, --verbose      冗余模式(第二个 -v 提供更多信息)
  -L, --license      显示软件版本和许可证
  -V, --version      显示软件版本和许可证
  -s, --small        使用较少内存(最多 2500k)
  -1 ... -9          设置块大小为 100k ... 900k,--fast 是 -1 的别名,--best 是 -9 的别名

# 如果以 `bzip2' 的形式调用,默认操作是压缩。
# 作为 `bunzip2' 调用时,默认动作是解压缩。
# 作为 `bzcat',默认操作是解压到 stdout。

# 如果没有给出文件名,bzip2 将从标准输入到标准输出进行压缩或解压。
# 可以联合短标志,例如 `-v -4' 与 -v4 或 -4v 等意思相同。

## 示例

# 1. 压缩文件
bzip2 file.txt

# 2. 解压文件
bzip2 -d file.txt.bz2

# 3. 压缩并保留原文件
bzip2 -k file.txt

# 4. 解压到标准输出
bzip2 -dc file.txt.bz2

# 5. 测试压缩文件的完整性
bzip2 -t file.txt.bz2

# 6. 使用压缩级别 9 进行压缩
bzip2 -9 file.txt

# 7. 压缩目录及其内容(递归压缩)
bzip2 -r directory

# 8. 将压缩文件输出到标准输出
bzip2 -c file.txt > compressed_file.bz2

Tar:打包和压缩文件或目录

# 用法: tar [选项...] [文件]...
# GNU 'tar' 将许多文件保存在单个磁带或磁盘归档中,并可以从归档中还原单个文件。

# 示例:
# 创建名为 archive.tar 的归档,包含文件 foo 和 bar。
tar -cf archive.tar foo bar
# 以详细模式列出 archive.tar 中的所有文件。
tar -tvf archive.tar
# 从 archive.tar 中提取所有文件。
tar -xf archive.tar

# 主操作模式:
-A, --catenate, --concatenate   将 tar 文件追加到归档
-c, --create               创建新的归档
    --delete               从归档中删除(不适用于 mag 磁带!)
-d, --diff, --compare      查找归档与文件系统之间的差异
-r, --append               将文件追加到归档的末尾
    --test-label           测试归档卷标并退出
-t, --list                 列出归档的内容
-u, --update               仅追加比归档中的拷贝更新的文件
-x, --extract, --get       从归档中提取文件

# 操作修饰符:
    --check-device         创建增量归档时检查设备编号(默认)
-g, --listed-incremental=FILE   处理新的 GNU 格式增量备份
-G, --incremental          处理旧的 GNU 格式增量备份
    --hole-detection=TYPE  检测空洞的技术
    --ignore-failed-read   在无法读取的文件上不以非零退出
    --level=NUMBER         为创建的增量列表归档设置转储级别
    --no-check-device      创建增量归档时不检查设备编号
    --no-seek              归档不可寻址
-n, --seek                 归档可寻址
    --occurrence[=NUMBER]  仅处理归档中每个文件的第 NUMBER 个出现;
                         仅与 --delete、--diff、--extract 或 --list
                         子命令结合使用,以及通过命令行或 -T 选项给出文件列表时有效;
                         NUMBER 默认为 1
    --sparse-version=MAJOR[.MINOR]
                         设置要使用的稀疏格式的版本(意味着 --sparse)
-S, --sparse               高效处理稀疏文件

# 本地文件名选择:
    --add-file=FILE        将给定的 FILE 添加到归档中(如果其名称以破折号开头,则很有用)
-C, --directory=DIR        更改到目录 DIR
    --exclude=PATTERN      排除以 PATTERN 给出的文件
    --exclude-backups      排除备份和锁定文件
    --exclude-caches       排除包含 CACHEDIR.TAG 的目录的内容,但不包括标签文件本身
    --exclude-caches-all   排除包含 CACHEDIR.TAG 的目录
    --exclude-caches-under 排除包含 CACHEDIR.TAG 的目录下的所有内容
    --exclude-ignore=FILE  从 FILE 读取每个目录的排除模式(如果存在)
    --exclude-ignore-recursive=FILE
                         从 FILE 读取每个目录及其子目录的排除模式(如果存在)
    --exclude-tag=FILE     排除包含 FILE 的目录的内容,但不包括 FILE 本身
    --exclude-tag-all=FILE 排除包含 FILE 的目录
    --exclude-tag-under=FILE
                         排除包含 FILE 的目录下的所有内容
    --exclude-vcs          排除版本控制系统目录
    --exclude-vcs-ignores  从 VCS 忽略文件中读取排除模式
    --no-null              禁用上一个 --null 选项的效果
    --no-recursion         在目录中自动避免递归
    --no-unquote           不解引用输入文件或成员名
    --no-verbatim-files-from   -T 将以破折号开头的文件名视为选项(默认)
    --null                 -T 读取空终止的名称;意味着 --verbatim-files-from
    --recursion            递归到目录中(默认)
-T, --files-from=FILE      从 FILE 获取要提取或创建的名称
    --unquote              不解引用输入文件或成员名(默认)
    --verbatim-files-from  -T 逐字读取文件名(无转义或选项处理)
X, --exclude-from=FILE    排除在 FILE 中列出的模式

# 文件名匹配选项(影响排除和包含模式):
    --anchored             模式与文件名开头匹配
    --ignore-case          忽略大小写
    --no-anchored          模式在任何 '/' 之后匹配(默认用于排除)
    --no-ignore-case       区分大小写匹配(默认)
    --no-wildcards         逐字字符串匹配
    --no-wildcards-match-slash   通配符不匹配 '/'
    --wildcards            使用通配符(默认用于排除)
    --wildcards-match-slash   通配符匹配 '/'(默认用于排除)

# 覆盖控制:
    --keep-directory-symlink   在提取时保留对目录的现有符号链接
    --keep-newer-files     不替换比其归档副本更新的现有文件
-k, --keep-old-files       在提取时不替换现有文件,将其视为错误
    --no-overwrite-dir     在提取时保留现有目录的元数据
    --one-top-level[=DIR]  创建子目录以避免提取的松散文件
    --overwrite            在提取时覆盖现有文件
    --overwrite-dir        在提取时覆盖现有目录的元数据(默认)
    --recursive-unlink     在提取目录之前清空层次结构
    --remove-files         在将文件添加到归档后删除它们
    --skip-old-files       在提取时不替换现有文件,默默跳过它们
-U, --unlink-first         在提取文件之前删除每个文件
-W, --verify               写入归档后尝试验证归档

# 选择输出流:
    --ignore-command-error 忽略子进程的退出代码
    --no-ignore-command-error   将子进程的非零退出代码视为错误
-O, --to-stdout            将文件提取到标准输出
    --to-command=COMMAND   将提取的文件传递给另一个程序

# 处理文件属性:
    --atime-preserve[=METHOD]   保留转储文件的访问时间,通过在读取后恢复时间
                         (METHOD='replace';默认)或首次不设置时间
                         (METHOD='system')
    --clamp-mtime          仅在文件更改的时间比 --mtime 给出的时间更近时设置时间
    --delay-directory-restore   推迟设置提取目录的修改时间和权限,直到提取结束
    --group=NAME           强制将 NAME 作为添加文件的群组
    --group-map=FILE       使用 FILE 映射文件所有者 GID 和名称
    --mode=CHANGES         强制添加文件的模式 CHANGES(符号)
    --mtime=DATE-OR-FILE   从 DATE-OR-FILE 为添加的文件设置修改时间
-m, --touch                不提取文件修改时间
    --no-delay-directory-restore
                         取消 --delay-directory-restore 选项的效果
    --no-same-owner        以自己的身份提取文件(普通用户的默认值)
    --no-same-permissions 从归档中提取权限时应用用户的 umask(普通用户的默认值)
    --numeric-owner        总是使用数字表示用户/组名
    --owner=NAME           强制将 NAME 作为添加文件的所有者
    --owner-map=FILE       使用 FILE 映射文件所有者 UID 和名称
-p, --preserve-permissions, --same-permissions
                         提取有关文件权限的信息(超级用户的默认值)
    --same-owner           尝试以与归档中存在的相同所有权提取文件
                         (超级用户的默认值)
    --sort=ORDER           目录排序顺序:none(默认)、name 或 inode
-s, --preserve-order, --same-order
                         成员参数按与归档中文件相同的顺序列出

# 处理扩展文件属性:
    --acls                 启用 POSIX ACLs 支持
    --no-acls              禁用 POSIX ACLs 支持
    --no-selinux           禁用 SELinux 上下文支持
    --no-xattrs            禁用扩展属性支持
    --selinux              启用 SELinux 上下文支持
    --xattrs               启用扩展属性支持
    --xattrs-exclude=MASK  指定 xattr 键的排除模式
    --xattrs-include=MASK  指定 xattr 键的包含模式

# 设备选择和切换:
    --force-local          归档文件是本地的,即使它有冒号
-f, --file=ARCHIVE         使用归档文件或设备 ARCHIVE
-F, --info-script=NAME, --new-volume-script=NAME
                         在每个磁带的末尾运行脚本(意味着 -M)
-L, --tape-length=NUMBER   写入 NUMBER x 1024 字节后更改磁带
-M, --multi-volume         创建/列出/提取多卷归档
    --rmt-command=COMMAND  使用给定的 rmt COMMAND 而不是 rmt
    --rsh-command=COMMAND  使用远程 COMMAND 而不是 rsh
    --volno-file=FILE      使用/更新 FILE 中的卷号

# 设备阻塞:
-b, --blocking-factor=BLOCKS   BLOCKS x 512 字节每个记录
-B, --read-full-records    在读取时重新块(对于 4.2BSD 管道)
-i, --ignore-zeros         忽略归档中的零块(表示 EOF)
    --record-size=NUMBER   记录的字节数,是 512 的倍数

# 归档格式选择:
-H, --format=FORMAT        创建给定格式的归档

FORMAT 是以下之一:
  gnu                      GNU tar 1.13.x 格式
  oldgnu                   GNU 格式(tar <= 1.12)
  pax                      POSIX 1003.1-2001(pax)格式
  posix                    与 pax 相同
  ustar                    POSIX 1003.1-1988(ustar)格式
  v7                       旧的 V7 tar 格式
    --old-archive, --portability
                         与 --format=v7 相同
    --pax-option=keyword[[:]=value][,keyword[[:]=value]]...
                         控制 pax 关键字
    --posix                与 --format=posix 相同
-V, --label=TEXT           使用卷名 TEXT 创建归档;在
                         列表/提取时,使用 TEXT 作为卷名的模式
                         用于通配符

# 压缩选项:
-a, --auto-compress        使用归档后缀确定压缩程序
-I, --use-compress-program=PROG
                         通过 PROG 过滤(必须接受 -d)
-j, --bzip2                通过 bzip2 过滤归档
-J, --xz                   通过 xz 过滤归档
    --lzip                 通过 lzip 过滤归档
    --lzma                 通过 xz 过滤归档
    --lzop                 通过 lzop 过滤归档
    --no-auto-compress     不使用归档后缀确定压缩程序
    --zstd                 通过 zstd 过滤归档
-z, --gzip, --gunzip, --ungzip   通过 gzip 过滤归档
-Z, --compress, --uncompress   通过 compress 过滤归档

# 本地文件选择:
    --backup[=CONTROL]     删除之前备份,选择版本 CONTROL
    --hard-dereference     遵循硬链接;归档并转储它们引用的文件
-h, --dereference          遵循符号链接;归档并转储它们指向的文件
-K, --starting-file=MEMBER-NAME
                         从读取归档时的 MEMBER-NAME 开始
    --newer-mtime=DATE     仅比数据更改时间更新的文件进行比较
-N, --newer=DATE-OR-FILE, --after-date=DATE-OR-FILE
                         仅存储比 DATE-OR-FILE 新的文件
    --one-file-system      创建归档时停留在本地文件系统
-P, --absolute-names       不从文件名中剥离前导 '/'s
    --suffix=STRING        在删除之前备份,覆盖通常的后缀('~' 除非由环境变量
                         SIMPLE_BACKUP_SUFFIX 覆盖)
# 文件名变换:
    --strip-components=NUMBER   从文件名中删除 NUMBER 个前导组件
    --transform=EXPRESSION, --xform=EXPRESSION
                         使用 sed 替换 EXPRESSION 转换文件名

# 信息输出:
    --checkpoint[=NUMBER]  每第 NUMBER 条记录显示进度消息(默认 10)
    --checkpoint-action=ACTION   在每个检查点上执行 ACTION
    --full-time            将文件时间打印到完整分辨率
    --index-file=FILE      将详细输出发送到 FILE
-l, --check-links          如果没有全部链接都被转储,则打印消息
    --no-quote-chars=STRING   对 STRING 中的字符禁用引用
    --quote-chars=STRING   除 STRING 中的字符外,还引用其他字符
    --quoting-style=STYLE  设置名称引用样式;下面是有效的 STYLE
                         值

    --show-defaults        显示 tar 默认值
    --show-omitted-dirs    在列出或提取时,列出不匹配搜索条件的每个目录
    --show-snapshot-field-ranges
                         显示快照文件字段的有效范围
    --show-transformed-names, --show-stored-names
                         显示变换后的文件或归档名称
    --totals[=SIGNAL]      在处理归档后打印总字节数;
                         有一个参数时,在传递此 SIGNAL 时打印总字节数;
                         允许的信号是:SIGHUP、SIGQUIT、SIGINT、SIGUSR1 和 SIGUSR2;
                         不带 SIG 前缀的名称也被接受
    --utc                  以 UTC 打印文件修改时间
-v, --verbose              详细列出已处理的文件
    --warning=KEYWORD      警告控制
-w, --interactive, --confirmation
                         对每个操作请求确认

# 兼容性选项:
-o                         在创建时等同于 --old-archive;在提取时等同于 --no-same-owner

# 其他选项:
-?, --help                 给出此帮助列表
    --restrict             禁用某些潜在有害选项
    --usage                给出简短的使用消息
    --version              打印程序版本

长选项的强制或可选参数对于相应的短选项也是强制或可选的。

备份后缀为'~',除非使用 --suffix 或 SIMPLE_BACKUP_SUFFIX 环境变量覆盖。
版本控制可以使用 --backup 或 VERSION_CONTROL 设置,值为:

  none, off       从不制作备份
  t, numbered     制作编号的备份
  nil, existing   如果存在编号的备份,则编号,否则简单备份
  never, simple   总是制作简单备份

--quoting-style 选项的有效参数为:

  literal
  shell
  shell-always
  shell-escape
  shell-escape-always
  c
  c-maybe
  escape
  locale
  clocale

tar是打包,不是压缩!

# 示例1:
使用tar命令对文件进行打包压缩与解压缩,gzip方式对文件进行压缩,并指定压缩名为 tar_gzip.tar.gz
[root@ls_nfqZ8Onc ~]# tar -zcvf tar_gzip.gz file
file
[root@ls_nfqZ8Onc ~]# ls
file  tar_gzip.gz

# 示例2:
使用bzip2方式对文件夹进行压缩,并指定压缩名为 tar_bzip2.tar.bz2
[root@ls_nfqZ8Onc ~]# tar -jcvf tar_bzip2.bz2 file
file
[root@ls_nfqZ8Onc ~]# ls
file tar_bzip2.bz2  tar_gzip.gz

# 示例3:
使用xz方式对文件进行压缩,并指定压缩名为 tar_xz.tar.xz
[root@ls_nfqZ8Onc ~]# tar -Jcvf tar_xz.tar.xz file
file
[root@ls_nfqZ8Onc ~]# ls
file tar_bzip2.bz2  tar_gzip.gz  tar_xz.tar.xz

# 示例4:
新建文件file1.txt,file2.txt,file3.txt
[root@ls_nfqZ8Onc ~]# touch file1.txt file2.txt file3.txt
[root@ls_nfqZ8Onc ~]# ls
file       file2.txt  file.tar.bz2  file.tar.xz
file1.txt  file3.txt  file.tar.gz

# 示例5:
对文件file1.txt和file2.txt,进行压缩(使用gzip方式),排除file3.txt(即不对file3进行压缩)并指定压缩名为tar_file.tar.gz
[root@ls_nfqZ8Onc ~]# tar -cvzf tar_file.tar.gz --exclude=file3.txt file*.txt
file1.txt
file2.txt
[root@ls_nfqZ8Onc ~]# ls
file       file2.txt  file.tar.bz2  file.tar.xz
file1.txt  file3.txt  file.tar.gz   tar_file.tar.gz

# 示例6:
新建文件file4.txt,将file4.txt添加到tar_file.tar.gz中
[root@ls_nfqZ8Onc ~]# gunzip tar_file.tar.gz
[root@ls_nfqZ8Onc ~]# tar -rvf tar_file.tar file4.txt
file4.txt
[root@ls_nfqZ8Onc ~]# gzip tar_file.tar
[root@ls_nfqZ8Onc ~]# ls
file       file2.txt  file4      file.tar.bz2  file.tar.xz
file1.txt  file3.txt  file4.txt  file.tar.gz   tar_file.tar.gz

# 示例7:
查看压缩包tar_file.tar.gz有哪些文件及目录(不解压,只查看)
[root@ls_nfqZ8Onc ~]# tar -tvf tar_file.tar.gz
-rw-r--r-- root/root         0 2022-07-19 17:48 file1.txt
-rw-r--r-- root/root         0 2022-07-19 17:48 file2.txt
-rw-r--r-- root/root         0 2022-07-19 17:59 file4.txt

# 示例8:
解压tar_gzip.tar.gz到指定目录tar_test(没有这个目录就创建)
[root@ls_nfqZ8Onc ~]# tar -xzvf tar_file.tar.gz -C tar_test/
file1.txt
file2.txt
file4.txt
[root@ls_nfqZ8Onc ~]# cd tar_test/
[root@ls_nfqZ8Onc tar_test]# ls
file1.txt  file2.txt  file4.txt

# 示例9:
解压tar_xz.tar.xz
[root@ls_nfqZ8Onc tar_test]# tar -xJvf tar_xz.tar.xz
file3

Zip:压缩文件或目录

# zip 文件的压缩程序
zip

# 解压缩程序
unzip

# 常用选项:
-f   更新已更改的文件
-u   更新已更改或新增的文件
-d   从压缩文件中删除条目
-m   将文件移动到压缩文件中(删除源文件)
-r   递归处理目录
-j   不记录目录名
-0   仅存储,不压缩
-l   将 LF 转换为 CR LF,或者将 CR LF 转换为 LF
-1   更快速地进行压缩
-9   更好地进行压缩
-q   静默操作
-v   详细操作/打印版本信息
-c   添加一行注释
-z   添加压缩文件的注释
-@   从标准输入中读取文件名
-o   将压缩文件的时间设置为最新条目的时间
-x   排除指定的文件名
-i   仅包括指定的文件名
-F   修复压缩文件(-FF 尝试更努力修复)
-D   不添加目录条目
-A   调整自解压执行文件
-J   删除压缩文件前缀(unzipsfx)
-T   测试压缩文件的完整性
-X   排除额外的文件属性
-y   将符号链接存储为链接,而不是参考文件
-e   加密
-n   不压缩指定后缀的文件
-h2  显示更多帮助

## 示例

# 压缩目录
zip -r archive.zip directory/

# 解压缩压缩文件
unzip archive.zip

# 添加注释到压缩文件
zip -z my_archive.zip "This is a comment for the archive."

# 压缩文件,不包含目录结构
zip -j archive.zip directory/*

# 将文件移动到压缩文件中并删除源文件
zip -m archive.zip file.txt

# 更新已更改的文件
zip -u archive.zip updated_file.txt

# 解压缩到指定目录
unzip archive.zip -d /path/to/destination/

# 列出压缩文件内容
unzip -l archive.zip

# 解压缩自解压执行文件
unzip self_extracting.zip -d destination/

# 使用密码进行加密压缩
zip -e -P password encrypted.zip file.txt

# 解压缩加密压缩文件
unzip -P password encrypted.zip

# 递归压缩目录,忽略指定文件或目录
zip -r archive.zip source_directory/ -x "*.log" "exclude_directory/*"

# 解压缩并覆盖已存在的文件
unzip -o archive.zip

Ssh:远程登陆

Secure Shell(SSH) 是由 IETF(The Internet Engineering Task Force) 制定的建立在应用层基础上的安全网络协议。它是专为远程登录会话(甚至可以用Windows远程登录Linux服务器进行文件互传)和其他网络服务提供安全性的协议,可有效弥补网络中的漏洞。

原文链接:SSH简介及两种远程登录的方法_ssh @-优快云博客

# 1. 连接到远程服务器
# 使用以下命令连接到远程服务器,将 'username' 替换为您的远程服务器用户名,'hostname' 替换为远程服务器的域名或IP地址。
ssh username@hostname
# 例如,连接到IP地址为192.168.1.100的远程服务器,用户名为user1:
ssh user1@192.168.1.100
# 如果使用SSH的默认端口22以外的端口,请使用 '-p' 参数指定端口号:
ssh -p port_number username@hostname

# 2. 执行远程命令
# 在SSH连接中,您可以在远程服务器上执行命令。连接后,您只需在终端输入命令,然后按下回车键即可执行。例如:
ls -l
uname -a

# 3. 传输文件
# 使用SCP(Secure Copy)命令在本地系统和远程服务器之间传输文件。
# 从本地复制到远程:
scp local_file username@hostname:/remote/directory

scp -i privacy_key local_file username@hostname:/remote/directory
# 从远程复制到本地:
scp username@hostname:/remote/file local_directory

scp -i privacy_key username@hostname:/remote/file local_directory

# 4. 生成SSH公钥和私钥对
# 使用以下示例命令生成SSH公钥和私钥对,用于远程登录认证:
ssh-keygen -t rsa

# 5.上传公钥到服务器

ssh-copy-id username@hostname

# 6.修改SSH服务配置文件

vim /etc/ssh/sshd_config

# 7.重启ssh服务

service ssh restart

service sshd restart

# 8. 退出SSH连接
# 在完成操作后,您可以通过输入 'exit' 命令或使用快捷键 'Ctrl + D' 来退出SSH会话

Find:查找文件

find [-H] [-L] [-P] [-Olevel] [-D debugopts] [path...] [expression]

默认路径是当前目录;默认表达式是 -print

表达式可以包括:运算符、选项、测试和动作:

运算符(按优先级降序排列;在没有其他运算符的情况下,-and 是隐式的):

   ( EXPR )   ! EXPR   -not EXPR   EXPR1 -a EXPR2   EXPR1 -and EXPR2
   EXPR1 -o EXPR2   EXPR1 -or EXPR2   EXPR1 , EXPR2

位置选项(始终为真):-daystart -follow -regextype

常规选项(始终为真,在其他表达式之前指定):

   -depth --help -maxdepth LEVELS -mindepth LEVELS -mount -noleaf
   --version -xdev -ignore_readdir_race -noignore_readdir_race

测试(N 可以是 +N、-N 或 N):-amin N -anewer 文件 -atime N -cmin N
   -cnewer 文件 -ctime N -empty -false -fstype 类型 -gid N -group 名称
   -ilname 模式 -iname 模式 -inum N -iwholename 模式 -iregex 模式
   -links N -lname 模式 -mmin N -mtime N -name 模式 -newer 文件
   -nouser -nogroup -path 模式 -perm [-/]模式 -regex 模式
   -readable -writable -executable
   -wholename 模式 -size N[bcwkMG] -true -type [bcdpflsD] -uid N
   -used N -user 名称 -xtype [bcdpfls]      -context 上下文

动作:-delete -print0 -printf 格式 -fprintf 文件 格式 -print
   -fprint0 文件 -fprint 文件 -ls -fls 文件 -prune -quit
   -exec COMMAND ; -exec COMMAND {} + -ok COMMAND ;
   -execdir COMMAND ; -execdir COMMAND {} + -okdir COMMAND ;

-D 的有效参数:

   exec、opt、rates、search、stat、time、tree、all、help

使用 '-D help' 可获取选项的描述,或参阅 find(1)。

## 示例

# 示例1: 查找当前目录下所有文件和子目录
find .

# 示例2: 查找当前目录及其子目录下所有以 `.txt` 结尾的文件
find . -name "*.txt"

# 示例3: 查找 `/etc` 目录下所有以 `.conf` 结尾的文件
find /etc -name "*.conf"

# 示例4: 查找文件大小大于 1MB 的文件
find . -size +1M

# 示例5: 查找最近 7 天内修改过的文件
find . -mtime -7

# 示例6: 查找用户 `john` 拥有的文件
find . -user john

# 示例7: 查找 `/var/log` 目录下所有空文件和空目录
find /var/log -empty

# 示例8: 在 `/home` 目录及其子目录中查找名为 `example.txt` 的文件并删除
find /home -name "example.txt" -delete

# 示例9: 将 `/tmp` 目录下的所有 `.log` 文件复制到 `/backup` 目录
find /tmp -name "*.log" -exec cp {} /backup \;

# 示例10: 查找并列出当前目录下所有文件和子目录的详细信息
find . -ls

Curl:发送HTTP请求

curl [选项...] <URL>

-d, --data <data>         使用 HTTP POST 数据
-f, --fail                快速失败,HTTP 错误时不输出内容
-h, --help <category>     获取命令的帮助
-i, --include             将协议响应头包含在输出中
-o, --output <file>       将输出写入文件而不是标准输出
-O, --remote-name        将输出写入一个以远程文件命名的文件
-s, --silent              静默模式
-T, --upload-file <file>  将本地文件 FILE 传输到目标位置
-u, --user <user:password> 服务器用户和密码
-A, --user-agent <name>   发送 User-Agent <name> 到服务器
-v, --verbose             使操作更加冗长
-V, --version             显示版本号并退出

## 示例

# 示例1: 发起简单的 GET 请求
curl https://example.com

# 示例2: 下载文件到本地
curl -O https://example.com/file.zip

# 示例3: 使用 POST 请求发送数据
curl -d "param1=value1&param2=value2" -X POST https://example.com/api

# 示例4: 将响应头信息也输出到标准输出
curl -i https://example.com

# 示例5: 上传文件到服务器
curl -T localfile.txt ftp://ftp.example.com/upload/

# 示例6: 使用用户名和密码进行身份验证
curl -u username:password https://example.com

# 示例7: 以静默模式执行,不显示进度信息
curl -s https://example.com

Diff:比较文件差异

diff [选项]... 文件

逐行比较文件。

长选项的必需参数对于短选项也是必需的。

  --normal                  输出普通的差异(默认选项)
  -q, --brief               仅在文件不同时报告
  -s, --report-identical-files   报告两个文件相同
  -c, -C NUM, --context[=NUM]   输出 NUM(默认 3)行复制的上下文
  -u, -U NUM, --unified[=NUM]   输出 NUM(默认 3)行统一的上下文
  -e, --ed                   输出一个 ed 脚本
  -n, --rcs                  输出一个 RCS 格式的差异
  -y, --side-by-side         以两列输出
  -W, --width=NUM            最多输出 NUM(默认 130)列
  --left-column              仅输出共同行的左列
  --suppress-common-lines    不输出共同行
  -p, --show-c-function      显示每个更改所在的 C 函数
  -F, --show-function-line=RE   显示与 RE 匹配的最近一行
  --label LABEL              使用 LABEL 而不是文件名和时间戳(可以重复使用)
  -t, --expand-tabs          将输出中的制表符扩展为空格
  -T, --initial-tab          通过在前面添加一个制表符使制表符对齐
  --tabsize=NUM              每 NUM(默认 8)列设置制表位
  --suppress-blank-empty     忽略空输出行之前的空格或制表符
  -l, --paginate             将输出通过 'pr' 进行分页
  -r, --recursive            递归比较找到的任何子目录
  --no-dereference           不要跟随符号链接
  -N, --new-file             将缺失的文件视为空
  --unidirectional-new-file   将缺失的第一个文件视为空
  --ignore-file-name-case    比较文件名时忽略大小写
  --no-ignore-file-name-case   比较文件名时考虑大小写
  -x, --exclude=PAT          排除与 PAT 匹配的文件
  -X, --exclude-from=FILE     排除与 FILE 中的任何模式匹配的文件
  -S, --starting-file=FILE    比较目录时从 FILE 开始
  --from-file=FILE1          将 FILE1 与所有操作数比较;FILE1 可以是目录
  --to-file=FILE2            将所有操作数与 FILE2 比较;FILE2 可以是目录
  -i, --ignore-case          忽略文件内容的大小写差异
  -E, --ignore-tab-expansion   忽略制表符扩展导致的更改
  -Z, --ignore-trailing-space    忽略行末的空白字符
  -b, --ignore-space-change   忽略空白字符数量的更改
  -w, --ignore-all-space      忽略所有空白字符
  -B, --ignore-blank-lines    忽略所有行都为空的更改
  -I, --ignore-matching-lines=RE   忽略所有行都匹配 RE 的更改
  -a, --text                 将所有文件视为文本
  --strip-trailing-cr        在输入中去除行末的回车符
  -D, --ifdef=NAME           使用 '#ifdef NAME' 差异输出合并文件
  --GTYPE-group-format=GFMT  使用 GFMT 格式化 GTYPE 输入组
  --line-format=LFMT         使用 LFMT 格式化所有输入行
  --LTYPE-line-format=LFMT   使用 LFMT 格式化 LTYPE 输入行
  --help                     显示此帮助并退出
  -v, --version              输出版本信息并退出

文件为 'FILE1 FILE2' 或 'DIR1 DIR2' 或 'DIR FILE' 或 'FILE DIR'。
如果给出 --from-file 或 --to-file,则对文件没有限制。
如果一个文件是 '-',则读取标准输入。
退出状态为 0 表示输入相同,1 表示不同,2 表示出现问题。

## 示例

# 示例1: 比较两个文件并输出差异
diff file1.txt file2.txt

# 示例2: 递归比较两个目录中的文件内容
diff -r directory1 directory2

# 示例3: 使用上下文格式显示差异
diff -c file1.txt file2.txt

# 示例4: 使用统一格式显示差异
diff -u file1.txt file2.txt

# 示例5: 显示差异的同时报告文件相同
diff -s file1.txt file2.txt

# 示例6: 仅报告文件是否相同,不显示差异
diff -q file1.txt file2.txt

# 示例7: 将输出通过 'pr' 进行分页显示
diff -l file1.txt file2.txt | pr

# 示例8: 显示差异并忽略空白字符
diff -b file1.txt file2.txt

Tee:将输出重定向到文件和标准输

tee [选项]... [文件]...

选项:
  -a, --append             # 向给定的文件追加,而不是覆盖
  -i, --ignore-interrupts  # 忽略中断信号
  -p                       # 诊断写入非管道时的错误
      --output-error[=MODE] # 设置在写入错误时的行为。请参阅下面的 MODE
      --help               # 显示此帮助并退出
      --version            # 输出版本信息并退出

MODE 决定在输出写入错误时的行为:
  'warn'                  # 诊断写入任何输出时的错误
  'warn-nopipe'           # 诊断写入任何非管道输出时的错误
  'exit'                  # 写入任何输出时的错误导致退出
  'exit-nopipe'           # 写入任何非管道输出时的错误导致退出

-p 选项的默认 MODE 为 'warn-nopipe'。

当没有指定 --output-error 时,默认操作是在写入管道时立即退出,并在写入非管道输出时诊断错误。

## 示例

# 示例1: 将命令的输出复制到两个文件,并同时显示在终端上
command1 | tee file1.txt file2.txt

# 示例2: 将命令的输出追加到文件,并同时显示在终端上
command2 | tee -a file3.txt

# 示例3: 忽略中断信号,将命令的输出输出到文件,并同时显示在终端上
command3 | tee -i file4.txt

# 示例4: 诊断写入非管道时的错误,将命令的输出输出到文件,并同时显示在终端上
command4 | tee -p file5.txt

# 示例5: 在写入错误时导致退出,将命令的输出输出到文件,并同时显示在终端上
command5 | tee --output-error=exit file6.txt

Mount:挂载文件系统

mount 命令是用于将文件系统挂载到 Linux 和 Unix 操作系统中的指定挂载点的工具。在计算机中,文件系统是用于组织和管理文件和目录的一种结构,而挂载是将文件系统连接到操作系统的文件树中的特定位置的过程。

使用情况:

  1. 外部存储设备挂载: 当插入外部存储设备(如 USB 闪存驱动器、硬盘、光盘等)时,需要使用 mount 命令将设备的文件系统挂载到操作系统中,以便访问设备上的文件和数据。

  2. 网络共享挂载: 当需要访问位于其他计算机或服务器上的文件夹或资源时,可以通过挂载网络共享来在本地文件系统中创建一个访问点。

  3. 虚拟文件系统挂载: 一些特殊的虚拟文件系统,如 /proc/sys,在 Linux 中用于提供关于系统和内核状态的信息。这些虚拟文件系统需要在系统启动时挂载。

  4. CD/DVD挂载: 当插入光盘(CD 或 DVD)时,需要挂载光盘的文件系统以便可以浏览光盘中的内容。

  5. 磁盘分区挂载: 当在硬盘上创建了一个新的分区时,需要将分区的文件系统挂载到操作系统中,以便可以在分区中存储和访问文件。

  6. RAM磁盘挂载: 有时需要在内存中创建一个虚拟的文件系统,以便临时存储数据。这些 RAM 磁盘需要在启动时挂载。

  7. 镜像文件挂载: 有时需要将一个磁盘镜像文件(如 ISO 映像文件)挂载到文件系统中,以便访问其中的内容,而不需要实际烧录到光盘或设备中。

用法:
  mount [-lhV]
  mount -a [options]
  mount [options] [--source] <source> | [--target] <dictionary>
  mount [options] <source> <dictionary>
  mount <operation> <mountpoint> [<target>]

# 挂载文件系统。

选项:
  -a, --all                # 挂载 fstab 中提到的所有文件系统
  -c, --no-canonicalize    # 不要规范化路径
  -f, --fake               # 模拟运行;跳过 mount(2) 系统调用
  -F, --fork               # 为每个设备分叉(与 -a 一起使用)
  -T, --fstab <path>       # /etc/fstab 的备选文件
  -i, --internal-only      # 不调用 mount.<type> 助手程序
  -l, --show-labels        # 显示文件系统标签
  -n, --no-mtab            # 不写入 /etc/mtab
      --options-mode <mode>        # 如何处理从 fstab 加载的选项
      --options-source <source>    # 挂载选项来源
      --options-source-force      # 强制使用 fstab/mtab 中的选项
  -o, --options <list>     # 以逗号分隔的挂载选项列表
  -O, --test-opts <list>   # 限制文件系统集合(与 -a 一起使用)
  -r, --read-only          # 将文件系统挂载为只读(等同于 -o ro)
  -t, --types <list>       # 限制文件系统类型集合
      --source <src>        # 显式指定源(路径、标签、UUID)
      --target <target>     # 显式指定挂载点
      --target-prefix <path>     # 指定用于所有挂载点的路径
  -v, --verbose            # 显示正在执行的操作
  -w, --rw, --read-write   # 将文件系统挂载为读写(默认值)
  -N, --namespace <ns>     # 在另一个命名空间中执行挂载

  -h, --help               # 显示此帮助并退出
  -V, --version            # 显示版本信息并退出

Source:
  -L, --label <label>      # 与 LABEL=<标签> 等同
  -U, --uuid <uuid>        # 与 UUID=<uuid> 等同
  LABEL=<label>            # 指定带有文件系统标签的设备
  UUID=<uuid>              # 指定带有文件系统 UUID 的设备
  PARTLABEL=<label>        # 指定带有分区标签的设备
  PARTUUID=<uuid>          # 指定带有分区 UUID 的设备
  ID=<id>                  # 通过 udev 硬件 ID 指定设备
  <device>                 # 通过路径指定设备
  <directory>              # 绑定挂载的挂载点(参见 --bind/rbind)
  <file>                   # 用于循环设备设置的常规文件

操作:
  -B, --bind               # 在其他位置挂载子树(等同于 -o bind)
  -M, --move               # 将子树移动到其他位置
  -R, --rbind              # 在其他位置挂载子树和所有子挂载
  --make-shared            # 将子树标记为共享
  --make-slave             # 将子树标记为从属
  --make-private           # 将子树标记为私有
  --make-unbindable        # 将子树标记为不可解绑
  --make-rshared           # 递归地将整个子树标记为共享
  --make-rslave            # 递归地将整个子树标记为从属
  --make-rprivate          # 递归地将整个子树标记为私有
  --make-runbindable       # 递归地将整个子树标记为不可解绑

## 示例

# 示例1: 挂载文件系统
mount /dev/sdb1 /mnt/data

# 示例2: 挂载所有在/etc/fstab中定义的文件系统
mount -a

# 示例3: 挂载只读文件系统
mount -o ro /dev/sdb2 /mnt/archive

# 示例4: 挂载网络共享
mount -t nfs 192.168.1.100:/shared /mnt/nfs

# 示例5: 挂载ISO文件
mount -o loop disk_image.iso /mnt/iso

# 示例6: 以只读方式挂载特定文件系统类型
mount -t ext4 -o ro /dev/sdc1 /mnt/ext4

# 示例7: 绑定挂载子树
mount --bind /var/log /mnt/log

Rsync:(Remote Sync)远程数据同步工具

# rsync 命令用法:
# 远程数据同步工具

rsync [OPTION]... SRC [SRC]... DEST
rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST
rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST
rsync [OPTION]... [USER@]HOST:SRC [DEST]
rsync [OPTION]... [USER@]HOST::SRC [DEST]
rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]

# ':' 用法通过远程 shell 连接,而 '::' 和 'rsync://' 用法通过 rsync 守护进程连接,
# 并要求 SRC 或 DEST 以模块名开头。

# 选项:
--verbose, -v          # 增加详细程度
--info=FLAGS           # 细粒度的信息详细程度
--debug=FLAGS          # 细粒度的调试详细程度
--stderr=e|a|c         # 更改 stderr 输出模式(默认:错误)
--quiet, -q            # 抑制非错误消息
--no-motd              # 抑制守护进程模式的 MOTD
--checksum, -c         # 跳过基于校验和的检查,而不是修改时间和大小
--archive, -a          # 存档模式是 -rlptgoD(没有 -A,-X,-U,-N,-H)
--no-OPTION            # 关闭隐含的 OPTION(例如 --no-D)
--recursive, -r        # 递归到目录
--relative, -R         # 使用相对路径名
--no-implied-dirs      # 不使用 --relative 时不发送隐含的目录
--backup, -b           # 创建备份(参见 --suffix 和 --backup-dir)
--backup-dir=DIR       # 在 DIR 中创建层次结构的备份
--suffix=SUFFIX        # 备份后缀(默认为 ~,不使用 --backup-dir)
--update, -u           # 跳过在接收端较新的文件
--inplace              # 在目标文件中就地更新
--append               # 将数据附加到较短的文件
--append-verify        # 在文件校验和中追加旧数据
--dirs, -d             # 在不递归的情况下传输目录
--mkpath               # 创建目标的路径组件
--links, -l            # 将符号链接复制为符号链接
--copy-links, -L       # 将符号链接转换为所引用的文件/目录
--copy-unsafe-links    # 仅转换“不安全”的符号链接
--safe-links           # 忽略指向树外的符号链接
--munge-links          # 混淆符号链接以使其安全且不可用
--copy-dirlinks, -k    # 将目录中的符号链接转换为所引用的目录
--keep-dirlinks, -K    # 将接收端上的符号链接目录视为目录
--hard-links, -H       # 保留硬链接
--perms, -p            # 保留权限
--executability, -E    # 保留可执行性
--chmod=CHMOD          # 影响文件和/或目录权限
--acls, -A             # 保留 ACL(意味着 --perms)
--xattrs, -X           # 保留扩展属性
--owner, -o            # 保留所有者(仅限超级用户)
--group, -g            # 保留组
--devices              # 保留设备文件(仅限超级用户)
--copy-devices         # 将设备内容复制为常规文件
--specials             # 保留特殊文件
-D                     # 等同于 --devices --specials
--times, -t            # 保留修改时间
--atimes, -U           # 保留访问(使用)时间
--open-noatime         # 避免在打开的文件上更改访问时间
--crtimes, -N          # 保留创建时间(新建性)
--omit-dir-times, -O   # 从 --times 中省略目录
--omit-link-times, -J  # 从 --times 中省略符号链接
--super                # 接收端尝试超级用户活动
--fake-super           # 使用扩展属性存储/恢复特权属性
--sparse, -S           # 将 null 序列转换为稀疏块
--preallocate          # 写入目标文件之前分配空

# rsync 命令使用示例:配合cron效果更佳!!

# 1. 从本地系统复制文件到远程系统:
rsync -avz /local/path/ user@remote:/remote/path/

# 2. 从远程系统复制文件到本地系统:
rsync -avz user@remote:/remote/path/ /local/path/

# 3. 从本地系统复制文件到远程系统并显示详细信息:
rsync -avz --verbose /local/path/ user@remote:/remote/path/

# 4. 仅复制更新过的文件:
rsync -avzu /local/path/ user@remote:/remote/path/

# 5. 备份目录并保留备份历史:
rsync -av --backup --backup-dir=/backup/dir/ /source/dir/ /destination/dir/

# 6. 同步两个目录,并删除目标目录中不存在的文件:
rsync -av --delete /source/dir/ /destination/dir/

# 7. 使用 ssh 登陆服务器 rsync 同步文件:

# 指定非标准端口
rsync -avz -e "ssh -p 2222" /local/path/ user@remote:/remote/path/

# 本地密钥登陆服务器同步文件到服务器

rsync -avz -e "ssh -i /path/to/private/key" /local/path/ user@remote:/remote/path/

# 本地密钥登陆服务器同步文件到本地

rsync -avz -e "ssh -i /path/to/private/key" user@remote:/remote/path/ /local/path/

# 8. 将目录同步到远程系统,并保留权限和所有者信息:
rsync -avz --perms --owner --group /local/path/ user@remote:/remote/path/

# 9. 将目录同步到远程系统,排除特定文件或目录:
rsync -avz --exclude='file.txt' --exclude='dir/' /local/path/ user@remote:/remote/path/

# 10. 使用 rsync 守护进程进行同步:
rsync -avz /local/path/ rsync://user@remote:/remote/path/

Ln:用于创建链接,可以是硬链接或符号链接。

软链接(Symbolic Link):

  1. 定义: 软链接是一个特殊的文件,它包含对另一个文件或目录的引用,类似于Windows中的快捷方式。

  2. 创建方式: 使用 ln -s 命令创建,例如:ln -s target_file link_name

  3. 特点:

    • 可以跨文件系统。
    • 可以链接到目录。
    • 可以包含相对或绝对路径。
    • 可以链接到不存在的文件。
  4. 删除: 如果原始文件被删除,软链接仍然存在,但它指向一个不存在的位置。

  5. 用途:

    • 创建快捷方式,简化文件路径。
    • 在不同目录之间共享文件。
    • 允许替代文件的不同版本。

硬链接(Hard Link):

  1. 定义: 硬链接是文件系统中多个文件共享同一数据块的链接,它们实际上是同一文件的多个别名。

  2. 创建方式: 使用 ln 命令创建,例如:ln target_file link_name

  3. 特点:

    • 必须在同一文件系统内。
    • 不能链接到目录。
    • 不能包含路径信息,只能链接到同一目录中的文件。
    • 链接的所有文件共享相同的 inode 和数据块。
  4. 删除: 当所有硬链接都被删除时,才会释放文件的磁盘空间。删除一个硬链接并不会影响其他硬链接。

  5. 用途:

    • 节省磁盘空间,因为多个链接共享相同的数据块。
    • 在备份中保留文件的多个版本。
    • 当文件需要在不同位置访问时,可以使用硬链接而无需复制文件内容。

总体而言,软链接提供更多的灵活性,可以跨越文件系统和链接到目录,但硬链接可以更有效地使用磁盘空间。选择使用哪种链接取决于具体的需求。

# ln 命令用法:
# 创建链接或符号链接。

ln [OPTION]... [-T] TARGET LINK_NAME
ln [OPTION]... TARGET
ln [OPTION]... TARGET... DIRECTORY
ln [OPTION]... -t DIRECTORY TARGET...

# 在第一种形式中,创建名为 LINK_NAME 的链接指向 TARGET。
# 在第二种形式中,在当前目录中创建指向 TARGET 的链接。
# 在第三种和第四种形式中,分别在 DIRECTORY 中创建链接到每个 TARGET。
# 默认情况下,创建硬链接,使用 --symbolic 创建符号链接。
# 默认情况下,每个目标(新链接的名称)不应该已经存在。
# 创建硬链接时,每个 TARGET 必须存在。符号链接可以包含任意文本;
# 如果以后解析,相对链接会相对于其父目录解释。

# 选项:
-b, --backup[=CONTROL]     # 对每个现有目标文件都进行备份
-d, -F, --directory        # 允许超级用户尝试创建目录的硬链接
-f, --force                # 移除现有的目标文件
-i, --interactive          # 提示是否删除目标文件
-L, --logical              # 解引用作为符号链接的 TARGET
-n, --no-dereference       # 如果 LINK_NAME 是指向目录的符号链接,则将其视为普通文件
-P, --physical             # 直接创建到符号链接的硬链接
-r, --relative             # 创建相对于链接位置的符号链接
-s, --symbolic             # 创建符号链接而不是硬链接
-S, --suffix=SUFFIX        # 覆盖常规的备份后缀
-t, --target-directory=DIRECTORY  # 指定要在其中创建链接的 DIRECTORY
-T, --no-target-directory  # 始终将 LINK_NAME 视为普通文件
-v, --verbose              # 打印每个链接的文件名
--help                     # 显示此帮助信息并退出
--version                  # 输出版本信息并退出

## 示例

# 1. 创建硬链接
ln target_file link_name

# 2. 创建符号链接
ln -s target_file symbolic_link_name

# 3. 在指定目录中创建硬链接
ln target_file -t /path/to/directory/

# 4. 创建目录的硬链接
ln -d target_directory link_to_directory

# 5. 强制创建链接
ln -f target_file force_link_name

# 6. 交互式创建链接
ln -i target_file interactive_link_name

# 7. 创建相对符号链接
ln -s -r target_file relative_symbolic_link

# 8. 创建硬链接而不解引用符号链接
ln -P target_file physical_link_name

# 9. 备份现有目标文件
ln -b target_file backup_link_name

# 10. 显示每个链接的文件名
ln -v target_file verbose_link_name

Git:版本控制系统

# Git 命令用法:
# 使用: git [--version] [--help] [-C <路径>] [-c <名称>=<值>]
# [--exec-path[=<路径>]] [--html-path] [--man-path] [--info-path]
# [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare]
# [--git-dir=<路径>] [--work-tree=<路径>] [--namespace=<名称>]
# [--super-prefix=<路径>] [--config-env=<名称>=<环境变量>]
# <命令> [<参数>]

# 以下是不同情境下常见的 Git 命令:

# 开始一个工作区(另请参阅:git help tutorial)
clone     # 将仓库克隆到新目录
init      # 创建空的 Git 仓库或重新初始化现有仓库

# 处理当前变更(另请参阅:git help everyday)
add       # 将文件内容添加到索引中
mv        # 移动或重命名文件、目录或符号链接
restore   # 恢复工作树文件
rm        # 从工作树和索引中移除文件

# 查看历史记录和状态(另请参阅:git help revisions)
bisect    # 使用二分搜索找到引入错误的提交
diff      # 显示提交之间、提交与工作树等的变更
grep      # 打印匹配模式的行
log       # 显示提交日志
show      # 显示不同类型的对象
status    # 显示工作树状态

# 管理、标记和调整共同历史
branch    # 列出、创建或删除分支
commit    # 记录对仓库的变更
merge     # 将两个或更多开发历史合并在一起
rebase    # 在另一个基本提交之上重新应用提交
reset     # 将当前 HEAD 重置为指定状态
switch    # 切换分支
tag       # 创建、列出、删除或验证使用 GPG 签名的标签对象

# 协作(另请参阅:git help workflows)
fetch     # 从另一个仓库下载对象和引用
pull      # 从另一个仓库或本地分支获取并整合
push      # 更新远程引用以及相关对象

# 'git help -a' 和 'git help -g' 列出可用的子命令和一些概念指南。
# 使用 'git help <命令>' 或 'git help <概念>' 查看特定子命令或概念的详细信息。
# 使用 'git help git' 获取系统概述。

## 常用示例:

# 1. 克隆仓库
git clone <仓库地址>

# 2. 添加文件到暂存区
git add <文件1> <文件2> ...

# 3. 提交变更
git commit -m "提交信息"

# 4. 推送到远程仓库
git push origin <分支名>

# 5. 从远程仓库拉取并合并
git pull origin <分支名>

# 6. 创建新分支
git branch <新分支名>

# 7. 合并分支
git merge <另一个分支名>

# 8. 显示工作目录状态
git status

# 9. 显示提交日志
git log

# 10. 显示工作目录与暂存区之间的变更
git diff

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

QH_ShareHub

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值