之前零零散散写过一些经验分享的文章,不系统,对读者也不友好。现在整理到一块,随时更新,如果值得深入还可以单独写文章。主要针对自由/开源软件,也可能涉及科学软件、商业软件。

目标:今年整理50条在中文圈里稀罕的小技巧。

2017-12-20 Update: 跌跌撞撞,我写完了50条经验。

2018-01-03 Update: 进行了归类,想办法转载看能不能收获更多访问。

一句话系列的另外两篇:我的一句话经验——Emacs Lisp篇一句话系列——冷知识篇

*NIX世界命令行使用技巧

主要是使用和写脚本的经验,带例子。

  1. Grep可以用--include="*.md"指定搜索的文件类型,比如grep Chris -r . --include="*.md",在当前目录递归的检索*.md文件中的“Chris”。

  2. 7-Zip的-r会递归的在目录里搜索指定的路径,而不是我们期望的在指定目录中递归,所以不要用。详解

  3. 多进程使用下载工具wget的方法:cat /tmp/url.txt | xargs -n 1 -P 8 wget -c;url.txt里一行一个地址,-P 8表示最多同时运行8个进程,相比加&后台运行的方法可以指定进程数。更好的方法是用parallel,例子见下面。

  4. *NIX世界的cut命令很好用,有时候比正则好用,而且可以写一些比较“dirty”的代码。

  5. Bash中如果要实现某条指令成功后再并行运行几条命令,可以这样写:echo && { sleep 12 & sleep 12 & }; wait; echo && { sleep 12 & sleep 12 &};

  6. grep -o可以只显示匹配的部分。

  7. 将URL保存到文件后用wget的-i参数批量下载,比如wget -i ./list.txt

  8. Linux里有一个/usr/bin/timeout命令可以让程序超时退出,用法是/usr/bin/timeout 1m ts,就是执行1分钟后就kill掉,在写cron命令时很方便。如果没有这个命令,对于Debian系列的系统可以安装名为timeout的包。来源

  9. date +%j可以告诉你今天是一年中的第多少天,对于算天数非常有用。date的手册

  10. 写Bash脚本的好参考:
    progrium/bashstyle
    以及一个小教程
    Ten Things I Wish I’d Known About bash

  11. 上面的第二个链接告诉我们单引号''不会做替换,而双引号""会替换。我们一般写sedawk命令都用单引号,就是不希望我们的代码被替换,可有时候我恰恰需要替换,这时候换用双引号就好了,请看示例代码

1
2
Etdl=$(grep "FINAL SINGLE POINT ENERGY" /data/qm/B97-3c/a.out | tail -n1 | awk '{print $(NF)}')
sed "s/^\([^ ]*\)/\1\t${Etdl}/" /tmp/a

演示了如何把内容附加到每行后面。

  1. 从第三行输出文件内容可以用awk实现:awk 'NR>=3' "aaa.xyz"

  2. GNU Parallel并行执行命令很方便,一些实例

1
2
3
parallel echo {} + 1 is {= '$_++' =} ::: {1..10}
time parallel -N0 -j4 sleep 1 ::: {1..10}
ls | parallel 'cd {}; grep Chris *.out'

注意,parallel会把你的输入放到命令行里,所以上面的命令如果不加-N0会睡很长时间。另外parallel在Android的termux环境中需设置环境变量PARALLEL_SHELL

  1. Linux的字符终端(TTY)可以旋转,方法是
1
echo 1 | sudo tee /sys/class/graphics/fbcon/rotate_all

注意下面这种写法不行。

1
sudo echo 1 > /sys/class/graphics/fbcon/rotate_all
  1. Bash里<()的含义是:括号内的代码的输出被重定向到一个文件/dev/fd/63。执行cat <(ls)就得到了ls的输出,执行echo <(ls)得到了文件名。这个/dev/fd/63是一个命名管道(named pipe),一切皆文件嘛,就当一个文件使。参考

  2. 对于v1.06以上版本的GNU bc,设置BC_LINE_LENGTH可以控制自动断行的特性,例子

1
BC_LINE_LENGTH=0 bc -l <<< "scale = 100; a(1) * 4"
  1. 上一条技巧里的<<<是“Here Strings”,Bash等shell才有,sh里没有,bc -l <<< "scale = 100; a(1) * 4"等价于echo "scale = 100; a(1) * 4" | bc -l,但前者速度快很多。参考。测速代码
