跳到主内容

Linux 小小笔记

有关文档查询

(当然也可以上网查询。)

tldr

(名字来源 TL;DR: Too Long; Didn’t Read) 是在 https://boilingcong.ee/@gfis/105474645790577707 这里看到的。真的是大救星! 大!救!星!

基本上是提供了很多命令的常用用法,使用 tldr 命令名 就可以看到这种简化文档。

项目地址在这里: https://tldr.sh/ 官方版本似乎是基于 NodeJS 的,但我安装失败了然后改用了 Rust 版本的 tealdeer 。想尝试其它版本的可以在 https://github.com/tldr-pages/tldr/wiki/tldr-pages-clients 找到其它版本。

man

(Manual,不知道为什么直接简写成 man 了。) 传统上 linux 可以使用 man 命令名 查询命令所对应的文档。

—help

如果没有 man 页面的话,一般的命令行会提供一个 --help 选项,用于查看命令的用法。有些命令用的不是 --help ,这个时候可以把这些命令都尝试一下:

命令名 --help
命令名 -h
命令名 -help

有些命令在直接使用 命令名 调用时也会输出命令用法,但是对于一些比较危险的命令可能还是不要这样寻找用法比较好。

Index by Command Name

aplay

请见下方 arecord ,是配套的。

arecord

aplayarecord 都是 ALSA 附带的命令行工具, aplay 用于播放音频, arecord 用于录制音频。

简略用法推荐直接看 tldr 的文档。

