Git整合分支的两种方法
git merge 和git rebase的区别, 如图
一个事情很容易判断,使用merge会得到一个复杂的路线图,但是rebase会生成一条清晰的发展路线,所以还是建议使用rebase.
git merge 和git rebase的区别, 如图
一个事情很容易判断,使用merge会得到一个复杂的路线图,但是rebase会生成一条清晰的发展路线,所以还是建议使用rebase.
之前我找到了三个工具来删除重复文件,目前的工作主力系统为archlinux,
一般选择软件的顺序为官方仓库→Aur→Github,
因为在之前的三个工具中只有fdupes是archlinux官方仓库收录的工具,所以优先安装了。今天无意间又发现一款官方工具rmlint,
它是一个命令行工具,用于在 Linux
系统中查找和删除重复的和类似 lint
的文件。它有助于识别具有相同内容的文件,以及各种形式的冗余或
lint,例如空文件、损坏的符号链接和孤立文件。使用方法:
切换到要操作的文件目录,执行rmlint,
然后它会生成一个当前目录的重复及空目录等情况列表,同时有一个脚本rmlint.sh和一个目录结构文件rmlint.json.
若要真的执行删除重复的操作,在要操作的目录中执行./rmlint.sh,
然后在弹出的提示中,输入任意内容内执行完毕。
使用教程参考rmlint doc
在编辑或修改配置文件或旧文件前,我经常会把它们备份到硬盘的某个地方,因此我如果意外地改错了这些文件,我可以从备份中恢复它们。但问题是如果我忘记清理备份文件,一段时间之后,我的磁盘会被这些大量重复文件填满 —— 我觉得要么是懒得清理这些旧文件,要么是担心可能会删掉重要文件。如果你们像我一样,在类 Unix 操作系统中,大量多版本的相同文件放在不同的备份目录,你可以使用下面的工具找到并删除重复文件。
提醒一句:
在删除重复文件的时请尽量小心。如果你不小心,也许会导致意外丢失数据。我建议你在使用这些工具的时候要特别注意。
出于本指南的目的,我将讨论下面的三个工具:
这三个工具是自由开源的,且运行在大多数类 Unix 系统中。
1. RdfindRdfind 意即 redundant data find(冗余数据查找),是一个通过访问目录和子目录来找出重复文件的自由开源的工具。它是基于文件内容而不是文件名来比较。Rdfind 使用排序算法来区分原始文件和重复文件。如果你有两个或者更多的相同文件,Rdfind 会很智能的找到原始文件并认定剩下的文件为重复文件。一旦找到副本文件,它会向你报告。你可以决定是删除还是使用硬链接或者符号(软)链接代替它们。
安装 Rdfind
Rdfind 存在于 AUR 中。因此,在基于 Arch 的系统中,你可以像下面一样使用任一如 Yay AUR 程序助手安装它。
在 Debian、Ubuntu、Linux Mint 上:
1 | $ sudo apt-get install rdfind |
在 Fedora 上:
1 | $ sudo dnf install rdfind |
在 RHEL、CentOS 上:
1 | $ sudo yum install epel-release $ sudo yum install rdfind |
用法
一旦安装完成,仅带上目录路径运行 Rdfind 命令就可以扫描重复文件。

