Skip to content

Latest commit

 

History

History
167 lines (110 loc) · 6.96 KB

README.md

File metadata and controls

167 lines (110 loc) · 6.96 KB

Missing Semester

前言

记录课后习题的解决方案。

  • 所用操作系统是 Unubtu 22.04,shell 环境是普通的 bash shell。

1. 课程概览与 shell

  • shell 会从环境变量 $PATH 中搜索执行程序的路径(基于程序的名称搜索)
  • which 用于确定某个程序名代表的是哪个具体的程序
  • 为进入某个文件夹,需要具备该文件夹以及其父文件夹的“搜索”权限(以“可执行” x 权限表示)。
  • shellbang:#! 后跟解释器绝对路径

ls -a # 不忽略以 . 开头的项(linux 中 . 开头的项会被隐藏)

ls -h -l -s # -l 使用长列表格式,-s 打印文件大小,-h 指示打印大小时用 234M、1K 这样的格式

ls -t # 以时间顺序排序所列出的信息,默认是字典序

ls --color=always # 着色输出,默认就是这个配置

以下都针对 bash shell 而言

  • 为变量赋值: foo=bar
  • 访问变量值: $foo

注意 foo = bar (使用空格隔开)无法正确工作。因为解释器会调用程序 foo 并将 =bar 作为参数。在 shell 脚本中使用空格会起到分割参数的作用,有时可能会造成混淆,请务必多加检查。

  • $0 - 脚本名

  • $1$9 - 脚本的参数。 $1 是第一个参数,依此类推。

  • $@ - 所有参数

  • $# - 参数个数

  • $? - 前一个命令的返回值

  • $$ - 当前脚本的进程识别码

  • !! - 完整的上一条命令,包括参数。常见应用:当你因为权限不足执行命令失败时,可以使用 sudo !! 再尝试一次。

  • $_ - 上一条命令的最后一个参数。如果你正在使用的是交互式 shell,你可以通过按下 Esc 之后键入 . 来获取这个值。

  • 命令返回 0 表示正常执行,返回非 0 表示有错误发生。

  • true 程序的返回码永远是 0,false 程序的返回码永远是 1。

  • 命令替换(command substitution):以变量的形式获取一个命令的输出。如 $( CMD ) 会被替换为 CMD 命令的输出

  • 进程替换(process substitution), <( CMD ) 会执行 CMD 并将结果输出到一个临时文件中,并将 <( CMD ) 替换成临时文件名。这在我们希望返回值通过文件而不是 STDIN 传递时很有用。例如, diff <(ls foo) <(ls bar) 会显示文件夹 foo 和 bar 中文件的区别。

  • shell 通配(globbing):基于文件扩展名展开表达式

  • 花括号 {}:当你有一系列的指令,其中包含一段公共子串时,可以用花括号来自动展开这些命令。这在批量移动或转换文件时非常方便。

convert image.{png,jpg}
# 会展开为
convert image.png image.jpg
  • find 命令:递归地搜索符合条件的文件
# 查找所有名称为src的文件夹
find . -name src -type d
# 查找所有文件夹路径中包含test的python文件
find . -path '*/test/*.py' -type f
# 查找前一天修改的所有文件
find . -mtime -1
# 查找所有大小在500k至10M的tar.gz文件
find . -size +500k -size -10M -name '*.tar.gz'

除了列出所寻找的文件之外,find 还能对所有查找到的文件进行操作,这能极大地简化一些单调的任务。

# 删除全部扩展名为.tmp 的文件
find . -name '*.tmp' -exec rm {} \;
# 查找全部的 PNG 文件并将其转换为 JPG
find . -name '*.png' -exec convert {} {}.jpg \;
  • grep 命令:对输入文本进行匹配

grep 有很多选项:

  • -C :获取查找结果的上下文(Context);
  • -v:对结果进行反选(Invert)即输出不匹配的结果。

grep -C 5:输出匹配结果前后五行。

  • -R :递归地进入子目录并搜索所有的文本文件。

  • Ctrl+R 对命令历史记录进行回溯搜索


3. vim 编辑器

  • :e {文件名}:打开要编辑的文件
  • :help {标题}:打开帮助文档,比如 :help :w 打开 :w 命令的帮助文档。
  • ~:改变字符大小写
  • da' 删除一个单引号字符串,包括周围的单引号
  • 编辑 ~/.vimrc 配置文件来自定义 vim
  • 8.0 后的 vim 有内置的插件管理器,为了扩展 vim 只需创建一个 ~/.vim/pack/vendor/start 文件夹并将插件放入其中。
  • :s:替换命令。:s /test/Test/g 在整个文件中将 test 全局替换成 Test
  • :sp/:vsp:分割窗口

4. 数据整理

  • sed:基于 ed 的流编辑器
  • .:匹配除换行符之外的任意单个字符
  • *+ 后跟一个 ? 可使表达式变成非贪婪模式。(sed 不支持)
  • sed 的 -E 选项可启用扩展的正则表达式
  • sed 的替换命令:s/REGEX/SUBSTITUTION/
  • 被圆括号内的正则表达式匹配到的文本都会被存入一系列以编号区分的捕获组中。捕获组的内容可以在替换字符串时使用(sed -E 's/REGEX/\1')。可通过 \1 引用第一个捕获组的内容。
  • sort:排序输入数据
  • uniq -c:将连续出现的行折叠为一行并用出现次数作为前缀
  • sort -n:按数字顺序排序输入(默认为 ASCII)

可视化版本历史

一个版本对应一次提交,所以可视化版本历史就是可视化提交(commit)历史。

通过 git log --graph --all --oneline --decorate 可视化提交历史(以图形方式展示提交历史和分支结构。)。

  • --all:显示所有分支的提交历史,包括远程分支和分离头指针。
  • --graph:以图形方式显示提交历史和分支结构。
  • --oneline:以一行显示每个提交的简化信息。
  • --decorate:显示每个提交的引用,包括分支、标签等

参考资料

找出 README.md 的最后修改者

可以通过 git loggit blame 来做,采用 log 做法的命令是:git log -1 README.md

  • -<n>:只显示最近的 n 次提交

参考资料

git 查看文件修改记录

清除提交历史中的敏感信息

最近的做法是利用 git filter-repo 这款工具

参考资料