__ __ __ __ ____ ___
/\ \ /\ \ /\ \ __ /\ \ /\ _`\ /\_ \
\ `\`\\/'/__ __ ___\ \ \___ /\_\\ \/ ____ \ \ \L\ \//\ \ ___ __
`\ `\ /'/\ \/\ \ /'___\ \ _ `\/\ \\/ /',__\ \ \ _ <'\ \ \ / __`\ /'_ `\
`\ \ \\ \ \_\ \/\ \__/\ \ \ \ \ \ \ /\__, `\ \ \ \L\ \\_\ \_/\ \L\ \/\ \L\ \
\ \_\\/`____ \ \____\\ \_\ \_\ \_\ \/\____/ \ \____//\____\ \____/\ \____ \
\/_/ `/___/> \/____/ \/_/\/_/\/_/ \/___/ \/___/ \/____/\/___/ \/___L\ \
/\___/ /\____/
\/__/ \_/__/ '`
此页内容多为软件使用技巧,绝大部分内容来自互联网,如有侵权,请与我联系。也有部分内容系自己使用软件所得的一些经验,仅供参考。
FFmepg
转视频为 gif
|
|
又:加速播放。假设原视频 60 fps,输出降到 30 fps,丢掉一半的帧。
|
|
又:不想丢帧。将输入扩大一倍,输出保留原样。
|
|
又:不想全转。从视频的第 2 秒开始,截取 3 秒转化为 gif。
|
|
又:控制转化质量。
|
|
VOB 转 MP4
cf. http://www.ruhuamtv.com/thread-9782-1-1.html
|
|
又:合并 VOB 文件。
|
|
又:合并 mp4 文件。 see: https://www.tais3.com/others/983.html
|
|
TS 转 MP4
|
|
cf.
- https://www.reddit.com/r/ffmpeg/comments/ggmjep/comment/fq2m1ux/?utm_source=share&utm_medium=web2x&context=3
- https://askubuntu.com/a/716457
分辨率、码率、帧率相关介绍,及相关压缩方法:
- https://blog.csdn.net/weixin_30536861/article/details/114496746
- https://zhuanlan.zhihu.com/p/255042580
写给新手的指令:https://gnu-linux.readthedocs.io/zh/latest/Chapter04/00_ffmpeg.basic.html
ImageMagick
图片转换
转换图片为指定分辨率。
|
|
又:按百分比转换大小。
|
|
又:忽略原始宽高比。
|
|
又:多张图片合成 gif。
|
|
又:更改分辨率。
|
|
又,裁切 gif。
|
|
|
|
- Animated gifs are often optimised to save space, but imagemagick doesn’t seem to consider this when applying the crop command and treats each frame individually. -coalesce rebuilds the full frames.
- Other commands will take into consideration the offset information supplied in the original gif, so you need to force that to be reset with -repage 0x0.
- The crop itself is straightforward, with width, height, x offset and y offset supplied respectively. For example, a crop 40 wide and 30 high at an x offset of 50 = 40x30+50+0.
- Crop does not remove the canvas that it snipped from the image. Applying +repage after the crop will do this.
cf. https://stackoverflow.com/a/14036766
Shell
行内操作
^a
: jump to BOL^e
: jump to EOL^u
: delete the line^k
: delete to EOL^w
: delete a word forwardalt+f
: jump a word forwardalt+b
: jump a word backward^r
: search historyalt+.
: complete second parameter
任务控制
- 执行
command
- 按
^z
挂起当前 job - 按
bg
后台继续该 job - 按
fg
召回前台
后台运行命令
|
|
或者如果你不想看到任何输出,使用
|
|
- 如此你可以继续使用当前 shell
- 使用
bg
查看是否有任务在后台运行 - 使用
jobs
查看后台任务 - 使用
fg
将任务召回前台 - 不能退出 shell,否则进程会被杀掉
- 使用
disown
丢掉进程,可以退出 shell
又:
|
|
等价于以上的操作。单纯的nohup command
会在当前目录创建一个隐藏文件以写入命令的输出。以上命令将程序的输出重定向至比特桶丢弃。
同时输出到 console 和文件
将命令输出重定向到文件:
|
|
将命令输出 (stdout) 及报错 (stderr) 重定向到文件:
|
|
同时输出到 console 和文件:
|
|
|| visible in terminal || visible in file || existing
Syntax || StdOut | StdErr || StdOut | StdErr || file
==========++==========+==========++==========+==========++===========
> || no | yes || yes | no || overwrite
>> || no | yes || yes | no || append
|| | || | ||
2> || yes | no || no | yes || overwrite
2>> || yes | no || no | yes || append
|| | || | ||
&> || no | no || yes | yes || overwrite
&>> || no | no || yes | yes || append
|| | || | ||
| tee || yes | yes || yes | no || overwrite
| tee -a || yes | yes || yes | no || append
|| | || | ||
n.e. (*) || yes | yes || no | yes || overwrite
n.e. (*) || yes | yes || no | yes || append
|| | || | ||
|& tee || yes | yes || yes | yes || overwrite
|& tee -a || yes | yes || yes | yes || append
Ref:
- https://askubuntu.com/questions/420981/how-do-i-save-terminal-output-to-a-file
- https://www.gnu.org/software/bash/manual/bash.html#Redirections
从系统中踢出某个用户
|
|
Ref: https://www.putorius.net/kick-user-off-linux-system.html
Command find
|
|
前面的选项不常用,初级使用只需掌握
|
|
path
- search pathexpression
- expands to-options [-print -exec -ok]
-options
: 指定 find 常用选项-print
: 将匹配到的文件写入标准输出 [默认]-exec
: 在匹配到的文件上执行一串命令。格式为<command> {} \;
,注意 {} 和 ; 之间的空格。find . -size 0 -exec rm {} \;
- 删除当前目录下 size 为 0 的文件rm -i $(find . -size 0)
- 同上find . -size 0 | xargs rm -f &
- 同上
-ok
: 同上,执行命令前会询问
常用选项
- name - 按照文件名查找
find <dir> -name "*.cpp"
: 在目录 dir 下查找后缀为 cpp 的文件-name
默认不支持正则表达式,顶多支持通配符*
- perm - 按照文件权限查找
- user - 按照文件所有者查找
- group - 按照文件所有组查找
- type - 按照文件类型查找
- size - 按照文件大小查找
- …
正则表达式
|
|
但是默认的正则表达式引擎我也不知道是啥,反正不解析我习惯的那种正则语法。故使用:
|
|
上述命令找出当前文件夹及子文件夹所有后缀名为log
,aux
,blg
的文件。
几个例子
find . -name "*name*"
- 找出当前文件夹文件名包含“name”的文件find . ! -type d -print
- 在当前目录查找非目录文件find . -newer file1 ! file2
- 查找比 file1 新但比 file2 旧的文件find -type d -empty | xargs -n 1 rmdir
- 批量删除当前目录下的空文件夹find -tyle l -exec ls -l {} +
- 找出当前文件夹下损坏的软连接
Command grep
最基本用法:
|
|
使用正则表达式
grep
支持三种正则:basic (BRE), extend (ERE), perl (PCRE). 不同的grep
实现方式不同,详见手册。一般 extend 最为常用,语法为
|
|
Ref:
Command xargs
|
|
Ref:
Command sed
Command cut
|
|
基本用法:
|
|
Git
创建别名
使用 git log
查看提交历史,但是输出冗杂。通常使用
|
|
来获得更美观易读的输出。但是每次输入这么多肯定很烦人,使用
|
|
增加一个全局别名,这个别名对于任何地方的 git
都适用。如此一来,键入 git graph
会等效于
|
|
样例输出:
|
|
忽略已经添加的文件
|
|
推送本地分支到远程
|
|
拉取远程分支到本地
|
|
删除 commit 历史
如果不小心将隐私信息推送至远程仓库(如 github),那么仅仅删除再更新再推送到远程仓库覆盖是不够的,别人还是可以通过你的 commit 历史查到你所做的更改,所以这种情况下必须删除之前所有的 commit history. 大致思路是创建一个孤立分支,然后重新添加文件,再删除 master 分支,将新建的分支重命名为 master,再推送到远程强制覆盖 1。
|
|
合并某个文件到当前分支
例如当前在 master 分支,希望合并某个分支 dev 的某个或多个文件到当前分支:
|
|
但是上述做法会强行覆盖当前分支的文件,没有冲突处理,更安全的做法是先从当前分支新建分支 master_temp,然后在 master_temp 中 checkout,最后再将 master_temp 分支 merge 到 master 分支:
|
|
Ref: https://segmentfault.com/a/1190000008360855
Git merge
当你觉得很多时候对于一个命令的很多子命令或者选项不是很清晰,而且查了忘,忘了查,那多半是你不理解它的工作机制。或者说它对你来说不是那么自然易懂,这个时候就需要深入以下,了解以下它的基本原理,帮助自己理解,以便记忆。
git merge
就是如此,你要知道 merge 的含义是什么?它其实就是在被 merge 的分支上重现要 merge 的 commits. 比如说:
a---b---c---d---e (master)
\
`--A---B---C (dev)
你当前在 master 分支的 e 节点,你要 merge dev 分支。其实就是将 A、B、C 三个 commit 在 master 分支上重现,仿佛 master 分支上曾经也做过这些改动。那么冲突的来源就是你在两个分支中,对同一个文件作了不同的改动,如何解决不言而喻。
小朋友,你是否有很多?
Q: 我想只重现 B 节点怎么办?
A: git checkout master && git cherry-pick 62ecb3
,这里62ecb3
是节点 B 的 commit 标识。
Q: 我想重现 A-B,但不要 C 怎么办?
A: git checkout -b newbranch 62ecb3 && git rebase --onto master 76cada^
,这里76cada
是 A 节点的 commit 标识。先基于 B 创建一个分支,这个分支包含了 A 节点的改动,然后 rebase 到 master 上去,结果就是 A 和 B 重现在 master 分支上。
Ref:
- https://stackoverflow.com/questions/161813/how-to-resolve-merge-conflicts-in-git
- Cherry-Picking specific commits from another branch
Fork 之后如何同步 fork 源的更新
|
|
从上游仓库 fetch 分支和提交点,提交给本地 master,并会被存储在一个本地分支 upstream/master
|
|
切换到任意分支,merge 已经 fetch 的分支即可:
|
|
see: https://www.zhihu.com/question/28676261
Ref:
从另一个分支检出某个文件并重命名
有时候开了一个孤立分支,但是想参考其他分支的代码,而当前分支又有同名文件,此时就需要从其他分支检出文件并重命名。
|
|
Ref: search “git-checkout older revision of a file under a new name” in stack overflow
查看已被跟踪的文件
|
|
Ref: search “how can i make git show a list of the files that are being tracked” in stack overflow
submodule
git submodule 本质上是指向一个其他仓库的链接,默认 clone 不会将 submodule 对应的仓库克隆下来。
|
|
一般地,当某仓库中包含 submodule ./dir1 时,如果你只提交了 dir1 的内容,那么当前仓库是不会用上最新版本的 dir1 的。这在远程仓库中尤为显著。我的博客文件夹 BlogHugo 中包含了 themes/even 的 submodule, 每当我在 even 中改完样式推送到远端后(这里我 BlogHugo 仓库没有任何修改),发现 build 出来的网站压根没有使用最新的 submodule 里面的内容。究其原因,其实是父仓库默认会跟踪 submodule 的一个版本号。如果不在父仓库中显示更新要跟踪的版本号,则父仓库一直会跟踪之前的版本号。这是合理的,因为父子仓库独立开发,为了避免子仓库(submodule)的频繁提交对父仓库的构建产生影响,所以默认会跟踪一个版本号。
正确的做法是,当 submodule 更新后,父仓库中 submodule 的版本号会产生一个修改,在父仓库中 add-commit 这个修改,就可以更新父仓库中引用的 submodule 版本号。
Ref:
如何撤销本地 commit
有时候本地 add 了一写 diff,随手 commit 了,接着又有些 diff 可以共用这个 commit,就想撤销刚刚的 commit,把所有的 diff 合并在一起作为一次 commit。
|
|
修改已提交的 commit message
|
|
Cf. github doc.
Git rebase
Cf. https://www.atlassian.com/git/tutorials/rewriting-history/git-rebase
rebase
和merge
都是将另一分支的提交(commit)集成到当前分支的方法。而 merge 会保留两条分支的所有 commit,然后解决冲突,然后形成一个 merge commit,从 git log 上来看,原本线性的提交历史分了叉,然后又合了并。而 rebase 则是基于当前分支的某次提交去重现另一个分支,rebase 之后依然能够保留提交历史的线性状态。
a---b---c---d---e (master)
\
`--A---B---C (dev)
From a content perspective, rebasing is changing the base of your branch from one commit to another making it appear as if you’d created your branch from a different commit. Internally, Git accomplishes this by creating new commits and applying them to the specified base. It’s very important to understand that even though the branch looks the same, it’s composed of entirely new commits.
The primary reason for rebasing is to maintain a linear project history. For example, consi der a situation where the main branch has progressed since you started working on a feature branch. You want to get the latest updates to the main branch in your feature branch, but you want to keep your branch’s history clean so it appears as if you’ve been working off the latest main branch.
You have two options for integrating your feature into the main branch: merging directly or rebasing and then merging. The former option results in a 3-way merge and a merge commit, while the latter results in a fast-forward merge and a perfectly linear history. The following diagram demonstrates how rebasing onto the main branch facilitates a fast-forward merge.
Rebasing is a common way to integrate upstream changes into your local repository. Pulling in upstream changes with Git merge results in a superfluous merge commit every time you want to see how the project has progressed. On the other hand, rebasing is like saying, “I want to base my changes on what everybody has already done.”
注:写这个的时候,我自己对 rebase 的理解也很模糊。
任何时候不清楚的时候请终止 rebase:
|
|
反复操练几次,git 有友好的提示信息。
撤销上次rebase
|
|
参考:此处。
Command g++
自定义包含路径
|
|
自定义链接静态或动态库
|
|
上面第二个命令链接了/usr/lib64/
目录下的libcurl.so
和libssl.so
两个动态库文件。静态库也是同样链接。说起来静态库,想起了最近折腾的一个东西,你可能会想把多个静态库合成一个静态库,想当然的直接用ar
合并,但是不行,必须要把两个静态库全解压出来,再合并所有的 object file. 参见:here
生成机器码
|
|
生成汇编代码
|
|
仅预编译
|
|
Aria2c
aria2c 是个好东西。支持连接,磁力,种子下载。轻量且强大,可直接使用,也可作为服务端,配合 WebUI 使用。
- 配置:参考 aria2 配置示例
- WebUI:
Note: jsonrpc 地址格式为 http://token:<rpc-secret>@hostname:port/jsonrpc
令牌填写自己设置的 rpc-secret
xxx
替换为自己设置的 rpc-secret
MPV
MPV 是一个轻量、简约、跨平台的播放器。据我自己体验,在 Linux 下比 mplayer 播放效果要好,mplayer 倍速会掉帧,而 mpv 则不太明显。
HTML
给网页添加 BGM。
|
|
又,添加可以控制播放的音乐。
|
|
使用xrandr
设置多屏显示
|
|
观察输出可知,连接了两个显示器 (eDP-1, HDMI-2),其中 eDP-1 是主显示器。如果第二块屏幕无显示,执行下面的命令。
|
|
又,指定分辨率为 1920x1080,
|
|
又,设置为右侧扩展屏,即光标向右可移动至第二块屏,
|
|
又,连接上第二块屏,想关掉内置显示屏,(警告:不要随便关掉内置屏)
|
|
又,开启内置屏。
|
|
某些情况下会无法检测显示器的最大分辨率,此时需要手动设置显示器的分辨率。参考此处。
|
|
如果显示屏分辨率更改成功但窗口显示不完整(即只有左上角以指定分辨率显示,其他部分空白),可以尝试关闭内置显示屏,此时显示器应该能以完整窗口显示内容。
网络
查看被监听端口
|
|
Htop 基本操作
Htop 类似于 top,但比 top 更现代化,支持鼠标操作,支持颜色主题。在命令行键入 htop,会呈现如下界面。(图片来源:https://blog.csdn.net/freeking101/article/details/79173903)
平均负载区的三个数字分别表示过去 5、10、15 分钟系统的平均负载。进程区每一列的意义分别是:
- PID: 进程号
- USER: 进程所有者的用户名
- PRI: 优先级别
- NI: NICE 值(优先级别数值),越小优先级越高
- VIRT: 虚拟内存
- RES: 物理内存
- SHR: 共享内存
- S: 进程状态(S[leep], R[unning], Z[ombie], N 表示优先级为负数)
- CPU%: 该进程占用的 CPU 使用率
- MEM%: 该进程占用的物理内存和总内存的百分比
- TIME+: 该进程启动后占用的 CPU 时间
- Command: 该进程的启动命令
常用快捷键可在 htop 界面按?显示。
- H: 显示/隐藏用户子线程
- Space: 标记进程
- k: 杀死已标记进程