文件、任务与查看器
Ctrl-S 打开快速查找。输入名称或 *.rs 之类的 glob;Down 和 Up 在匹配项之间移动,Insert 标记匹配项,Ctrl-A 标记所有匹配项,Enter 或 Esc 关闭搜索。除非查询中包含大写字母,否则匹配不区分大小写。
复制、移动与删除
Section titled “复制、移动与删除”F5、F6 和 F8 分别启动复制、移动和删除任务。Alt-J 打开任务列表,可在其中暂停或取消任务。
“删除”对话框默认选中 否,所以直接按 Enter 会保留文件。要删除,请按 Y,或用 Tab 或方向键切换到 是 后按 Enter。
“删除”对话框询问的同时,Borg 会统计你要删除的文件,并在问题下方显示文件数量和大小。统计在 3 秒后停止,此时这一行以 至少 开头。Borg 还会查找打开了这些文件、从中运行或正在其中某个文件夹里工作的程序,并列出它们的名称。程序如果一直打开着已删除的文件,也会一直占用它的磁盘空间,直到关闭该文件为止。按 K 可在进程监视器中打开其中第一个程序,并显示 信号或优先级,以便在删除之前停止它。Borg 能看到你的用户可以检查的程序,在大多数系统上就是你自己的程序。压缩包、容器和远程面板中的文件会直接删除,不做这些检查。
“复制”对话框中有一个 针对机械硬盘优化复制 复选框。按 Tab 移到该复选框,按 Space 切换,也可以直接点击。每次新建复制时它都处于未勾选状态。在此模式下,Borg 会把小文件分批读入内存,再逐批写出,在同一块机械硬盘内复制时可以减少磁盘寻道。每批最多包含 64 MiB 文件数据或 4,096 个文件;大于 1 MiB 的文件按常规方式复制。效果取决于硬盘、文件系统和操作系统缓存,在不同硬盘之间复制时可能反而更慢。目标位置已存在同名文件时:o 覆盖,s 跳过,k 保留两者,a 全部覆盖,n 全部跳过,Esc 取消。复制的内容会先写入临时文件,完成后再重命名。
耗时任务与磁盘
Section titled “耗时任务与磁盘”Borg 知道每个文件夹位于哪种磁盘上:机械硬盘、固态硬盘、内存盘、NFS、SMB 或 sshfs 这样的网络共享,或者远程面板所显示的主机。在 macOS 上它会询问 diskutil 和 hdiutil,在 Linux 上则读取 /proc/self/mountinfo 以及 /sys 中设备的标志。Ctrl-L 在 磁盘 一行显示磁盘及其文件系统,速度 一行显示 Borg 预计它读写的速度。
在任务写入任何内容之前,Borg 会根据它在每块磁盘上读写的字节数以及压缩所需的时间,估算任务要花多久。如果复制、移动到另一块磁盘或解压需要超过 2 分钟,或者修改压缩包需要超过 20 秒,耗时任务 对话框会说明大约需要多久、在哪种磁盘上,并等待你的选择:
- 开始(
s)运行任务。 - 此文件总是开始(
f)运行任务,并且不再就这个压缩包询问。解压和修改压缩包时会提供这个选项。 - 此类磁盘总是开始(
d)运行任务,并且不再就这类磁盘上的工作询问。 - 取消(
c)在第一次写入之前停止。
从编辑器保存到压缩包时,询问会显示在编辑器之上;你回答后,编辑器重新接收按键。
在测量某块磁盘之前,Borg 按其类型的常见速度估算:机械硬盘约 120 MB/s,固态硬盘约 900 MB/s,内存盘约 4 GB/s,网络共享约 60 MB/s,远程主机约 10 MB/s。每个运行至少 2 秒、传输至少 64 MiB 的任务都会让 Borg 了解磁盘的实际速度,此后 磁盘 一行会显示 实测速度。主要时间花在压缩上的任务不会让它了解磁盘的速度。
Borg 把这些速度和你的回答保存在状态文件夹中的 drives.json 里,最多记住 256 个压缩包。该文件只有你自己可读,因为其中写有你回答过的压缩包。你打开的每个 Borg 都共用这个文件:每个 Borg 在启动时读取它,并在写入之前再读一次,因此一个 Borg 学到的速度或得到的回答,在另一个 Borg 写入时仍会保留。Ctrl-L 的 耗时任务 一行说明 Borg 在该磁盘上是否会先询问。F9 → 选项 → 耗时任务前重新询问 会忘掉所有“总是”回答,包括在其他 Borg 中给出的回答。已经打开的 Borg 会继续使用它已有的回答,直到它下次写入该文件或你重新启动它。
查看器与快速预览
Section titled “查看器与快速预览”F3 打开查看器。启用系统插件时,对 .pcap、.pcapng 或 .cap 文件按 F3 会改为打开网络屏幕的流量查看器(参见抓取流量)。查看文本文件时,方向键和 PgUp/PgDn 用于滚动,w 开启或关闭自动换行,Esc 或 q 关闭查看器。查看图片时,Left/Right 或 p/n 切换到上一张或下一张图片。如果终端支持图像协议,Borg 会使用它;其他终端则以彩色色块显示图像。
Ctrl-Q 在另一个面板中显示快速预览。按 Tab 进入预览,可用方向键、PgUp/PgDn、Home/End 和鼠标滚轮滚动;按 Tab 或 Esc 返回文件列表。Ctrl-L 显示文件信息。F3 会在完整查看器中打开文本预览,关闭查看器后会回到预览,并保留滚动位置、换行设置、源码模式和十六进制行。两者读取文件的方式同样有所限制,因此打开大型文本文件时只读取第一页左右的内容,无论文件多大都能很快打开。对于按文本搜索得到的结果,预览会改为在文件的第一处匹配处打开,像查找栏那样标出查询,并且只读取这处匹配附近的内容。
两种文本查看器都会对常见的编程语言、标记语言和配置文件进行语法高亮,包括 Rust、Python、JavaScript、TypeScript/TSX、Go、C/C++、Java、C#、Ruby、PHP、Lua、SQL、HTML/CSS、JSON、YAML、TOML、Shell 脚本和 Dockerfile。Markdown 默认以渲染后的格式打开;在任一查看器中按 s 或 F4 可切换到源码。支持标题、强调、列表、任务列表、链接、表格和围栏代码块。大于 2 MiB 的 Markdown 文件会以源码形式打开,以减少内存占用。
JSON 文件会以每行一个值的方式排版打开,键保持原有顺序,数字保持原样,这对写在一行里的文件最有帮助。按 s 或 F4 可查看文件原样。JSON Lines 文件(.jsonl、.ndjson)会逐条记录排版。大于 16 MiB 或无法解析的 JSON 会按原样打开。
在文本查看器或快速预览中按 h 可将文件的字节显示为十六进制行,再按一次回到文本。二进制文件(Borg 根据前 4 KiB 中是否有零字节来判断)在两者中都会以十六进制行打开,按 h 显示其文本。每行先显示它在文件中的偏移量,再显示这些字节的十六进制值和对应的文本,无法打印的字节显示为点。偏移量和零字节以暗色显示。每行显示宽度能容纳的最多字节数:64、32、16、8、4、2 或 1 个,每 8 个字节之后留出更宽的间隔。Borg 只读取屏幕上的行,因此方向键、PgUp/PgDn、Space、Home 和 End 在数 GB 的文件中也能立即移动。查找栏在十六进制行中同样可用,并在两栏中都标出每处匹配。在十六进制模式下,Markdown 和 JSON 文件显示原样写入的字节。
在查看器中,十六进制行的右侧有一条熵条。熵表示字节的多样程度,从同一个字节重复时的每字节 0 位,到像压缩、加密或加壳数据那样随机时的每字节 8 位。文本通常在 4.5 左右,代码在 5 到 6.5 之间。熵条从上到下覆盖整个文件。每个单元格中横条的长度对应文件中该部分的最高熵,低于每字节 4 位时显示为暗色,从 7.2 起显示为粗体红色;屏幕上字节所在的单元格会像滚动条一样标出。状态行显示当前页的熵,以及它属于 低、常规 还是 高。按 ] 和 [ 可跳到下一段和上一段高熵块,点击熵条则跳到文件的对应部分。
Borg 在后台以 4 KiB 为一块读取熵。不超过 256 MiB 的文件会完整读取,更大的文件则均匀抽取 65,536 块,因此无论文件多大,占用的内存都相同。在本应是代码、文件头或表格的地方出现高熵,可能意味着那里藏有加壳或加密的数据。压缩的媒体文件、压缩包、加密卷和密钥库从头到尾都是高熵,因此请结合文件应有的内容来解读熵条。
在压缩包上按 Enter,即可把它当作文件夹打开。Borg 会打开名称以 .zip、.7z、.rar、.tar、.tar.gz、.tgz、.tar.bz2、.tbz2、.tbz、.tar.xz、.txz、.tar.zst 或 .tzst 结尾的文件,以及以 .gz、.bz2、.xz 或 .zst 结尾的单个压缩文件,后者打开后是只包含那一个文件的文件夹。Ctrl-PgDn 也能打开压缩包,而在压缩包文件本身上按 F3 仍会在查看器中显示它的字节。面板标题会出现 ▤ zip 这样的标记,指出 Borg 根据文件开头的字节识别出的格式,路径也会继续深入到压缩包内部。压缩包里的文件夹会显示其中内容的大小。在压缩包顶层按 Left、在 .. 上按 Enter 或按 Ctrl-PgUp,会回到包含它的文件夹,光标停在该压缩包上。如果压缩包已被删除或无法再读取,从它的任何文件夹向上返回也会回到那里,通知会说明原因。
为了列出压缩包的内容,Borg 会读取其中包含的条目;对压缩过的 tar 来说,这意味着要读完整个文件。读取大型压缩包时,面板底部会显示 Borg 已经读到哪里,按 Esc 会停止读取并返回。只要文件的大小和时间不变,Borg 就会记住最近 4 个压缩包的列表,因此再次进出都是即时的。条目超过 1,000,000 个的压缩包无法打开。
在压缩包内的文件上按 F3 或 Enter,Borg 会把它解压到运行时文件夹中的一个私有文件夹,并在查看器中打开。解压作为任务运行,因此大文件会显示进度,按 Esc 可以取消。查看器一打开文件,Borg 就会删除解压出的副本。
在压缩包内的文件上按 F4 会在编辑器中打开它,按 Alt-E 则在面板编辑器中打开。Borg 会把文件解压到同一个私有文件夹中,编辑器的标题显示它在压缩包内的路径。每次保存都会作为任务把文件写回压缩包,编辑器也会提示(“已保存,正在写入 site.zip。”)。如果压缩包没能接收它,通知会说明原因以及你的修改保存在哪里。
F5 把标记的文件和文件夹从压缩包复制到另一个面板的文件夹,或复制到你在“复制”对话框中输入的文件夹。“文件”菜单(F2)中的 解压到此处 和 解压到另一个面板 会把光标处的整个压缩包解压到当前面板或另一个面板的文件夹。无论哪种方式,文件都会落在本机的文件夹中,任务会出现在 Alt-J 中,并显示进度、速度和剩余时间。遇到已存在的名称时,它会像复制一样询问;每个文件先以临时名称写入,完成后再改名,并且写到压缩包给出的大小就停止。
Borg 可以修改 zip、7z 和 tar 压缩包,无论 tar 是否经过压缩。在本机文件夹中按 F5 或 F6,会把标记的文件复制或移动到另一个面板显示的压缩包中,或放进你在对话框中输入的压缩包内文件夹。F7 在压缩包中新建文件夹,F8 询问后删除标记的条目。F6 到同一压缩包中的某个名称会重命名条目或把它们移到那里,F6 到本机的文件夹则把它们移出:先解压到那里,再从压缩包中移除。遇到压缩包中已存在的名称时,Borg 会像复制时一样询问;你复制的文件之间同名时也会这样询问,来自搜索结果或集合的文件就可能同名。重命名为压缩包中已有的名称时会停止并给出通知。移动只会删除完整到达的内容,因此你跳过的文件会留在原处,被后面同名文件替换掉的文件也会留在原处。
每次修改都作为任务出现在 Alt-J 中。Borg 先把修改后的压缩包以临时名称写在原文件旁边,重新读取一遍,然后才以相同的权限替换原文件。重新读取时会检查 zip 或 7z 的条目列表,以及 tar 的每个条目。文件按 Borg 写入时的样子放进压缩包,因此在任务等待你回答期间再次保存的文件,会以最新内容写入。修改失败或被你取消时,压缩包保持原样。修改中保留的条目按存储时的样子复制:zip 复制它们压缩后的数据,7z 原样复制仍保留全部条目的固实块,只重新压缩失去条目的块。压缩过的 tar 会整个解压再重新压缩,重新读取时还要再解压一次,所以修改一个大的 .tar.xz 所需的时间与创建它再解压它一次差不多。只增加条目的 zip 或普通 tar 会先被复制,新条目接在最后一个条目之后;在 APFS、Btrfs、XFS 和 bcachefs 上,这次复制瞬间完成。修改可能耗时较长时,Borg 会先询问(见耗时任务与磁盘)。
在加密的 zip 或 7z 压缩包中,新条目会用 AES-256 和你打开压缩包时使用的密码加密;隐藏条目列表的 7z 会继续隐藏它。修改中保留的条目保持原样。
RAR 压缩包和 .gz 这样的单个压缩文件仍是只读的,修改它们时会给出提示。Ctrl-Q 和 压缩… 在压缩包内不可用。压缩包里的压缩包要复制出来后才能打开。Shell 会停留在包含压缩包的文件夹中,保存的会话重新打开时也会回到该文件夹,光标停在压缩包上。
加密的 zip 和 7z 压缩包在打开时会询问密码。在 密码 对话框中,你输入的每个字符都显示为不断变化的故障字符,每按一次键都会闪亮一下。显示的内容只取决于你输入了多少个字符。密码错误时对话框会再次询问,按 Esc 则离开压缩包。面板显示该压缩包期间,Borg 只把密码保存在内存中,从不把它写到任何地方。解压到此处 无法询问密码,所以遇到加密的压缩包时,请在它上面按 Enter,输入密码,再用 F5 把文件复制出来。
在写入任何内容之前,Borg 会累计所选条目解压后的总量。如果总量超过 1 GiB 且超过压缩包大小的 100 倍,或者超过 100,000 个文件,它会先询问,因为 zip 炸弹正是这个样子。目标位置的可用空间少于这些文件所需时,它也会询问;修改压缩包时,如果所在磁盘没有空间在旧压缩包旁写入新压缩包,也会询问。仍然解压(u)继续进行,取消则在写入第一个文件之前停止。使用绝对路径或路径中含有 .. 的条目以及设备文件会被略过,并显示通知;压缩包中的任何条目或链接都无法让 Borg 写到目标文件夹之外。
Borg 自己读取 zip、7z 和 tar 系列格式。RAR 压缩包通过 7-Zip(7zz 或 7z)或 bsdtar 读取,Borg 先找到哪个就用哪个;macOS 自带 bsdtar。如果都没有安装,在 RAR 压缩包上按 Enter 会提议安装 bsdtar。安装 bsdtar 对话框的用法与抓取流量中 tcpdump 的对话框相同:它显示适用于你的包管理器的确切命令,Enter 把命令输入 Borg 的 Shell。Borg 还会查找 bsdtar 是否位于 Homebrew 的 libarchive 文件夹中,Homebrew 不会把这个文件夹放进 PATH。加密的 RAR 压缩包暂时还无法打开。
F4 在 Borg 的编辑器中打开所选文件,Shift-F4 则在 $VISUAL 或 $EDITOR 中打开。编辑器会保留文件原有的换行符和缩进,像查看器一样高亮代码,并显示行号。按住 Shift 加方向键可选择文本;Ctrl-C、Ctrl-X 和 Ctrl-V 通过 Borg 的剪贴板进行复制、剪切和粘贴,从终端粘贴的文本会原样插入。Ctrl-Z 和 Ctrl-Y 撤销和重做,Tab 和 Shift-Tab 增加和减少缩进。F2 或 Ctrl-S 会通过临时文件保存,因此文件永远不会只写了一半。非 UTF-8 文本文件或大于 32 MiB 的文件会改为在查看器中打开。超过 20,000 个字符的行(例如压缩过的代码)不做语法高亮,而且只绘制一行中显示在屏幕上的部分,因此即使是写在一行里的大文件,编辑起来也没有延迟。Alt-Shift-F 会按文件自身的缩进把 JSON 文件排版为每行一个值,这一步可以用 Ctrl-Z 撤销;无法解析的 JSON 会保持不变,状态行会说明解析在哪里停止。
编辑器会在文本上方弹出对话框进行询问:Tab 在字段和按钮之间移动,Enter 确认当前选中项,Esc 取消,也可以直接点击。Ctrl-F 或 F7 使用下文介绍的查找栏查找文本。Ctrl-R 或 F4 进行替换,可使用与查找栏相同的开关:Enter 替换当前匹配项并跳到下一个,跳过 保留当前匹配项,Alt-A 或 全部 一次性替换所有匹配项,且只需一次 Ctrl-Z 即可撤销。使用正则表达式时,替换内容中的 $1 会放回第一个分组匹配到的文本。Ctrl-G 跳转到指定行。Esc 关闭编辑器,如有未保存的更改,会先询问保存还是放弃;如果自打开以来文件在磁盘上发生了变化,Borg 会询问是覆盖还是重新加载。单击可放置光标,拖动或按住 Shift 单击可选择文本,双击选中一个单词,滚轮用于滚动;状态行中显示的按键也可以点击。
Alt-E 在当前面板内用 Borg 的编辑器打开所选文件,取代该面板的文件列表,这样就可以并排编辑两个文件,或者在文件所在的文件夹旁边编辑它。在搜索结果和集合中,Alt-E 会在另一个面板中打开编辑器,让列表保持可见。在另一个结果上按 Alt-E,会用它替换那里的文件;如果那个文件有未保存的更改,Alt-E 会把它的编辑器调到前面,并询问是否保存。F6 从面板中的编辑器切换到另一面板,在文件列表中按 Tab 则回到编辑器。在一个编辑器中用 Ctrl-C 复制的文本,可以在另一个编辑器中用 Ctrl-V 粘贴。编辑器获得焦点时,快捷键栏显示编辑器的按键,回到文件列表后恢复面板的按键。在编辑器中按 Ctrl-O 同样会显示控制台,F9 打开菜单。Esc 或 F10 关闭编辑器,面板重新显示文件;退出时会先逐一询问有未保存更改的面板编辑器。快速预览和文件信息需要用到另一面板,因此要等那里的编辑器关闭后才能使用。在结果旁打开的编辑器关闭时,会把焦点交还给结果,并恢复它们之前显示的快速预览或文件信息。
查看器和编辑器查找文本的方式相同。在查看器中,按 /、F7 或 Ctrl-F 会在状态行中打开查找栏;在编辑器中则按 Ctrl-F 或 F7。Borg 会从查找栏打开的位置开始边输入边搜索:屏幕上的每个匹配项都会被标出,当前匹配项会突出显示,查找栏会显示计数(第 3 个,共 17 个)。Enter、Down 或 F3 跳到下一个匹配项,Shift-Enter、Up 或 Shift-F3 跳到上一个;越过最后一个匹配项后,搜索会从另一端继续并给出提示。Alt-C 精确匹配大小写(否则全小写的查询不区分大小写),Alt-W 匹配整个单词,Alt-R 把查询当作正则表达式;这些开关也可以点击。Ctrl-P 和 Ctrl-N 调出最近的查询。Esc 关闭查找栏;之后在查看器中按 n 和 N,或在编辑器中按 F3 和 Shift-F3,可以继续在匹配项之间跳转。在大文件中,查看器会在后台搜索并显示进度,按 Esc 即可停止。对于不超过 64 MiB 的文件,它会统计匹配项,最多 10,000 个。
本指南跟随 main 分支更新 · Borg 0.11.0 · 1f6bce6
最新发布版本可能尚未包含此处介绍的全部功能。 发布说明
译自英文指南,欢迎指正。命令和键盘快捷键不作翻译。