一种特殊用法是:(来自 https://askubuntu.com/a/887658

# 将麦克风接收的声音直接播放出来,可能有延迟
arecord -f cd - | aplay -
# 减少延迟,可以把 1 改大一点(e.g. 40)防止 overrun
arecord -f cd --buffer-time=1 - | aplay --buffer-time=1 -
# 一边播放一边保存
arecord -f cd - | tee output.wav | aplay -

可以人工引入延迟:(来自 https://stackoverflow.com/a/12852526

arecord -f cd - | dd ibs=16000 iflag=fullblock oflag=dsync | aplay -

中间的 dd16000 是延迟的字节数,不能直接推出具体的延迟时间。

asciinema

终端“录屏”工具,录下来的不是一般的视频而是带有文本信息的“动态终端”。(一个例子是在播放时可以直接把终端文本复制下来。)

更多请见 https://asciinema.org/ 。这里放一个例子:

atuin

命令行历史记录工具。有些命令写起来挺复杂的,但又不太常用,没几天就被埋没在历史记录里面了(最后大概率被自动清除掉)。 此时如果又要再写一次命令就非常烦人。

Zsh, Bash 等自带的历史记录管理通常很简单,没法实现复杂的历史记录管理(或者说需要挺麻烦的配置)。 例如,我大概率不会希望保存 cd 的历史记录(因为我用 zoxide 负责记录目录), 但是会希望保存一个复杂的 find 命令。而 atuin 就可以实现这一点。

BC / DC

bc 计算器程序,当然也可以考虑 dc

设置小数位

设置默认(放到 .bashrc.zshrc 里):

alias bc="BC_ENV_ARGS=<(echo "scale=5") \bc"

来源: sjas@AskUbuntu .

brltty

介绍是 Braille display(盲文显示机) driver for Linux/Unix,似乎是一个使用盲文的终端显示。

comm

提取两个文件中的相同部分,这两个文件的各行必须按相同的排列方式排好序。

$ comm -12 file1 file2
$ comm -12 <(sort file1) <(sort file2) # 必须用 Bash 或 Zsh 等

diff / diffuse

diff 比较按行来比较两个文本文档之间的差异。下面我直接抄 tldr diff 的了:

$ diff old_file new_file # 比较两个文本文档
$ diff -w old_file new_file # 比较时忽略空格
$ diff -y old_file new_file # 输出为两栏,一栏一个文档,更容易看出差异
$ diff -r old_directory new_directory # 比较目录的变更(文件名变更,权限变更等)
$ diff -rq old_directory new_directory # 只比较目录的文件名变更

要可视化的话可能 diff -y 已经够用了,但有时可能有个 GUI 的更方便一些。这里随便找了一个叫 diffuse 的工具,基本就是 GUIdiff -y 。系统一般不自带,但包管理器里应该有。

fsck

FSCK (FileSystem ChecK (and repair))。

一般用法:

# fsck /dev/硬盘分区 # 只检查
# fsck -r /dev/硬盘分区 # 检查,用户手动确认修复
# fsck -a /dev/硬盘分区 # 检查,自动开始修复

下面这个只支持 EXT4 / EXT3 / EXT2 文件系统。(便宜硬盘又多了一条理由用 EXT4 了呢。)

# fsck -vcck /dev/硬盘分区 # 检查硬盘坏道并使文件系统避免使用该区域
# fsck -vccky /dev/硬盘分区 # 和上面相同,上面的需要手动确认,这个会自动确认

# fsck -vccky /dev/硬盘分区 2>&1 | tee /root/fsck.分区.badblocks.txt

jq

想在命令行下处理 JSON?(系统大概不自带。)

$ jq '.key' somefile.json
$ echo '{"key":"value"}' | jq '.key' -
"value"
$ echo '{"key":[{}, {}, {"oh":{"no":"sth"}}]}' | jq '.key[2].oh["no"]' -
"std"

lnxrouter

挺多功能的,最常用的可能是开个热点。安装的话 Arch 可以装 AUR 里的 linux-router 。 其它发行版可能只能到 Linux-router 项目地址lnxrouter 整个文件下载下来了:

$ mkdir -p ~/.local/bin
$ wget https://raw.githubusercontent.com/garywill/linux-router/master/lnxrouter -O ~/.local/bin/lnxrouter
$ chmod a+x ~/.local/bin/lnxrouter
$ lnxrouter -h

开热点:

$ ip addr list
...
3: wlo1: ...
...
$ sudo lnxrouter --ap wlo1 MyAccessPoint -p MyPassPhrase

注意热点可能会和 NetworkManager 等网络管理软件有冲突,可以尝试一下在什么地方先把 Wifi 给 disable 掉。再不行请求助搜索引擎。

Ncdu / du

都是计算文件占用空间的程序(硬盘使用,Disk Usage,故为 du),可以用于计算整个文件夹的占用空间以及分析哪一部分占用更多空间。 (应该是)所有的 Linux 系统都有 du 命令, ncdu 是命令行可视化版本,需要另外安装(用了 ncurses 所以是 nc du = ncdu )。

du 使用:

# 当前目录的总占用空间
du -h | tail -n 1
# 按占用空间排序当前目录的内容(从小到大排序,但从终端上看其实刚好)
du -h | sort -h
# 当然也可以对某个目录使用
du -h 某个目录 | tail -n 1
du -h 某个目录 | sort -h

视情况可能需要 sudo ,如:

sudo du -h / | sort -h

Ncdu 使用:

# 可视化查看根目录的空间占用
sudo ncdu /
# 可视化查看某个目录的空间占用(可能需要 sudo)
ncdu 某个目录

ocrmypdf

(这个需要额外安装。) 对 PDF 文件进行 OCR,简单用法:

ocrmypdf -l chi_sim+eng input.pdf output.pdf

ocrodjvu

(这个也需要额外安装。) 对 djvu 文件进行 OCR,简单用法:

ocrodjvu -o output.djvu -j 4 -l chi_sim+eng input.djvu

pdf2djvu

(这个当然还是需要额外安装。) 将 PDF 文件转换为 djvu 文件,简单用法:

pdf2djvu -o output.djvu --no-page-titles --anti-alias -d 72 --monochrome --lossy --no-metadata -v -j 4 input.pdf

pspp

严谨一点应该叫 GNU PSPP ,是 GNU 出品的 SPSS 的自由软件替代。具体差别不太清楚,统计相关工作的可以尝试一下。

scrcpy

一个将安卓屏幕投屏到 linux 上的程序(似乎也有 Windows 和 Mac 版): https://github.com/Genymobile/scrcpy (中文版页面: https://github.com/Genymobile/scrcpy

顺便一提, scrcpy 可以同步粘贴版 ,一些时候会非常方便。

xclip

从命令行操纵粘贴版,可能需要额外安装。似乎不能应用于图片等文件类型。用法:

# 复制某一文件的内容,使用鼠标中键的粘贴版
xclip 文件名
# 复制某一文件的内容,使用 Ctrl+V 的粘贴版
xclip -sel clip 文件名
# 通过 pipe 将其它程序的输出复制到粘贴版,如:
echo 'blahblah' | xclip
echo 'blahblah' | xclip -sel clip

xdotool

用来模拟各种图形界面输入(如鼠标或键盘的动作)的程序。 一种常见用法是写脚本来执行某些重复的鼠标点击等操作。

但是 xdotool 只使用于 Xorg 环境。在 Wayland 下有各种(自称)替代方案, 但目前我试着能跑的只有 dotool ……

目前我最常用的就是在用 Xournal++ 修改大量 PDF 之后用 dotool 批量保存并导出。

实际应用

为 Python 程序编写 SystemD Service 文件

[Unit]
Description=Some Python Program

[Service]
ExecStart=/bin/python3 /path/to/python_program.py
Environment=PYTHONUNBUFFERED=1

[Install]
WantedBy=default.target

关键点在于 Environment=PYTHONUNBUFFERED=1 ,否则日志将有很大概率丢失一部分。 或者你也可以在脚本里的每一句输出后面都加上 sys.stdout.flush()

如果这个 Python 程序是一个 User Unit,那么你需要 sudo loginctl enable-linger <username> 来确保它可以开机自启。

将图片生成 PDF

答案改自 Martian: https://stackoverflow.com/a/26610519

for i in `ls -v *.jpg`; do convert $i ${i//jpg/pdf}; done
gs -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=merged_file.pdf -dBATCH `ls -v *.pdf`

(两个命令均需要额外安装。 convert 来自 imagemagick,而 gs 来自 ghostscript。) 这里假设图片均为 .jpg 后缀,并且文件名中没有空格,最好是 1.jpg 2.jpg 3.jpg ... 这样的。 这个可以配合上面提到的 pdf2djvu ocrmypdf ocrodjvu 来使用。

从命令行操纵粘贴版

请见 xclip

从命令行打开文件

类似文件管理器双击,可以使用 exo-open 或者是 xdg-open 命令。可能需要额外安装。(在 Arch Linux 上的包分别是 exoxdg-utils 。)

直接 exo-open 文件 或是 xdg-open 文件 即可,会自动使用文件类型对应的默认程序打开。

ZIP 文件解压中文乱码

使用 unzip 解压的话,文件名中有中文的时候可能会有乱码,可以转而使用 unar 命令:

unar 文件.zip

来源: https://www.cnblogs.com/tonyc/p/8059802.html

Arch Linux 下需要安装 unarchiver 包:

# pacman -S unarchiver

与 tar 有关的解压

# 解压 tar.gz 文件
tar -zxf 文件名
# 解压 tar.xz 文件
tar -Jxf 文件名
# 解压 tar.bz2 文件
tar -jxf 文件名

实时记录网络流量

netstat 在 Arch 下已经不赞同使用了。(见 Deprecation of net-tools

现在的一个方法是安装 vnstatsudo systemctl start vnstat.service 之后,用 sudo vnstat --live [网络接口] 查看。其中 [网络接口] 可以用 vnstat --iflist 获取。

当然,更高大上的方法可能是用 Grafana 之类的。这里就不折腾了。

E2fsck 记录坏块

E2fsck 只适用与 EXT2, EXT3, EXT4 这些文件系统,其它文件系统还请自己查询操作方法。

一般来说,要将所有坏块都加入到分区的坏块列表里,常用的命令是 badblocks 或是 fsck 命令(在上面有提到)。 但有时候,错误在 SMART 里刷刷地冒,我们明确知道那几个出错扇区是一定是坏块了: 我们不想麻烦 fsck 再去做一次全盘扫描,而是希望可以直接把这几个扇区直接加入坏块表。

LBA 与磁盘逻辑块转换

SMART 里记录的是错误块的 LBA 地址,而 e2fsck 需要的是逻辑块编号。这两个之间的转换可以参考 Bad block HOWTO for smartmontools 。下面一段是这篇文章的一个摘要,以 GNU Free Documentation License 发布。

Copyright © 2004-2017 Bruce Allen

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts.

For an online copy of the license see ​https://www.gnu.org/licenses/fdl.html

下面的 /dev/sda 请相应更改。

获取 LBA 地址:(当然也可以从 gsmartcontrol 等工具里复制过来)

$ sudo smartctl --log=xerror /dev/sda | grep Error: | awk -F'= ' '{print $3}' | sort --unique
23421417

获取 LBA 块大小,并判断坏块对应的分区:

$ sudo fdisk -lu /dev/sda
Disk /dev/sda: 123.5 GB, 123522416640 bytes
255 heads, 63 sectors/track, 15017 cylinders, total 241254720 sectors
Units = sectors of 1 * 512 = 512 bytes
   Device Boot    Start       End    Blocks   Id  System
/dev/sda1   *        63   4209029   2104483+  83  Linux
/dev/sda2       4209030   5269319    530145   82  Linux swap
/dev/sda3       5269320 238227884 116479282+  83  Linux
/dev/sda4     238227885 241248104   1510110   83  Linux

在上面的例子里,LBA 块大小是 512 字节,坏块 23421417/dev/sda3 。然后获取逻辑块大小:

$ sudo tune2fs -l /dev/sda3 | grep Block
Block count:              29119820
Block size:               4096

用下面的公式换算:

  b = (int)((L-S)*512/B)
where:
b   = 我们所求的逻辑块位置
512 = LBA 块大小(一般其实都是 512)
B   = 逻辑块大小
L   = LBA 位置
S   = fdisk -lu 给出的 Start 一列所展示的分区开始 LBA 位置
上面的 (int) 表示向下取整。

算出来例子里是 2269012 。把所有这样计算的结果按分区汇总,一行一个逻辑块位置分别存在不同文件里,例如:

=== sda3.badblocks.txt: 汇总属于 sda3 的坏块 ===
2269012
2269013
2269014
2269015
=== sda4.badblocks.txt: 汇总属于 sda4 的坏块 ===
(这里不列举了)
E2fsck 操作

其实得到逻辑块汇总文件之后很简单:

$ sudo e2fsck -l sda3.badblocks.txt /dev/sda3
$ sudo e2fsck -l sda4.badblocks.txt /dev/sda4

然后就是一路 y 确认了。这里还是建议手动按 y 而不是用 a 等选项,并在按 y 的时候留意一下坏块到底影响到了那些文件。

已挂载分区的操作
e2fsck 1.46.5 (30-Dec-2021)
/dev/sdXN is mounted.
e2fsck: Cannot continue, aborting.

如果不是根分区的话,那可以把逻辑块汇总文件存到根分区里,重启到 Recovery shell ,再使用上面的 e2fsck 命令。

如果是根分区的话……我还没有机会尝试。您可以尝试一下上面的 Recovery shell 途径,如果不幸的话,您可能需要一个 Live USB

弹出移动硬盘

毕竟是移动硬盘, umount 不够的,最好的还是让硬盘彻底停转之后再拔。 弹出有多种方法,不同设备、不同电脑可能有效的方法都不同,可以依次试一下: (来自 Eject USB drives / eject command 。)

(以 /dev/sdd 为例,请在下面的命令中将其替换为对应的设备。)

  1. sudo eject /dev/sdd

  2. gio mount -e /dev/sdd

  3. gio mount -t /dev/sdd

  4. sudo udisksctl power-off -b /dev/sdd

  5. 更手动一点:

    echo offline | sudo tee /sys/block/sdd/device/state
    echo 1 | sudo tee /sys/block/sdd/device/delete
    

在 Virtual Console 里显示中文

Linux 默认的 Virtual Console( Ctrl+Alt+F1 组合键切换到的那种)是不支持中文显示的,也没有什么办法能让它直接显示中文。 要在终端里显示中文,我们需要把默认的给替换成 KMSCON

Arch 系统的可以看 Arch Wiki 上的 KMSCON 配置教程,其它系统可能只能自己编译。安装好之后需要在配置文件 /etc/kmscon/kmscon.conf 里选择中文字体:

font-name=Sarasa Mono SC
font-size=14

最后启用 sudo systemctl enable [email protected] && sudo systemctl start [email protected]tty8 里的数字即为 Ctrl+Alt+F8 里的数字。

如果对 KMSCON 的历史感兴趣的话可以看看 https://aur.archlinux.org/packages/kmscon-patched-git#comment-907249 这个评论。

评论

This one-pixel image serves as a page view tracker and nothing more. This feedback keeps me motivated, because very few people ever comment.