1
2
time for i in {1..10000}; do echo "" | : ; done # 84s
time for i in {1..10000}; do : <<< ""; done # 5s
  1. 除了nohupsetsid也可以在不受登出影响在后台运行程序。参考

  2. 批量后缀名修改:find . -name "*.txt" -exec rename .txt .md {} \;,把所有的*.txt替换为*.md,包括子目录的文件。注意这里用到了rename命令,来自util-linux包。

  3. sort命令其实非常强大,比如对一个「表格」进行排序:

1
2
3
4
5
6
7
8
9
$ cat a.txt
张三 96
李四 60
王二 100

$ sort -k2 -n a.txt
李四 60
张三 96
王二 100

这里是根据第二列的值对行进行排序。我以前只知道sort可以行排序,现在会根据指定的列排序,用Excel的理由又少了一个。

  1. 接上面一条,Coreutils里的join可以连接表格,比如
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
$ cat a.txt
姓名 成绩1
张三 90
李四 80
王二 100

$ (head -n 1 a.txt && tail -n +2 a.txt | sort) > a.txt.sorted
$ cat a.txt.sorted
姓名 成绩1
李四 80
王二 100
张三 90

$ cat b.txt
姓名 成绩2
张三 92
李四 90
王二 90

$ (head -n 1 b.txt && tail -n +2 b.txt | sort) > b.txt.sorted
$ cat b.txt.sorted
姓名 成绩2
李四 90
王二 90
张三 92

$ join a.txt.sorted b.txt.sorted > c
$ cat c
姓名 成绩1 成绩2
李四 80 90
王二 100 90
张三 90 92

上面的代码还演示了如何在排序的时候保留第一行。更多的解释请看join的手册

  1. 可以用awk进行「转置」,把列变成行,方法是设置ORS,控制的是输出的间隔符,设为空格就把列连接起来了。比如用上面的数据,对第一列进行转置,借助Emacs的M-|,代码是:
1
awk 'BEGIN{ORS=" "} {print $1}'
  1. 比如我有一列姓名,我想知道每个人出现的次数,怎么办呢?实例输入文件如下:
1
2
3
4
5
李四
王二
张三
李四
李四

