ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## less `less` 命令用来在控制台中分屏显示文本文档。它在许多发行版中可用。 ~~~ # less unixtoolbox.xhtml ~~~ 一些重要指令(^N 代表 [control]-[N]): - **h H**       显示指令的汇总列表 - **f ^F ^V SPACE**       向前滚动一屏(或者 N 行) - **b ^B ESC-v**       向后滚动一屏(或者 N 行) - **F**       向前滚动;类似于"tail -f" - **/pattern**       向前搜索匹配该模式的行 - **?pattern**       向后搜索匹配该模式的行 - **n**       重复之前的搜索 - **N**       反方向重复之前的搜索 - **q**       退出 ## vi Vi 在任何 Linux/Unix 发行安装版(gentoo 没有?)上都存在。因此,我们有必要了解一些基本的命令。Vi 有两个模式:命令模式和插入模式。使用 **[ESC]** 键可进入命令模式,使用 **i** 键可进入插入模式。如果你迷失了,可在命令模式下键入 `: help`。 编辑器 `nano` 和 `pico` 通常也都可用,而且更容易(IMHO)使用。 ### Quit - **:w** newfilename       保存文件为 newfilename - **:wq or :x**       保存并退出 - **:q!**       退出但不保存 ### 移动和查找 - **/string**       向前查找 string - **?string**       向后查找 string - **n**       同方向重复上一次搜索命令 - **N**       反方向重复上一次搜索命令 - **{**       光标移至段落结尾 - **}**       光标移至段落开头 - **1G**       光标移至文件的第一行首 - **nG**       光标移至文件的第 n 行首 - **G**       光标移至文件的最后一行首 - **:%s/OLD/NEW/g**       替换所有查找到的 OLD 为 NEW ### 删除文本 - **dd**       删除当前行 - **D**       删除光标到当前行末尾的字符 - **dw**       删除单词 - **x**       删除字符 - **u**       回复上一次操作 - **U**       回复所有此行的更改 ## mail `mail` 命令是一个读取和发送邮件的应用程序,她通常已安装。要发送一封邮件,可以简单的输入 "mail user@domain"。其第一行为主题,然后是邮件内容。在一个新行中使用单个点(.)来结束并发送邮件。例子: ~~~ # mail c@cb.vu Subject: Your text is full of typos "For a moment, nothing happened. Then, after a second or so,  nothing continued to happen." . EOT # ~~~ 这同样可用于管道: ~~~ # echo "This is the mail body" | mail c@cb.vu ~~~ 也是测试邮件服务器的简单方法。 ## tar 命令 `tar` (磁带存档) 可以为文件和目录创建档案。归档文件 .tar 是未压缩的,一个压缩过的归档文件的后缀是 .tgz 或 .tar.gz (zip) 或者 .tbz (bzip2)。不要使用绝对路径建立一个归档文件,你可能要解开这个归档文件到某个地方。一些常用命令如下: ### 创建 # cd / # tar -cf home.tar home/        # 归档整个 /home 目录(c 为创建) # tar -czf home.tgz home/       # 等同于 zip 压缩 # tar -cjf home.tbz home/       # 等同于 bzip2 压缩 从一个目录树中只包含一个(或2个)目录,并保持相对目录结构。举个例子,/usr/local/etc 和 /usr/local/www,它们在归档文件中的第一层目录是 local/。 # tar -C /usr -czf local.tgz local/etc local/www # tar -C /usr -xzf local.tgz    # 释放 local 目录到 /usr # cd /usr; tar -xzf local.tgz   # 同上面一样 ### 释放(Extract) # tar -tzf home.tgz             # 列出归档文件中的所有文件,并不释放 # tar -xf home.tar              # 释放归档文件(x 为释放) # tar -xzf home.tgz             # 等同于 zip 压缩 # tar -xjf home.tgz             # 等同于 bzip2 压缩 # tar -xjf home.tgz home/colin/file.txt    # 释放单个文件 ### 更高级的 # tar c dir/ | gzip | ssh user@remote 'dd of=dir.tgz' # 归档压缩 dir/ 目录并存储到远程主机上 # tar cvf - `find . -print` > backup.tar              # 归档当前目录 # tar -cf - -C /etc . | tar xpf - -C /backup/etc      # 拷贝目录 # tar -cf - -C /etc . | ssh user@remote tar xpf - -C /backup/etc      # 远程拷贝 # tar -czf home.tgz --exclude '*.o' --exclude 'tmp/' home/ ## dd 程序 `dd` (磁盘备份(disk dump) 或 destroy disk,也可看 [dd 的含义](http://roesler-ac.de/wolfram/acro/credits.htm)) 用来拷贝分区、磁盘或者其它拷贝。通常这么用: ~~~ # dd if=<source> of=<target> bs=<byte size> conv=<conversion> ~~~ 重要的 conv 选项: - `notrunc`       不截短输出文件 - `noerror`       出错时不停止处理(e.g. 坏扇区) - `sync`       把每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐 默认字节大小为 512 (一个扇区)。MBR 处于磁盘的第一个扇区,之后的 63 个扇区是空的。较大的字节大小可以加快拷贝速度但也需要更多的内存。 ## 备份和恢复 # dd if=/dev/hda of=/dev/hdc bs=16065b                # 拷贝磁盘到磁盘(相同大小) # dd if=/dev/sda7 of /home/root.img bs=4096 conv=notrunc,noerror # 备份 / # dd if /home/root.img of=/dev/sda7 bs=4096 conv=notrunc,noerror # 恢复 / # dd bs=1M if=/dev/ad4s3e | gzip -c > ad4s3e.gz                  # 压缩备份 # gunzip -dc ad4s3e.gz | dd of=/dev/ad0s3e bs=1M                 # 解压恢复 # dd bs=1M if=/dev/ad4s3e | gzip | ssh eedcoba@fry 'dd of=ad4s3e.gz' # 也可为远程的 # gunzip -dc ad4s3e.gz | ssh eedcoba@host 'dd of=/dev/ad0s3e bs=1M' # dd if=/dev/ad0 of=/dev/ad2 skip=1 seek=1 bs=4k conv=noerror    # 忽略 MBR # 如果目标(ad2)比较小,这是必须的。 ### 恢复 该 `dd` 命令会读取分区的_每一个区块_,即所有区块。对于有问题的区块,最好使用 `conv=sync,noerror` 选项,dd 将会跳过坏的区块并入 0。因此,这就是设置块大小等于或小于磁盘块大小的重要性。1k 大小似乎安全,用 `bs=1k` 来设置它。假如一个磁盘有坏扇区并且有个分区的数据要恢复,那么用 dd 工具创建一个镜像文件,挂载这个镜像文件,然后拷贝内容到新的磁盘中。如果用了 `noerror` 选项,dd 会跳过坏扇区并写入 0,也即坏扇区中的内容会丢失。 ~~~ # dd if=/dev/hda of=/dev/null bs=1m                   # 检查坏扇区 # dd bs=1k if=/dev/hda1 conv=sync,noerror,notrunc | gzip | ssh \ # 发送到远程 root@fry 'dd of=hda1.gz bs=1k' # dd bs=1k if=/dev/hda1 conv=sync,noerror,notrunc of=hda1.img    # 存储为一个映像文件 # mount -o loop /hda1.img /mnt                        # 挂载这个映像文件 # rsync -ax /mnt/ /newdisk/                           # 拷贝到一个新磁盘 # dd if=/dev/hda of=/dev/hda                          # 刷新磁状态   # 上面的命令对于刷新磁盘(refresh disk)很有用。这绝对安全,但必须先卸载磁盘。 ### 删除 # dd if=/dev/zero of=/dev/hdc                         # 删除全部数据 # dd if=/dev/urandom of=/dev/hdc                      # 更好的删除全部数据 # kill -USR1 PID                                      # 查看 dd 进度(仅Linux!) ~~~ ### MBR 技巧 MBR 包含了引导程序和分区表,它的大小为 512 字节。前 446 字节为引导程序,446 到 512 字节为分区表。 ~~~ # dd if=/dev/sda of=/mbr_sda.bak bs=512 count=1                  # 完全备份  MBR# dd if=/dev/zero of=/dev/sda bs=512 count=1                  # 删除 MBR 和分区表 # dd if=/mbr_sda.bak of=/dev/sda bs=512 count=1                  # 完全恢复MBR # dd if=/mbr_sda.bak of=/dev/sda bs=446 count=1                  # 仅回复引导程序 # dd if=/mbr_sda.bak of=/dev/sda bs=1 count=64 skip=446 seek=446 # 恢复分区表 ~~~ ## screen Screen 提供了两个主要功能: - 在一个终端内运行多个终端会话(terminal session)。 - 一个已启动的程序与运行它的真实终端分离的,因此可运行于后台。真实的终端可以被关闭,还可以在稍后再重新接上(reattached)。 ### 简短实例 开启 screen: # screen 在 screen 会话中,我们可以开启一个长时间运行的程序(如 top)。Detach 这个终端,之后可以从其他机器 reattach 这个相同的终端(比如通过 ssh)。 # top 现在用 **Ctrl-a Ctrl-d** 来 detach。Reattach 终端: # screen -r 或更好的: ~~~ # screen -R -D ~~~ 现在 attach 到这里。具体意思是:先试图恢复离线的 screen 会话。若找不到离线的 screen 会话,即建立新的 screen 会话给用户。 ### Screen 命令 (在 screen 中) 所有命令都以 **Ctrl-a** 开始。 - **Ctrl-a ?** 各功能的帮助摘要 - **Ctrl-a c** 创建一个新的 window (终端) - **Ctrl-a Ctrl-n 和 Ctrl-a Ctrl-p** 切换到下一个或前一个 window - **Ctrl-a Ctrl-N** N 为 0 到 9 的数字,用来切换到相对应的 window - **Ctrl-a "** 获取所有正在运行的 window 的可导航的列表 - **Ctrl-a a** 清楚错误的 Ctrl-a - **Ctrl-a Ctrl-d** 断开所有会话,会话中所有任务运行于后台 - **Ctrl-a x** 用密码锁柱 screen 终端 当程序内部运行终端关闭并且你登出该终端时,该 screen 会话就会被终止。 ## Find 一些重要选项: - `-x` (BSD) `-xdev` (Linux)       留于同一文件系统 (fstab 中的 dev) - `-exec cmd {} \;`       执行命令并用全路径替换 {} - `-iname`       同 -name 一样,但不区分大小写 - `-ls`       显示关于文件的信息(同 ls -la) - `-size n`       n 为 +-n (k M G T P) - `-cmin n`       查找系统中最后 n 分钟改变文件状态的文件 ~~~ # find . -type f ! -perm -444        # 寻找所有无法读取的文件 # find . -type d ! -perm -111        # 寻找所有无法访问的目录 # find /home/user/ -cmin 10 -print   # 寻找最后 10 分钟创建或修改的文件 # find . -name '*.[ch]' | xargs grep -E 'expr' # 在当前目录及子目录搜索 'expr' 表达式 # find / -name "*.core" | xargs rm   # 寻找 core 垃圾并删除它们(也可试试 core.*) # find / -name "*.core" -print -exec rm {} \;  # 另一种语法       # 寻找图像文件并创建一个归档文件,iname 为不区分大小写。-r 为附加       # find . \( -iname "*.png" -o -iname "*.jpg" \) -print -exec tar -rf images.tar {} \;       # find . -type f -name "*.txt" ! -name README.txt -print  # 除 README.txt 的文件 # find /var/ -size +10M -exec ls -lh {} \;     # 查找 > 10 MB 的文件 # find /var/ -size +10M -ls           # 这个更简单 # find . -size +10M -size -50M -print # find /usr/ports/ -name work -type d -print -exec rm -rf {} \;  # 清理 port       # 以 SUID 查找文件;这些文件很脆弱,必须保持安全。 # find / -type f -user root -perm -4000 -exec ls -l {} \; 小心 xarg 或 exec,因为当文件或目录中包含空格时可能会返回错误的结果。在有疑惑时用 "-print0 | xargs -0" 代替 "| xargs"。选项 -print0 必须在 find 命令的最后。看这个不错的[find 迷你教程](http://www.hccfl.edu/pollock/Unix/FindCmd.htm). # find . -type f | xargs ls -l       # 不能工作于有空格的名字 # find . -type f -print0 | xargs -0 ls -l  # 可工作于有空格的名字 # find . -type f -exec ls -l '{}' \; # 或使用用于 -exec 的引用 '{}' ~~~ ### 混杂的 # which command                      # 显示命令的全路径名 # time command                       # 显示一个命令执行完成所用的时间 # time cat                           # 使用 time 作为秒表,用 Ctrl-c 来停止 # set | grep $USER                   # 列显当前环境变量 # cal -3                             # 显示三个月日历 # date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]] # date 10022155                      # 设置日期和时间 # whatis grep                        # 显示命令的简短信息 # whereis java                       # 查询命令的的路径和标准目录 # setenv varname value               # 设置环境变量,设置变量 varname 的值为 value (csh/tcsh) # export varname="value"             # 设置环境变量,设置变量 varname 的值为 value  (sh/ksh/bash) # pwd                                # 显示当前工作目录# mkdir -p /path/to/dir               # 如果存在不显示错误,建立所需的上级目录# mkdir -p project/{bin,src,obj,doc/{html,man,pdf},debug/some/more/dirs} # rmdir /path/to/dir                 # 移除目录 # rm -rf /path/to/dir                # 移除目录和其内容(强制) # cp -la /dir1 /dir2                 # 存档、硬连接目录所有文件,用来替代拷贝 # cp -lpR /dir1 /dir2                # 同上 (FreeBSD) # cp unixtoolbox.xhtml{,.bak}        # 拷贝文件成新扩展名的快速方法 # mv /dir1 /dir2                     # 修改目录名