正如你看到上面的截屏,Rdfind 命令将扫描 ~/Downloads
目录,并将结果存储到当前工作目录下一个名为 results.txt
的文件中。你可以在 results.txt
文件中看到可能是重复文件的名字。
1 | $ cat results.txt # Automatically generated # duptype id depth size device inode priority name DUPTYPE_FIRST_OCCURRENCE 1469 8 9 2050 15864884 1 /home/sk/Downloads/tor-browser_en-US/Browser/TorBrowser/Tor/PluggableTransports/fte/tests/dfas/test5.regex DUPTYPE_WITHIN_SAME_TREE -1469 8 9 2050 15864886 1 /home/sk/Downloads/tor-browser_en-US/Browser/TorBrowser/Tor/PluggableTransports/fte/tests/dfas/test6.regex [...] DUPTYPE_FIRST_OCCURRENCE 13 0 403635 2050 15740257 1 /home/sk/Downloads/Hyperledger(1).pdf DUPTYPE_WITHIN_SAME_TREE -13 0 403635 2050 15741071 1 /home/sk/Downloads/Hyperledger.pdf # end of file |
通过检查 results.txt
文件,你可以很容易的找到那些重复文件。如果愿意你可以手动的删除它们。
此外,你可在不修改其他事情情况下使用 -dryrun
选项找出所有重复文件,并在终端上输出汇总信息。
1 | $ rdfind -dryrun true ~/Downloads |
一旦找到重复文件,你可以使用硬链接或符号链接代替他们。
使用硬链接代替所有重复文件,运行:
1 | $ rdfind -makehardlinks true ~/Downloads |
使用符号链接/软链接代替所有重复文件,运行:
1 | $ rdfind -makesymlinks true ~/Downloads |
目录中有一些空文件,也许你想忽略他们,你可以像下面一样使用
-ignoreempty 选项:
1 | $ rdfind -ignoreempty true ~/Downloads |
如果你不再想要这些旧文件,删除重复文件,而不是使用硬链接或软链接代替它们。
删除重复文件,就运行:
1 | $ rdfind -deleteduplicates true ~/Downloads |
如果你不想忽略空文件,并且和所哟重复文件一起删除。运行:
1 | $ rdfind -deleteduplicates true -ignoreempty false ~/Downloads |
更多细节,参照帮助部分:
手册页:
2. FdupesFdupes 是另一个在指定目录以及子目录中识别和移除重复文件的命令行工具。这是一个使用 C 语言编写的自由开源工具。Fdupes 通过对比文件大小、部分 MD5 签名、全部 MD5 签名,最后执行逐个字节对比校验来识别重复文件。
与 Rdfind 工具类似,Fdupes 附带非常少的选项来执行操作,如:
安装 Fdupes
Fdupes 存在于大多数 Linux 发行版的默认仓库中。
在 Arch Linux 和它的变种如 Antergos、Manjaro Linux 上,如下使用 Pacman 安装它。
在 Debian、Ubuntu、Linux Mint 上:
1 | $ sudo apt-get install fdupes |
在 Fedora 上:
1 | $ sudo dnf install fdupes |
在 RHEL、CentOS 上:
1 | $ sudo yum install epel-release $ sudo yum install fdupes |
用法
Fdupes
用法非常简单。仅运行下面的命令就可以在目录中找到重复文件,如:~/Downloads。
我系统中的样例输出:
1 | /home/sk/Downloads/Hyperledger.pdf /home/sk/Downloads/Hyperledger(1).pdf |
你可以看到,在 /home/sk/Downloads/
目录下有一个重复文件。它仅显示了父级目录中的重复文件。如何显示子目录中的重复文件?像下面一样,使用
-r 选项。
现在你将看到 /home/sk/Downloads/
目录以及子目录中的重复文件。
Fdupes 也可用来从多个目录中迅速查找重复文件。
1 | $ fdupes ~/Downloads ~/Documents/ostechnix |
你甚至可以搜索多个目录,递归搜索其中一个目录,如下:
1 | $ fdupes ~/Downloads -r ~/Documents/ostechnix |
上面的命令将搜索 ~/Downloads
目录,~/Documents/ostechnix
目录和它的子目录中的重复文件。
有时,你可能想要知道一个目录中重复文件的大小。你可以使用
-S 选项,如下:
1 | $ fdupes -S ~/Downloads 403635 bytes each: /home/sk/Downloads/Hyperledger.pdf /home/sk/Downloads/Hyperledger(1).pdf |
类似的,为了显示父目录和子目录中重复文件的大小,使用 -Sr
选项。
我们可以在计算时分别使用 -n 和 -A
选项排除空白文件以及排除隐藏文件。
1 | $ fdupes -n ~/Downloads $ fdupes -A ~/Downloads |
在搜索指定目录的重复文件时,第一个命令将排除零长度文件,后面的命令将排除隐藏文件。
汇总重复文件信息,使用 -m 选项。
1 | $ fdupes -m ~/Downloads 1 duplicate files (in 1 sets), occupying 403.6 kilobytes |
删除所有重复文件,使用 -d 选项。
样例输出:
1 | [1] /home/sk/Downloads/Hyperledger Fabric Installation.pdf [2] /home/sk/Downloads/Hyperledger Fabric Installation(1).pdf Set 1 of 1, preserve files [1 - 2, all]: |
这个命令将提示你保留还是删除所有其他重复文件。输入任一号码保留相应的文件,并删除剩下的文件。当使用这个选项的时候需要更加注意。如果不小心,你可能会删除原文件。
如果你想要每次保留每个重复文件集合的第一个文件,且无提示的删除其他文件,使用
-dN 选项(不推荐)。
当遇到重复文件时删除它们,使用 -I 标志。
关于 Fdupes 的更多细节,查看帮助部分和 man 页面。
1 | $ fdupes --help $ man fdupes |
3. FSlintFSlint 是另外一个查找重复文件的工具,有时我用它去掉 Linux 系统中不需要的重复文件并释放磁盘空间。不像另外两个工具,FSlint 有 GUI 和 CLI 两种模式。因此对于新手来说它更友好。FSlint 不仅仅找出重复文件,也找出坏符号链接、坏名字文件、临时文件、坏的用户 ID、空目录和非精简的二进制文件等等。
安装 FSlint
FSlint 存在于 AUR,因此你可以使用任一 AUR 助手安装它。
在 Debian、Ubuntu、Linux Mint 上:
1 | $ sudo apt-get install fslint |
在 Fedora 上:
1 | $ sudo dnf install fslint |
在 RHEL,CentOS 上:
1 | $ sudo yum install epel-release $ sudo yum install fslint |
一旦安装完成,从菜单或者应用程序启动器启动它。
FSlint GUI 展示如下:

如你所见,FSlint 界面友好、一目了然。在 “Search path” 栏,添加你要扫描的目录路径,点击左下角 “Find” 按钮查找重复文件。验证递归选项可以在目录和子目录中递归的搜索重复文件。FSlint 将快速的扫描给定的目录并列出重复文件。

从列表中选择那些要清理的重复文件,也可以选择 “Save”、“Delete”、“Merge” 和 “Symlink” 操作他们。
在 “Advanced search parameters” 栏,你可以在搜索重复文件的时候指定排除的路径。

FSlint 命令行选项
FSlint 提供下面的 CLI 工具集在你的文件系统中查找重复文件。
findup — 查找重复文件findnl — 查找名称规范(有问题的文件名)findu8 — 查找非法的 utf8 编码的文件名findbl — 查找坏链接(有问题的符号链接)findsn — 查找同名文件(可能有冲突的文件名)finded — 查找空目录findid — 查找死用户的文件findns — 查找非精简的可执行文件findrs — 查找文件名中多余的空白findtf — 查找临时文件findul — 查找可能未使用的库zipdir — 回收 ext2 目录项下浪费的空间所有这些工具位于 /usr/share/fslint/fslint/fslint
下面。
例如,在给定的目录中查找重复文件,运行:
1 | $ /usr/share/fslint/fslint/findup ~/Downloads/ |
类似的,找出空目录命令是:
1 | $ /usr/share/fslint/fslint/finded ~/Downloads/ |
获取每个工具更多细节,例如:findup,运行:
1 | $ /usr/share/fslint/fslint/findup --help |
关于 FSlint 的更多细节,参照帮助部分和 man 页。
1 | $ /usr/share/fslint/fslint/fslint --help $ man fslint |
总结
现在你知道在 Linux 中,使用三个工具来查找和删除不需要的重复文件。这三个工具中,我经常使用 Rdfind。这并不意味着其他的两个工具效率低下,因为到目前为止我更喜欢 Rdfind。
作为一名物理学工作者,输入大量的LaTeX公式不可避免,然后为了节省输入时间,以及输入的规范化,本文介绍三个标准的宏包,希望能够为您的工作增效。
具体使用说明,安装Texlive后,请执行:texdoc physics
等。
physics The goal of this package is to make typesetting equations for physics simpler, faster, and more human readable. To that end, the commands included in this package have names that make the purpose of each command immediately obvious and remove any ambiguity while reading and editing physics code. From a practical standpoint, it is handy to have a well-defined set of shortcuts for accessing the long-form of each of these commands. The commands listed below are therefore defined in terms of their long-form names and then shown explicitly in terms of the default shorthand command sequences. These shorthand commands are meant make it easy to remember both the shorthand names and what each one represents.
physconst This package consists of several macros that are shorthand for a variety of physical constants, e.g. the speed of light. The package developed out of physics and astronomy classes that I have taught and wanted to ensure that I had correct values for each constant and did not wish to retype them every time I use them. The constants can be used in two forms, the most accurate available values, or versions that are rounded to 3 significant digits for use in typical classroom settings, homework assignments, etc.
physunits This package consists of several macros that are shorthand for a variety of physical units that are commonly used in introductory level physics and astronomy classes. At present, this package provides some similar units to those in siunitx, but is uses slightly different macro names for each. This package also provides a number of non-SI units (e.g. erg, cm, BTU).
若文章中几处需要添加相同内容的脚注,各自都写\footnote{*}的话,则会出现好几个内容重复的脚注。这个问题可以通过“标签引用”+“上标”来解决。比如我们要给ORL和Jaffe都添加同样的脚注,可以这样:
1 | ORL\footnote{http://blog.csdn.net/bear\_kai\label{web}} and |
注意网址中有下划线时,在latex中需要额外加一个反斜杠即“转义字符”。
默认情况下 pip 使用的是国外的镜像,在下载的时候速度非常慢,本文我们介绍使用国内清华大学的源,地址为:
1 | https://pypi.tuna.tsinghua.edu.cn/simple |
我们可以直接在 pip 命令中使用 -i
参数来指定镜像地址,例如:
1 | pip3 install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple |
以上命令使用清华镜像源安装 numpy 包。这种只对当前安装对命令有用,如果需要全局修改,则需要修改配置文件。
Linux/Mac os 环境中,配置文件位置在 ~/.pip/pip.conf(如果不存在创建该目录和文件):
1 | mkdir ~/.pip |
打开配置文件 ~/.pip/pip.conf,修改如下:
1 | [global] |
查看 镜像地址:
1 | $ pip3 config list |
可以看到已经成功修改了镜像。
Windows下,你需要在当前对用户目录下(C:\\Users\\xx\\pip,xx
表示当前使用对用户,比如张三)创建一个
pip.ini在pip.ini文件中输入以下内容:
1 | [global] |
trash-cli 用于移动文件到回收站,同时会记录文件的原地址、删除日期和权限。trash-cli 和 KDE、GNOME、XFCE 使用同一个回收站,你可以在命令行或脚本运行 trash-cli。
1 | sudo pacman -S trash-cli |
| 命令 | 作用 |
|---|---|
| trash-put | 把文件或目录移动到回收站 |
| trash-empty | 清空回收站 |
| trash-list | 列出回收站文件 |
| trash-restore | 恢复回收站文件 |
| trash-rm | 删除回收站文件 |
移动文件到回收站: 1
$ trash-put
列出回收站文件: 1
2
3
4$ trash-list
2008-06-01 10:30:48 /home/andrea/bar
2008-06-02 21:50:41 /home/andrea/bar
2008-06-23 21:50:49 /home/andrea/foo
搜索回收站文件: 1
2
3$ trash-list | grep foo
2007-08-30 12:36:00 /home/andrea/foo
2007-08-30 12:39:41 /home/andrea/foo
恢复回收站文件: 1
2
3
4
5
6
7
8
9$ trash-restore
0 2007-08-30 12:36:00 /home/andrea/foo
1 2007-08-30 12:39:41 /home/andrea/bar
2 2007-08-30 12:39:41 /home/andrea/bar2
3 2007-08-30 12:39:41 /home/andrea/foo2
4 2007-08-30 12:39:41 /home/andrea/foo
What file to restore [0..4]: 4
$ ls foo
foo
删除所有回收站文件: 1
$ trash-empty
删除回收站中 n 天前被回收的文件: 1
$ trash-empty <days>
示例: 1
2
3
4
5
6
7
8
9
10
11
12
13$ date
Tue Feb 19 20:26:52 CET 2008
$ trash-list
2008-02-19 20:11:34 /home/einar/today
2008-02-18 20:11:34 /home/einar/yesterday
2008-02-10 20:11:34 /home/einar/last_week
$ trash-empty 7
$ trash-list
2008-02-19 20:11:34 /home/einar/today
2008-02-18 20:11:34 /home/einar/yesterday
$ trash-empty 1
$ trash-list
2008-02-19 20:11:34 /home/einar/today
只删除符合某种模式的文件: 1
$ trash-rm \*.o
注意:要用双引号圈住模式来避免 shell 拓展。
如何创建顶级 .Trash 目录? 1
2
3sudo mkdir --parent /.Trash
sudo chmod a+rw /.Trash
sudo chmod +t /.Trash
我能把 rm 的别名设置为 trash-put 吗?
可以,但不应该这样做。以前我觉得这是个好主意,但现在我不觉得。
虽然 trash-put 的界面看起来与 rm
兼容,但它们有不同的语法,这些差异会导致一些问题。比如,用
rm 删除目录时需要 -R , trash-put
则不需要。
但有时候我忘记用 trash-put 了,真的不能给
rm 设置别名吗?
你可以给 rm 设置一个别名来提醒你不要使用它:
1
alias rm='echo "This is not the command you are looking for."; false'
如果你真的要用 rm ,那就在 rm
前加上斜杠来取消别名: 1
\rm file-without-hope
注意,Bash 别名是有在交互式界面才有效,所以使用这个别名不会影响使用
rm 的脚本。
被移动到回收站的文件在哪?从 home 分区移动到回收站的文件在这:
1
~/.local/share/Trash/
删除文件test.tex, 直接命令输入
1
mv -t ~/.local/share/Trash/files --backup=t test.tex
在shell中取别名 1
alias del='mv -t ~/.local/share/Trash/files --backup=t'
使用rl命令查看回收站的内容
1
2
3
4
5
6alias rl='ls ~/.local/share/Trash/files'
alias ur=undelfile
undelfile()
{
mv -i ~/.local/share/Trash/files/$@ ./
}
使之立刻生效 1
2source ~/.zshrc
source ~/.bashrc
注意:文件~/.zshrc针对zsh配置,~/.bashrc针对bash配置。
今天我们来聊聊一个在 Python 数据科学领域中日益受到关注的库——CuPy。
什么是 CuPy?
CuPy 是一个开源的 Python 库,它的设计初衷是为了使得在 GPU 上的计算变得简单快捷。
它提供了与 NumPy 非常相似的 API,这意味着如果你已经熟悉 NumPy,那么使用 CuPy 将会非常容易。
CuPy 的亮点在于它能够利用 NVIDIA GPU 来加速计算,这在处理大规模数据时尤其有用。
为什么选择 CuPy?
安装 CuPy
安装 CuPy 相当简单。你只需要使用 pip 命令:
1 | # For CUDA 11.2 ~ 11.x |
一个简单的例子
让我们来看一个简单的例子,对比一下 NumPy 和 CuPy 在处理同样任务时的速度差异。
1 | import numpy as np |
NumPy 时间:3.474796772003174
CuPy 时间:0.0693259145678
在这个例子中,我们创建了一个大型数组,并计算了它的平方。
我们会发现,使用 CuPy 完成同样的任务所需的时间远少于 NumPy,速度提升了 50 倍。
一个更酷的性能对比
创建一个 3D NumPy
数组并执行一些数学函数。time.time()
1 | import time |
同样,创建一个 3D CuPy 数组,执行数学运算,并为其计时以提高性能。
1 | # CuPy and GPU Runtime |
为了计算差异,我们将 NumPy 时间除以 CuPy 时间
1 | diff = np_time/cp_time |
在使用 CuPy 时,我们似乎获得了超过 500 倍的性能提升。
CuPy 的基础知识
在本节中,我们将比较 CuPy 和 Numpy 的语法,它们有 95% 的相似度。
1 | import cupy as cp |
正如我们所看到的,我们得到了类似的结果。
1 | Numpy: 7.0710678118654755 |
cp.asarray(X)1 | x_array = np.array([10, 22, 30]) |
cupy.ndarray
.get()1 | x_np_array = x_cp_array.get() |
numpy.ndarray
CuPy 高级应用示例
图像处理是 CuPy 的一个重要应用领域。以下是一个使用 CuPy 进行边缘检测的示例:
1 | import cupy as cp |
这个示例展示了如何使用 CuPy 在 GPU 上进行图像的边缘检测,这对于图像分析和计算机视觉应用非常有用。
CuPy 在处理大规模数据运算时表现出色。下面是一个矩阵乘法的示例:
1 | import cupy as cp |
这个示例展示了 CuPy 在执行大规模矩阵乘法时的高效性,这对于科学计算和数据分析尤其重要。
CuPy 也可以用于构建和训练简单的神经网络。以下是一个示例:
1 | import cupy as cp |
这个示例展示了如何使用 CuPy 进行简单的神经网络前向传播计算。
以上示例展示了 CuPy 在不同领域的应用,包括图像处理、大规模数据运算和深度学习。
CuPy 和 NumPy 之间的区别
别问我有什么区别,问就是几乎一样样。实在要知道到底有什么区别,参考Differences between CuPy and NumPy
Cupy 与 Numpy 互转
1 | import cupy as cp |
Cupy 与 Pytorch 互转
1 | # 需借助中间库 dlpack |
Numpy 与 Pytorch 互转
1 | import numpy as np |
Beyond NumPy
让我们以一张表结束:最快的 CPU VS 最快的 GPU。

CuPy 是一个强大的工具,它能够显著提高数据处理的速度。
对于那些希望在数据科学和机器学习领域进一步提升效率的朋友们,CuPy 绝对值得一试。
自从网易、新浪等博客网站关闭后,我决定使用 Hexo 在
Github、Gitee 和 Gitlab
等代码托管平台,借助其 Pages
功能来部署自己的博客。但是每次都使用 Hexo
的标准命令进行操作,步骤上确实很繁琐。随着时间的推移,博客内容越来越多,于是就需要一个能够管理博客并方便发布博客的工具。为了达成这个目标,diary.sh
应运而生!这个脚本一直作为我的私人程序使用,但由于前期编写
Shell
代码的水平有限,使得脚本的通用性不佳,同时一些功能的实现也不太理想。在熟练掌握
Shell 后,我改进了程序,推出了通用版本,并将版本号升级为
V8.0。在新版中,个人信息将以配置文件的形式由作者自行填写,脚本中不再保留任何个人信息。
1 | # Program : diary.sh |
1 | sudo curl -o /usr/local/bin/diary https://gitlab.com/fengzhenhua/script/-/raw/usbmain/diary.sh\?inline\=false |
使用方法: diary -h 获取帮助。
已经脚本程序分别发布于gitlab和gitee,
请您自行前往下载:
可用脚本为:
| 脚本 | 作用 |
|---|---|
| arcsetup.sh | 配置ArchLinux |
| diary.sh | 管理GitLab博客 |
| ugit.sh | U盘仓库管理, 单U盘版 |
| neougit.sh | U盘仓库管理, 多U盘版 |
| updatehost.sh | 升级host访问github |
| translatorGD.py | Goldendict 添加网络翻译 |