可以借助sort和uniq再加上awk很方便的进行处理:`sort | uniq -c | sort -k1 | awk ‘{print $2 “\t” $1}’,结果如下:

1
2
3
王二	1
张三 1
李四 3
  1. 如何只复制指定的文件并且保留文件夹结构:
1
rsync -rv E5internet:/tmp/screening/ /tmp/ --include="*/" --include="a.xyz" --exclude="*"
  1. 保留一些文件,删除其他所有文件find . -type f -not -name 'a.xyz' -delete

  2. 批量生成MD5校验的方法:find /data/ -type f -exec md5sum {} \; > /tmp/list.txt来源

  3. 找大文件并且显示文件大小:find . -size +100M -exec du -h {} \; | sort -k1hr

  4. awk '/^>./ {printf("\n%s\n", $1)} ! /^>./ {printf("%s", $1)}' unigene.fasta > unigene.fasta.nonewline

  5. 对目录按大小排序:du -h -d 1 | sort -k1hr

  6. Arch Linux滚动更新后,强制装载新的USB驱动,不拔优盘直接起效。来源

1
2
3
4
sudo modprobe -r usb-storage
sudo modprobe -S 5.0.5-arch1-1-ARCH -f usb-storage
sudo sh -c "echo 0 > /sys/bus/usb/devices/2-14/authorized"
sudo sh -c "echo 1 > /sys/bus/usb/devices/2-14/authorized"

自由/开源软件使用经验

  1. 对于大规模的搜索,简单的把grep命令换成ag (当然前提是安装了这个软件),可以大幅加速搜索速度。还有一个最新的软件ripgrep,据称比ag (The Silver Searcher)更快。

  2. Fontconfig的配置文件推荐放在~/.config/fontconfig/fonts.conf里,放在别处是废弃的用法,可能导致出错。

  3. Cron脚本不执行的一个可能的原因:Cron脚本不能包含后缀名,如果你不确定写的对不对,可以用run-parts --test /etc/cron.monthly/测试一下。askubuntu上的解答

  4. Markdown中,用#.代表编号只在pandoc中支持,不要期望它在其他地方获得支持,对于非pandoc的情况用传统的1.是正道。

  5. Shadowsocks在服务端打开一次性认证的方法是在配置文件中加入"auth":true详解

  6. MPV如果要批量播放视频,可以在视频所在目录里运行mpv *

  7. 可以用ffmpeg合并视频,一个例子是:

1
ffmpeg -i "Cloud.Atlas.2012.RUS.Blu-Ray.1080p.AC3.x264.mkv" -i "[email protected]" -c copy -map 0:0 -map 1:0 out.mkv
  1. .ts视频可以直接用cat合并。更多关于合并视频的知识

  2. Shadowsocks的“ss-stunnel”是用来进行转发的,数据走的是Shadowsocks的协议,用法类似ss-tunnel.exe -u -c "C:/msys64/etc/shadowsocks/config.json" -L "8.8.8.8:53" -l 53,实现在本地的53端口起一个DNS服务器,而DNS的解析被转发到谷歌的DNS。

  3. 用Shadowsocks时,如果想把代理分享给局域网的其他电脑,可以在配置文件中加入"local_address":"0.0.0.0",这样代理的本地端口就暴露给局域网的其他电脑了。注意这里可能会弹出防火墙的窗口。

  4. 开启MPV硬件加速的方法:在配置文件里写入hwdec=auto。对于Windows,配置文件是%appdata%/mpv/mpv.conf

  5. 文档转换的瑞士军刀pandoc的每夜版(nightly)下载地址,每夜版会修复一些现有版本的Bug。

  6. Windows下小巧好用的PDF阅读器SumatraPDF的抢鲜版(prelease)下载地址新版标记功能的介绍

  7. Pandoc的reference-docxreference-odt参数统一到reference-doc参数上了。

  8. Linux平台下,54.x版本以上的Firefox必须安装PulseAudio才能听到声音,命令是sudo pacman -S pulseaudio pulseaudio-alsa

  9. MacType的最新版(v1.2017.628.0)中,如果使用了DirectWrite支持(即DirectWrite=1),那么,[DirectWrite]中最好RenderingMode=6,否则用DirectWrite的软件,比如Word 2013,效果会非常差。

  10. 好奇的你可以用objdump -d emacs来反汇编某个程序看里面的秘密,如果你喜欢Intel的汇编语法,可以用objdump -M intel -d emacs

  11. 用GCC的时候在CFLAGS加上-ftree-vectorize自动向量化代码。想知道哪些代码被自动优化了?再加上-fopt-info优化的指示就会输出到stderr,用2> /tmp/err.log把它们输出到文件仔细研究吧。

  12. curl是比较容易使用Socks5代理的,用--socks5-hostname参数就可以,示例

1
curl https://chriszheng.science/index.html --socks5-hostname localhost:65500 -O
  1. 用代理git clone的方法:ALL_PROXY=socks5://127.0.0.1:65500 git clone https://github.com/neomutt/neomutt

  2. UnZip可以解压百度网盘批量下载的zip压缩包,7-zip不行,WinRAR的修复功能也可以让压缩包正常解压。

  3. AndroidScreencast可以在电脑上操作安卓手机,而且不需要手机上装软件,原理是用ADB。当然,非常不好用,延迟达到秒级,玩玩就好。

  4. 接上条,CXTouch速度更快,需要在手机上安装软件。

  5. 更快的是scrcpy

  6. 如果Node的包管理出现问题,可以用激进的方法删除node_modules重新安装。对于*nix系统rm -rf node_modules就可以,在Windows下可能会删除不掉,可以安装在Windows下实现“rm -rf”的包rimrafnpm install rimraf -g,然后rimraf node_modules注意,这个包的功能是rm -rf哦。

  7. Hexo的包hexo-filter-cleanup在调试模式不会生效。我一直疑惑为什么调试模式生成的快,原来是因为调试模式不会优化,所以快了很多。

  8. 编辑/etc/fstab的时候一定要慎重,因为启动的时候系统会默认挂这些分区,如果找不到,启动失败。

  9. MPV如果不想要看输出可以加参数--no-terminal

  10. 用Emacs的Tramp连接到运行BusyBox的路由时会遇到连不上的问题,在路由上安装coreutils-stty就好啦。原因是因为精简的BusyBox很可能不带stty命令,而Tramp又依赖它,所以反复出错。

  11. 衍生自Firefox的浏览器K-Meleon会连接到官网自动更新,如果官网挂了,比如像今天这样,软件就会崩溃。禁用自动更新就好了,禁用方法是偏好设置→K-Meleon插件中禁用检查更新

  12. 最近用上了tmux,有种相见恨晚的感觉,以下两条配置很好用,可以放到~/.tmux.conf

1
2
set -g mouse on
set -g status-right ' #{?client_prefix,#[reverse]<Prefix>#[noreverse] ,}"#{=21:pane_title}" %H:%M %d-%b-%y'

来源1来源2

  1. Windows下使用Firefox还是必须得用Flash,而第三方修改过的Flash比原始版的好。火狐吧的文科一直维护去沙箱版Flash,下载地址
    https://pan.baidu.com/s/1boVSQXx#list/path=%2F
    另外一位朋友维护的
    https://bbs.kafan.cn/thread-1839722-1-1.html

  2. 开源看图软件nomacs还挺好用。

  3. Termux使用国内的清华源的方法

  4. 让Termux不震动的方法是改配置,方法见配置文件的手册

  5. 在Windows环境下使用mutt看HTML邮件:

1
2
3
4
5
# ~/.mutt/muttrc
auto_view text/html
alternative_order text/plain text/html
# ~/.mailcap
text/html; "/C/Program Files/Mozilla Firefox/firefox" "$(cygpath -w %s)" && sleep 2; nametemplate=%s.html; copiousoutput
  1. ImageMagick可以重设图片的DPI,方法是
1
convert -units PixelsPerInch 输入图片.png -density 600 -trim 输出图片名.png

顺带演示了-trim去白边。

  1. Git可以用.git/info/exclude代替.gitignore来忽略本地文件,这种方法不必提交到远程。来源

  2. 下载用于win64平台的最新版Firefox:
    https://download.mozilla.org/?product=firefox-latest&os=win64&lang=zh-CN

  3. 正确的用ffmpeg截取视频的方法:

1
ffmpeg.exe -ss 1:8:57 -i "阿凡达 Avatar Extended Collector's Edition 2009 BluRay 1080p DTS x264-CnSCG.mkv" -t 12 -c copy a.mkv

注意,这里必须写时间长度,用-t

  1. 如果VirtualBox的VDI文件是动态大小,占用空间变大了,可以在虚拟机的系统里用SDelete命令清理自由空间:sdelete.exe c: -z,然后用VBoxManage的vboxmanage modifymedium --compact thedisk.vdi来压缩。来源

  2. ffmpeg合并字幕并且设为默认

1
ffmpeg -i in.mp4 -i in.srt -c copy -disposition:s:0 default out.mkv

来源

  1. 统计汉字的字数wc -m *.md

  2. 抓取m3u8形式的在线视频:

1
ffmpeg -user_agent "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/601.7.8 (KHTML, like Gecko) Version/9.1.3 Safari/537.86.7" -i http://185.38.12.60/sec/1503173737/363333397f6b65370bfc740ca4dea8c3f8dd2a93419f7748/ivs/12/b1/2ec5e15ba2a6/hls/tracks-4,5/index.m3u8 -c copy pd.mkv

来源

  1. 把图片转成视频:
1
ffmpeg -framerate 12 -i "a_%03d.bmp" -vcodec libx264 -crf 1 -preset slow -vframes 1000 -pix_fmt yuv420p a.mp4

科学相关软件技巧

  1. ORCA计算金属配合物遇到SCF不收敛的情况,可以使用! SlowConv,如果不行可以试试! KDIIS更多信息

  2. Octave里在向量最后增加一个元素的写法是a(end + 1) = 5;,删除最后一个元素的写法是a(end) = [];手册里的解释

  3. AutoDock Vina输出结果的平均值,:

1
(for f in *.log; do 	echo -n "${f}: "; 	awk '/^[ ]+[1-9]+/ {n++;sum+=$2} END {print n?sum/n:0}' ${f}; done) > /tmp/a.log
  1. When Octave fail to plot a figure, run the magical close all. I struggled with this issue for a long time.
    如果Octave的画图功能不能正常工作,运行神奇的close all。这个问题困扰我很久了,只有在Emacs里用Octave才会遇到。这条经验也分享到help-octave邮件列表了

  2. 从兼容性方面考虑,Octave导出SVG格式的图片是比较好的选择,缺点是不太好编辑了。话说回来,PostScript也不是为了编辑而产生了。

  3. mpif90编译的时候会报Illegal preprocessor directive,因为默认不进行预处理,FCFLAGS = -cpp可以解决。

  4. Jmol/JSmol获取高质量截图:write IMAGE 1920 1920 PNGT n "6.png"

  5. Octave里要用LaTeX语法必须用单引号,xlabel('{\it d}(C–Cl) in Å')。来源:手册里有,我觉得这句话应该强调。

商业软件技巧

  1. 在MS Word中,=rand(8, 10)可以生成随机的文字,=lorem(8, 10)生成的是Lorem ipsum。详解

  2. MS Word里用Ctrl + *(实际是Ctrl + Shift + 8)可以显示额外的格式符号,比如空格用·表示,对于一些编辑工作可能有用。(Emacs里等价的功能是M-x whitespace-mode)。

  3. 永久性的将Word的宏转为文字:Ctrl+Shift+F9出处

  4. Acrobat XI的11.0.1以上版才能和Word 2013兼容,直接安装的11.0.0是不行的,必须先升级。各版本的兼容情况

  5. 要想在Windows下使用UTF-8的,要么用Emacs等软件,通过管道传递,要么就在命令提示符里用chcp改代码页(chcp 65001),直接用使用命令,包括API调用,肯定会失败。在MS-Windows平台下使用UTF-8编码

  6. Word的选项里面,显示-打印选项里面,有“打印文档属性”一项,如果选上了,打印的时候会多一页,一定不要选。这个毛病非常难以排查,设置的位置又非常隐秘。

  7. Excel怎么固定多个行和多个列呢?选中你要固定的行和列的「下一个」单元格,比如你想固定2行和1列,那么你应该选B3,然后视图-冻结窗口,就好了。如果我一直看百度出来的教程我是不会知道这个技巧的。

  8. Excel里统计非空的列和行=COUNTA()

移动端相关

  1. 对于MIUI 8,开启开发者模式后,选择不使用锁屏界面,就不用看锁屏画报了。我之前写过

  2. 下载用于Android的最新版Firefox:
    https://download.mozilla.org/?product=fennec-latest&os=android&lang=multi

网络相关技巧

  1. 为了移动端友好没有必要在robots.txt中禁止抓取CSS等文件。详解

  2. 同一个域名下混合使用HTTP和HTTPS会导致很多问题,不要这样。一个我的折腾实例

  3. 批量复制URL的Firefox扩展Copy Link URL

  4. 网站https://gtmetrix.com/可以对网页进行测速,方便优化网站。谷歌的PageSpeed Insights也是个好工具。

  5. 可以通过添加rel确认你是链接的所有者,添加的链接类似这样<a rel="me" href="https://mastodon.sdf.org/@chriszheng">Mastodon</a>,这样在Mastodon的资料页里链接会变绿

  6. Firefox 60+版本移除了查看Cookie的功能,解决方案是用存储查看器,快捷键是Shift+F9

软硬件折腾

  1. 除非有好的设备并且非常认真听,320 Kbps的音质已经足够好了。我的经验

  2. Wifi常见的协议按从旧到新的顺序是:802.11b < 802.11g < 802.11n < 802.11ac,目前802.11ac就是比较新协议了。

  3. 一些无线网卡,比如我用的比较坑的Intel的N 2230,会出现使用802.11n不稳定的情况,这种时候可以在网卡的设置里面禁用802.11n协议,这样速度会慢一些(理论最大速度下载速度从37 M/s降低到6 M/s),稳定性会有很大的提升,而且大多数时候出口带宽没有那么高(也就是说你的下载速度根本就不会大于6 M/s),就算协议能支持也对你没有用。这条经验比较啰嗦,希望看的人能明白。

  4. Intel Core架构的顺序是:Nehalem、Sandy Bridge、Ivy Bridge、Haswell、Broadwell、Skylake、Kaby Lake。出处

  5. 今天解答了我4年前在笔记本上装双系统的一个疑惑:如果电脑是以Legacy模式引导的,那么Windows的安装程序只能安装到MBR分区上,而以UEFI模式时只能安装到GPT分区上,即BIOS–MBR以及UEFI–GPT是绑定的,二选一。这是Windows的限制。出处