watch 和 tail 命令可以帮助监视 Linux 系统上的活动。本文介绍了这两个命令的一些有用的使用方法。watch 和 tail 命令为持续监视 Linux 系统上的活动提供了一些有趣的选项。也就是说，你可以通过 watch 来显示谁已登录，并随着用户登录和注销不断更新，而不是仅仅提出问题并获得答案（例如询问 who 并获取当前登录用户的列表）。使用 tail，你可以显示文件的底部并在添加内容时查看内容。这种监控一般非常有用，并且比定期运行命令所需的工作更少。使用 watch 命令使用 watch 的最简单示例之一是使用命令 watch who。你会看到一个列表，其中显示了谁登录了，以及他们登录的时间和登录位置。请注意，默认设置是每两秒更新一次显示（左上角），日期和时间（右上角）将按该间隔自行更新。用户列表将随着用户登录和注销而增长和缩小。$ watch who 此命令将显示如下所示的登录列表：Every 2.0s: who dragonfly: Thu Feb 27 10:52:00 2020 nemo pts/0 2020-02-27 08:07 (192.168.0.11) shs pts/1 2020-02-27 10:58 (192.168.0.5) 你可以通过添加 -n 选项（例如 -n 10）来修改更新间的不同秒数，以修改更新间隔，从而获取较少的更新频率。$ watch -n 10 who 上述命令将以新的间隔显示，并且显示的时间更新频率较低，从而使显示时间与所选间隔保持一致。Every 10.0s: who dragonfly: Thu Feb 27 11:05:47 2020 nemo pts/0 2020-02-27 08:07 (192.168.0.11) shs pts/1 2020-02-27 10:58 (192.168.0.5) 如果你希望仅查看命令的输出，而不是标题（前 2 行），则可以通过添加 -t（无标题）选项来省略这些行。$ watch -t who 然后，你的屏幕将显示如下所示：nemo pts/0 2020-02-27 08:07 (192.168.0.11) shs pts/1 2020-02-27 10:58 (192.168.0.5) 如果每次运行监视的命令时，输出都是相同的，则只有标题行（如果未省略）会更改。其余显示的信息将保持不变。如果你希望 watch 命令在它正在监视的命令的输出发生更新后立即退出，则可以使用 -g（将其视为“ 离开 go away ”）选项。例如，如果你只是在等待其他人开始登录系统，则可以选择执行此操作。你还可以使用 -d（ 差异 differences ）选项突出显示显示输出中的更改。突出显示只会持续一个间隔（默认为 2 秒），但有助于引起你对更新的注意。下面是一个更复杂的示例，该示例使用 watch 命令显示正在侦听连接的服务及其使用的端口。虽然输出不太可能更改，但它会提醒你任何新服务正在启动或关闭。$ watch 'sudo lsof -i -P -n | grep LISTEN' 值得注意的是，正在运行的命令需要用引号扩起来，以确保不会将 watch 命令的输出发送到 grep 命令。使用 watch -h 命令将为你提供命令选项的列表。$ watch -h Usage: watch [options] command Options: -b, --beep beep if command has a non-zero exit -c, --color interpret ANSI color and style sequences -d, --differences[=<permanent>] highlight changes between updates -e, --errexit exit if command has a non-zero exit -g, --chgexit exit when output from command changes -n, --interval <secs> seconds to wait between updates -p, --precise attempt run command in precise intervals -t, --no-title turn off header -x, --exec pass command to exec instead of "sh -c" -h, --help display this help and exit -v, --version output version information and exit 使用 tail -ftail -f 命令与 watch 有一些相同之处。它也会在添加文件时显示文件的底部和其他内容。你不必一次又一次地运行 tail 命令，而是运行一个命令并获得可重复更新显示视图的结果。例如，你可以使用如下命令查看系统日志：$ tail -f /var/log/syslog 某些文件（如 /var/log/wtmp）不适合这种类型的处理，因为它们的格式不是普通文本文件，但是通过组合 watch 和 tail，你可以获得类似的结果，如下所示：watch 'who /var/log/wtmp | tail -20' 无论有多少用户仍处于登录状态，此命令都将只显示最近的 5 次登录。如果发生其他登录，显示结果将添加一行记录并删除顶行记录。Every 60.0s: who /var/log/wtmp | tail -5 dragonfly: Thu Feb 27 12:46:07 2020 shs pts/0 2020-02-27 08:07 (192.168.0.5) nemo pts/1 2020-02-27 08:26 (192.168.0.5) shs pts/1 2020-02-27 10:58 (192.168.0.5) nemo pts/1 2020-02-27 11:34 (192.168.0.5) dory pts/1 2020-02-27 12:14 (192.168.0.5) 对你有时可能想要监视的信息，无论监视进程、登录名还是系统资源，watch 和 tail -f 命令都可以提供自动更新视图，从而使监视任务变得更加容易。via: https://www.networkworld.com/article/3529891/watching-activity-on-linux-with-watch-and-tail-commands.html作者：Sandra Henry-Stocker 选题：lujun9972 译者：Starryi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
ranger 是一个很好的工具，它为你的 Linux 文件提供了一个多级视图，并允许你使用方向键和一些方便的命令进行浏览和更改。ranger 是一款独特且非常方便的文件系统导航器，它允许你在 Linux 文件系统中移动，进出子目录，查看文本文件内容，甚至可以在不离开该工具的情况下对文件进行修改。它运行在终端窗口中，并允许你按下方向键进行导航。它提供了一个多级的文件显示，让你很容易看到你在哪里、在文件系统中移动、并选择特定的文件。要安装 ranger，请使用标准的安装命令（例如，sudo apt install ranger）。要启动它，只需键入 ranger。它有一个很长的、非常详细的手册页面，但开始使用 ranger 非常简单。ranger 的显示方式你需要马上习惯的最重要的一件事就是 ranger 的文件显示方式。一旦你启动了 ranger，你会看到四列数据。第一列是你启动 ranger 的位置的上一级。例如，如果你从主目录开始，ranger 将在第一列中列出所有的主目录。第二列将显示你的主目录（或者你开始的目录）中的目录和文件的第一屏内容。这里的关键是超越你可能有的任何习惯，将每一行显示的细节看作是相关的。第二列中的所有条目与第一列中的单个条目相关，第四列中的内容与第二列中选定的文件或目录相关。与一般的命令行视图不同的是，目录将被列在第一位（按字母数字顺序），文件将被列在第二位（也是按字母数字顺序）。从你的主目录开始，显示的内容可能是这样的：shs@dragonfly /home/shs/backups <== current selection bugfarm backups 0 empty dory bin 59 eel Buttons 15 nemo Desktop 0 shark Documents 0 shs Downloads 1 ^ ^ ^ ^ | | | | homes directories # files listing in selected in each of files in home directory selected directory ranger 显示的最上面一行告诉你在哪里。在这个例子中，当前目录是 /home/shs/backups。我们看到高亮显示的是 empty，因为这个目录中没有文件。如果我们按下方向键选择 bin，我们会看到一个文件列表：shs@dragonfly /home/shs/bin <== current selection bugfarm backups 0 append dory bin 59 calcPower eel Buttons 15 cap nemo Desktop 0 extract shark Documents 0 finddups shs Downloads 1 fix ^ ^ ^ ^ | | | | homes directories # files listing in selected in each of files in home directory selected directory 每一列中高亮显示的条目显示了当前的选择。使用右方向键可移动到更深的目录或查看文件内容。如果你继续按下方向键移动到列表的文件部分，你会注意到第三列将显示文件大小（而不是文件的数量）。“当前选择”行也会显示当前选择的文件名，而最右边的一列则会尽可能地显示文件内容。shs@dragonfly /home/shs/busy_wait.c <== current selection bugfarm BushyRidge.zip 170 K /* dory busy_wait.c 338 B * program that does a busy wait eel camper.jpg 5.55 M * it's used to show ASLR, and that's it nemo check_lockscreen 80 B */ shark chkrootkit-output 438 B #include <stdio.h> ^ ^ ^ ^ | | | | homes files sizes file content 在该显示的底行会显示一些文件和目录的详细信息：-rw-rw-r—- shs shs 338B 2019-01-05 14:44 1.52G, 365G free 67/488 11% 如果你选择了一个目录并按下回车键，你将进入该目录。然后，在你的显示屏中最左边的一列将是你的主目录的内容列表，第二列将是该目录内容的文件列表。然后你可以检查子目录的内容和文件的内容。按左方向键可以向上移动一级。按 q 键退出 ranger。做出改变你可以按 ? 键，在屏幕底部弹出一条帮助行。它看起来应该是这样的：View [m]an page, [k]ey bindings, [c]commands or [s]ettings? (press q to abort) 按 c 键，ranger 将提供你可以在该工具内使用的命令信息。例如，你可以通过输入 :chmod 来改变当前文件的权限，后面跟着预期的权限。例如，一旦选择了一个文件，你可以输入 :chmod 700 将权限设置为 rwx------。输入 :edit 可以在 nano 中打开该文件，允许你进行修改，然后使用 nano 的命令保存文件。总结使用 ranger 的方法比本篇文章所描述的更多。该工具提供了一种非常不同的方式来列出 Linux 系统上的文件并与之交互，一旦你习惯了它的多级的目录和文件列表方式，并使用方向键代替 cd 命令来移动，就可以很轻松地在 Linux 的文件中导航。via: https://www.networkworld.com/article/3583890/navigating-your-linux-files-with-ranger.html作者：Sandra Henry-Stocker 选题：lujun9972 译者：wxy 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
在 Linux 命令行进行打印的内容比单单一个 lp 命令多得多，让我们来看一些可用选项。Linux 命令行打印很容易。你可以使用 lp 命令来请求打印，并使用 lpq 命令来查看队列中有哪些打印作业，但是当你要双面打印或使用纵向模式时，这些会变得有些复杂。你可能还需要做很多其他事情，例如打印多份文档副本或取消打印作业。让我们来看看一些选项，当你从命令行打印时，如何让你的打印输出看起来如你所愿。显示打印机配置要从命令行查看打印机设置，请使用 lpoptions 命令。 输出应如下所示：$ lpoptions copies=1 device-uri=dnssd://HP%20Color%20LaserJet%20CP2025dn%20(F47468)._pdl-datastream._tcp.local/ finishings=3 job-cancel-after=10800 job-hold-until=no-hold job-priority=50 job-sheets=none,none marker-change-time=1553023232 marker-colors=#000000,#00FFFF,#FF00FF,#FFFF00 marker-levels=18,62,62,63 marker-names='Black\ Cartridge\ HP\ CC530A,Cyan\ Cartridge\ HP\ CC531A,Magenta\ Cartridge\ HP\ CC533A,Yellow\ Cartridge\ HP\ CC532A' marker-types=toner,toner,toner,toner number-up=1 printer-commands=none printer-info='HP Color LaserJet CP2025dn (F47468)' printer-is-accepting-jobs=true printer-is-shared=true printer-is-temporary=false printer-location printer-make-and-model='HP Color LaserJet cp2025dn pcl3, hpcups 3.18.7' printer-state=3 printer-state-change-time=1553023232 printer-state-reasons=none printer-type=167964 printer-uri-supported=ipp://localhost/printers/Color-LaserJet-CP2025dn sides=one-sided 如果将其空格转换为回车符，输出可能会更人性化，请注意列出了多少设置选项。注意：在下面的输出中，一些行被重新链接，以使输出更具可读性。$ lpoptions | tr " " '\n' copies=1 device-uri=dnssd://HP%20Color%20LaserJet%20CP2025dn%20(F47468)._pdl-datastream._tcp.local/ finishings=3 job-cancel-after=10800 job-hold-until=no-hold job-priority=50 job-sheets=none,none marker-change-time=1553023232 marker-colors=#000000,#00FFFF,#FF00FF,#FFFF00 marker-levels=18,62,62,63 marker-names='Black\ Cartridge\ HP\ CC530A, Cyan\ Cartridge\ HP\ CC531A, Magenta\ Cartridge\ HP\ CC533A, Yellow\ Cartridge\ HP\ CC532A' marker-types=toner,toner,toner,toner number-up=1 printer-commands=none printer-info='HP Color LaserJet CP2025dn (F47468)' printer-is-accepting-jobs=true printer-is-shared=true printer-is-temporary=false printer-location printer-make-and-model='HP Color LaserJet cp2025dn pcl3, hpcups 3.18.7' printer-state=3 printer-state-change-time=1553023232 printer-state-reasons=none printer-type=167964 printer-uri-supported=ipp://localhost/printers/Color-LaserJet-CP2025dn sides=one-sided 使用 -v 选项时，lpinfo 命令将列出驱动程序和相关信息：$ lpinfo -v network ipp network https network socket network beh direct hp network lpd file cups-brf:/ network ipps network http direct hpfax network dnssd://HP%20Color%20LaserJet%20CP2025dn%20(F47468)._pdl-datastream._tcp.local/ <== printer network socket://192.168.0.23 <== printer IP lpoptions 命令将显示默认打印机的设置。使用 -p 选项指定其中一个可用打印机代号：$ lpoptions -p LaserJet lpstat -p 命令显示打印机的状态，而 lpstat -p -d 列出可用打印机列表。$ lpstat -p -d printer Color-LaserJet-CP2025dn is idle. enabled since Tue 19 Mar 2019 05:07:45 PM EDT system default destination: Color-LaserJet-CP2025dn 非常有用的命令要在默认打印机上打印文档，只需使用 lp 命令，后跟要打印的文件名即可。 如果文件名包含空格（在 Linux 系统上很少见），请将该名称放在引号中或开始输入文件名并按 Tab 键调用空格的转义标志（如下面的第二个示例所示）。$ lp "never leave home angry" $ lp never\ leave\ home\ angry lpq 命令显示打印队列：$ lpq Color-LaserJet-CP2025dn is ready and printing Rank Owner Job File(s) Total Size active shs 234 agenda 2048 bytes 使用 -n 选项时，lp 命令可用来指定所需打印输出的份数：$ lp -n 11 agenda 要取消打印作业，可以使用 cancel 或 lprm 命令。如果没来得及执行，则可能会看到以下信息：$ cancel 229 cancel: cancel-job failed: Job #229 is already completed - can't cancel. 双面打印要以双面模式打印，你可以在 lp 命令中使用 sides 选项，该选项不但表示了在纸张的正反面进行打印，还表示了从纸张的哪个边开始打印。这个设置代表了你期望以双面纵向文档的正常方式打印。$ lp -o sides=two-sided-long-edge Notes.pdf 如果要所有文档以双面模式打印，则可以使用 lpoptions 命令更改 sides 设置以修改 lp 的设置。$ lpoptions -o sides=two-sided-short-edge 要恢复为单面打印，可以使用如下命令：$ lpoptions -o sides=one-sided 横向打印要以横向模式打印，可以在 lp 命令中使用 landscape 选项。$ lp -o landscape penguin.jpg CUPS（Unix 通用打印系统）Linux 系统上使用的打印系统是基于标准的开源打印系统，称为 CUPS，原意是 Unix 通用打印系统 Common Unix Printing System 。 它允许计算机充当打印服务器。via: https://www.networkworld.com/article/3373502/printing-from-the-linux-command-line.html作者：Sandra Henry-Stocker 选题：lujun9972 译者：stevenzdg988 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
Linux 系统上的 lshw 命令提供的系统设备信息比我们大多数人想象的要多得多。虽然 lshw 命令（ 列出硬件 list hardware ，读作 “ls hardware”）远不是每个人最先学会的 50 个 Linux 命令之一，但它可以提供很多系统硬件的有用信息。它以一种相当易于理解的格式提取出可能比你知道的更多的信息。在看到描述、（设备）逻辑名称、大小等以后，你可能会理解到自己能获得多少信息。这篇文章会研究 lshw 给出的信息，但侧重于磁盘及相关硬件。下面是 lshw 的输出示例：$ sudo lshw -C disk *-disk:0 description: SCSI Disk product: Card Reader-1 vendor: JIE LI physical id: 0.0.0 bus info: scsi@4:0.0.0 logical name: /dev/sdc version: 1.00 capabilities: removable configuration: logicalsectorsize=512 sectorsize=512 *-medium physical id: 0 logical name: /dev/sdc 请注意，你需要使用 sudo 运行 lshw 命令以确保能得到所有可用的信息。虽然我们在上面的命令中要求了输出“磁盘（disk）”（上面只包含了原始输出里五个条目中的一个），这里的输出却不是一个硬盘，而是读卡器——磁盘的一种。注意系统将这个设备命名为了 /dev/sdc。系统的主磁盘上也有相似的信息：*-disk description: ATA Disk product: SSD2SC120G1CS175 physical id: 0 bus info: scsi@0:0.0.0 logical name: /dev/sda <==这里 version: 1101 serial: PNY20150000778410606 size: 111GiB (120GB) capabilities: partitioned partitioned:dos configuration: ansiversion=5 logicalsectorsize=512 sectorsize=512 signature= f63b5929 这块硬盘是 /dev/sda。这个系统上的硬盘都显示为 ATA 磁盘，ATA 是一种把控制器与盘体集成在一起的磁盘驱动器实现。要获得“磁盘”类设备的简略列表，可以运行下面这条命令。注意其中有两个设备被列出了两次，所以我们看到的仍然是五个磁盘设备。$ sudo lshw -short -C disk H/W path Device Class Description ============================================================= /0/100/1d/1/1/0.0.0 /dev/sdc disk Card Reader-1 /0/100/1d/1/1/0.0.0/0 /dev/sdc disk /0/100/1d/1/1/0.0.1 /dev/sdd disk 2 /0/100/1d/1/1/0.0.1/0 /dev/sdd disk /0/100/1f.2/0 /dev/sda disk 120GB SSD2SC120G1CS175 /0/100/1f.2/1 /dev/cdrom disk DVD+-RW GSA-H73N /0/100/1f.5/0.0.0 /dev/sdb disk 500GB SAMSUNG HE502HJ 如果你决定要查看系统上的 所有 设备，请坐稳了；你会得到一个包含的东西比你通常认为的“设备”要多得多的列表，下面是一个例子，这是一个“简短（short）”（信息很少）的列表：$ sudo lshw -short [sudo] password for shs: H/W path Device Class Description ============================================================= system Inspiron 530s /0 bus 0RY007 /0/0 memory 128KiB BIOS /0/4 processor Intel(R) Core(TM)2 Duo CPU /0/4/a memory 32KiB L1 cache /0/4/b memory 6MiB L2 cache /0/24 memory 6GiB System Memory /0/24/0 memory 2GiB DIMM DDR2 Synchronous 667 /0/24/1 memory 1GiB DIMM DDR2 Synchronous 667 /0/24/2 memory 2GiB DIMM DDR2 Synchronous 667 /0/24/3 memory 1GiB DIMM DDR2 Synchronous 667 /0/1 generic /0/10 generic /0/11 generic /0/12 generic /0/13 generic /0/14 generic /0/15 generic /0/17 generic /0/18 generic /0/19 generic /0/2 generic /0/20 generic /0/100 bridge 82G33/G31/P35/P31 Express DRAM /0/100/1 bridge 82G33/G31/P35/P31 Express PCI /0/100/1/0 display Caicos [Radeon HD 6450/7450/84 /0/100/1/0.1 multimedia Caicos HDMI Audio [Radeon HD 6 /0/100/19 enp0s25 network 82562V-2 10/100 Network Connec /0/100/1a bus 82801I (ICH9 Family) USB UHCI /0/100/1a/1 usb3 bus UHCI Host Controller /0/100/1a.1 bus 82801I (ICH9 Family) USB UHCI /0/100/1a.1/1 usb4 bus UHCI Host Controller /0/100/1a.1/1/2 input Rock Candy Wireless Keyboard /0/100/1a.2 bus 82801I (ICH9 Family) USB UHCI /0/100/1a.2/1 usb5 bus UHCI Host Controller /0/100/1a.2/1/2 input USB OPTICAL MOUSE /0/100/1a.7 bus 82801I (ICH9 Family) USB2 EHCI /0/100/1a.7/1 usb1 bus EHCI Host Controller /0/100/1b multimedia 82801I (ICH9 Family) HD Audio /0/100/1d bus 82801I (ICH9 Family) USB UHCI /0/100/1d/1 usb6 bus UHCI Host Controller /0/100/1d/1/1 scsi4 storage CD04 /0/100/1d/1/1/0.0.0 /dev/sdc disk Card Reader-1 /0/100/1d/1/1/0.0.0/0 /dev/sdc disk /0/100/1d/1/1/0.0.1 /dev/sdd disk 2 /0/100/1d/1/1/0.0.1/0 /dev/sdd disk /0/100/1d.1 bus 82801I (ICH9 Family) USB UHCI /0/100/1d.1/1 usb7 bus UHCI Host Controller /0/100/1d.2 bus 82801I (ICH9 Family) USB UHCI /0/100/1d.2/1 usb8 bus UHCI Host Controller /0/100/1d.7 bus 82801I (ICH9 Family) USB2 EHCI /0/100/1d.7/1 usb2 bus EHCI Host Controller /0/100/1d.7/1/2 multimedia USB Live camera /0/100/1e bridge 82801 PCI Bridge /0/100/1e/1 communication HSF 56k Data/Fax Modem /0/100/1f bridge 82801IR (ICH9R) LPC Interface /0/100/1f.2 scsi0 storage 82801IR/IO/IH (ICH9R/DO/DH) 4 /0/100/1f.2/0 /dev/sda disk 120GB SSD2SC120G1CS175 /0/100/1f.2/0/1 /dev/sda1 volume 111GiB EXT4 volume /0/100/1f.2/1 /dev/cdrom disk DVD+-RW GSA-H73N /0/100/1f.3 bus 82801I (ICH9 Family) SMBus Con /0/100/1f.5 scsi3 storage 82801I (ICH9 Family) 2 port SA /0/100/1f.5/0.0.0 /dev/sdb disk 500GB SAMSUNG HE502HJ /0/100/1f.5/0.0.0/1 /dev/sdb1 volume 433GiB EXT4 volume /0/3 system PnP device PNP0c02 /0/5 system PnP device PNP0b00 /0/6 storage PnP device PNP0700 /0/7 system PnP device PNP0c02 /0/8 system PnP device PNP0c02 /0/9 system PnP device PNP0c01 运行下面的命令来列出设备类别，并统计每个类别中的设备数量。$ sudo lshw -short | awk ‘{print substr($0,36,13)}’ | tail -n +3 | sort | uniq -c 4 bridge 18 bus 1 communication 7 disk 1 display 12 generic 2 input 8 memory 3 multimedia 1 network 1 processor 4 storage 6 system 2 volume 注意： 上面使用 awk 命令从 lshw 的输出中选择 Class（类别）栏是这样实现的：使用 $0（选取完整行），但只取从正确位置（第 36 个字符）开始的子串，而因为“类别”中并没有条目的长度超过 13 个字符，所以子串就在那里结束。命令中 tail -n +3 的部分移除了标题和下面的=====，所以最终的列表中只包含了那 14 种设备类型。（LCTT 译注：上面的命令中 awk 的部分在选取子串时是从第 36 个字符开始的，这个数字基本上取决于最长的设备逻辑名称的长度，因而在不同的系统环境中可能有所不同，一个例子是，当你的系统上有 NVMe SSD 时，可能需要将其改为 41。）你会发现在没有使用 -short 选项的时候，每一个磁盘类设备都会有大约 12 行的输出，包括像是 /dev/sda 这样的逻辑名称，磁盘大小和种类等等。$ sudo lshw -C disk [sudo] password for shs: *-disk:0 description: SCSI Disk product: Card Reader-1 <== 读卡器？ vendor: JIE LI physical id: 0.0.0 bus info: scsi@4:0.0.0 logical name: /dev/sdc version: 1.00 capabilities: removable configuration: logicalsectorsize=512 sectorsize=512 *-medium physical id: 0 logical name: /dev/sdc *-disk:1 description: SCSI Disk product: 2 vendor: AC4100 - physical id: 0.0.1 bus info: scsi@4:0.0.1 logical name: /dev/sdd capabilities: removable configuration: logicalsectorsize=512 sectorsize=512 *-medium physical id: 0 logical name: /dev/sdd *-disk description: ATA Disk product: SSD2SC120G1CS175 physical id: 0 bus info: scsi@0:0.0.0 logical name: /dev/sda <== 主要磁盘 version: 1101 serial: PNY20150000778410606 size: 111GiB (120GB) capabilities: partitioned partitioned:dos configuration: ansiversion=5 logicalsectorsize=512 sectorsize=512 signature=f63b5929 *-cdrom <== 也叫 /dev/sr0 description: DVD writer product: DVD+-RW GSA-H73N vendor: HL-DT-ST physical id: 1 bus info: scsi@1:0.0.0 logical name: /dev/cdrom logical name: /dev/cdrw logical name: /dev/dvd logical name: /dev/dvdrw logical name: /dev/sr0 version: B103 serial: [ capabilities: removable audio cd-r cd-rw dvd dvd-r configuration: ansiversion=5 status=nodisc *-disk description: ATA Disk product: SAMSUNG HE502HJ physical id: 0.0.0 bus info: scsi@3:0.0.0 logical name: /dev/sdb <== 次要磁盘 version: 0002 serial: S2B6J90B501053 size: 465GiB (500GB) capabilities: partitioned partitioned:dos configuration: ansiversion=5 logicalsectorsize=512 sectorsize=512 signature=7e67ccf3 总结lshw 命令提供了一些我们许多人通常不会处理的信息，不过即使你只用了其中的一部分，知道有多少信息可用还是很不错的。via: https://www.networkworld.com/article/3583598/how-to-view-information-on-your-linux-devices-with-lshw.html作者：Sandra Henry-Stocker 选题：lujun9972 译者：rakino 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
这篇文章介绍了 testdisk，这是恢复最近删除的文件（以及用其他方式修复分区）的工具之一，非常方便。当你在 Linux 系统上删除一个文件时，它不一定会永远消失，特别是当你最近才刚刚删除了它的时候。除非你用 shred 等工具把它擦掉，否则数据仍然会放在你的磁盘上 —— 而恢复已删除文件的最佳工具之一 testdisk 可以帮助你拯救它。虽然 testdisk 具有广泛的功能，包括恢复丢失或损坏的分区和使不能启动磁盘可以重新启动，但它也经常被用来恢复被误删的文件。在本篇文章中，我们就来看看如何使用 testdisk 恢复已删除的文件，以及该过程中的每一步是怎样的。由于这个过程需要不少的步骤，所以当你做了几次之后，你可能会觉得操作起来会更加得心应手。安装 testdisk可以使用 apt install testdisk 或 yum install testdisk 等命令安装 testdisk。有趣的是，它不仅是一个 Linux 工具，而且还适用于 MacOS、Solaris 和 Windows。文档可在 cgsecurity.org 中找到。恢复文件首先，你必须以 root 身份登录，或者有 sudo 权限才能使用 testdisk。如果你没有 sudo 访问权限，你会在这个过程一开始就被踢出，而如果你选择创建了一个日志文件的话，最终会有这样的消息：TestDisk exited normally. jdoe is not in the sudoers file. This incident will be reported. 当你用 testdisk 恢复被删除的文件时，你最终会将恢复的文件放在你启动该工具的目录下，而这些文件会属于 root。出于这个原因，我喜欢在 /home/recovery 这样的目录下启动。一旦文件被成功地还原和验证，就可以将它们移回它们的所属位置，并将它们的所有权也恢复。在你可以写入的选定目录下开始：$ cd /home/recovery $ testdisk testdisk 提供的第一页信息描述了该工具并显示了一些选项。至少在刚开始，创建个日志文件是个好主意，因为它提供的信息可能会被证明是有用的。下面是如何做的：Use arrow keys to select, then press Enter key: >[ Create ] Create a new log file [ Append ] Append information to log file [ No Log ] Don’t record anything 左边的 > 以及你看到的反转的字体和背景颜色指出了你按下回车键后将使用的选项。在这个例子中，我们选择了创建日志文件。然后会提示你输入密码（除非你最近使用过 sudo）。下一步是选择被删除文件所存储的磁盘分区（如果没有高亮显示的话）。根据需要使用上下箭头移动到它。然后点两次右箭头，当 “Proceed” 高亮显示时按回车键。Select a media (use Arrow keys, then press Enter): Disk /dev/sda - 120 GB / 111 GiB - SSD2SC120G1CS1754D117-551 >Disk /dev/sdb - 500 GB / 465 GiB - SAMSUNG HE502HJ Disk /dev/loop0 - 13 MB / 13 MiB (RO) Disk /dev/loop1 - 101 MB / 96 MiB (RO) Disk /dev/loop10 - 148 MB / 141 MiB (RO) Disk /dev/loop11 - 36 MB / 35 MiB (RO) Disk /dev/loop12 - 52 MB / 49 MiB (RO) Disk /dev/loop13 - 78 MB / 75 MiB (RO) Disk /dev/loop14 - 173 MB / 165 MiB (RO) Disk /dev/loop15 - 169 MB / 161 MiB (RO) >[Previous] [ Next ] [Proceed ] [ Quit ] 在这个例子中，被删除的文件在 /dev/sdb 的主目录下。此时，testdisk 应该已经选择了合适的分区类型。Disk /dev/sdb - 500 GB / 465 GiB - SAMSUNG HE502HJ Please select the partition table type, press Enter when done. [Intel ] Intel/PC partition >[EFI GPT] EFI GPT partition map (Mac i386, some x86_64...) [Humax ] Humax partition table [Mac ] Apple partition map (legacy) [None ] Non partitioned media [Sun ] Sun Solaris partition [XBox ] XBox partition [Return ] Return to disk selection 在下一步中，按向下箭头指向 “[ Advanced ] Filesystem Utils”。[ Analyse ] Analyse current partition structure and search for lost partitions >[ Advanced ] Filesystem Utils [ Geometry ] Change disk geometry [ Options ] Modify options [ Quit ] Return to disk selection 接下来，查看选定的分区。Partition Start End Size in sectors > 1 P Linux filesys. data 2048 910155775 910153728 [drive2] 然后按右箭头选择底部的 “[ List ]”，按回车键。[ Type ] [Superblock] >[ List ] [Image Creation] [ Quit ] 请注意，它看起来就像我们从根目录 / 开始，但实际上这是我们正在工作的文件系统的基点。在这个例子中，就是 /home。Directory / <== 开始点 >drwxr-xr-x 0 0 4096 23-Sep-2020 17:46 . drwxr-xr-x 0 0 4096 23-Sep-2020 17:46 .. drwx——— 0 0 16384 22-Sep-2020 11:30 lost+found drwxr-xr-x 1008 1008 4096 9-Jul-2019 14:10 dorothy drwxr-xr-x 1001 1001 4096 22-Sep-2020 12:12 nemo drwxr-xr-x 1005 1005 4096 19-Jan-2020 11:49 eel drwxrwxrwx 0 0 4096 25-Sep-2020 08:08 recovery ... 接下来，我们按箭头指向具体的主目录。drwxr-xr-x 1016 1016 4096 17-Feb-2020 16:40 gino >drwxr-xr-x 1000 1000 20480 25-Sep-2020 08:00 shs 按回车键移动到该目录，然后根据需要向下箭头移动到子目录。注意，如果选错了，可以选择列表顶部附近的 .. 返回。如果找不到文件，可以按 /（就像在 vi 中开始搜索时一样），提示你输入文件名或其中的一部分。Directory /shs <== current location Previous ... -rw-rw-r— 1000 1000 426 8-Apr-2019 19:09 2-min-topics >-rw-rw-r— 1000 1000 24667 8-Feb-2019 08:57 Up_on_the_Roof.pdf 一旦你找到需要恢复的文件，按 c 选择它。注意：你会在屏幕底部看到有用的说明：Use Left arrow to go back, Right to change directory, h to hide deleted files q to quit, : to select the current file, a to select all files C to copy the selected files, c to copy the current file <== 这时，你就可以在起始目录内选择恢复该文件的位置了（参见前面的说明，在将文件移回原点之前，先在一个合适的地方进行检查）。在这种情况下，/home/recovery 目录没有子目录，所以这就是我们的恢复点。注意：你会在屏幕底部看到有用的说明：Please select a destination where /shs/Up_on_the_Roof.pdf will be copied. Keys: Arrow keys to select another directory C when the destination is correct Q to quit Directory /home/recovery <== 恢复位置 一旦你看到 “Copy done! 1 ok, 0 failed” 的绿色字样，你就会知道文件已经恢复了。在这种情况下，文件被留在 /home/recovery/shs 下（起始目录，附加所选目录）。在将文件移回原来的位置之前，你可能应该先验证恢复的文件看起来是否正确。确保你也恢复了原来的所有者和组，因为此时文件由 root 拥有。注意： 对于文件恢复过程中的很多步骤，你可以使用退出（按 q 或“[ Quit ]”）来返回上一步。如果你愿意，可以选择退出选项一直回到该过程中的第一步，也可以选择按下 ^c 立即退出。恢复训练使用 testdisk 恢复文件相对来说没有痛苦，但有些复杂。在恐慌时间到来之前，最好先练习一下恢复文件，让自己有机会熟悉这个过程。via: https://www.networkworld.com/article/3575524/recovering-deleted-files-on-linux-with-testdisk.html作者：Sandra Henry-Stocker 选题：lujun9972 译者：wxy 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
stat 命令提供了很多关于文件的详细信息。它不仅提供了文件最近变化的日期/时间，还显示了最近访问文件的时间和权限变化。它可以同时告诉你文件的字节大小和块的数量。它可以显示文件使用的 inode 以及文件类型。它包括了文件所有者和相关用户组的名称和 UID/GID。它以 “rwx”（被称为 “人类可读” 格式）和数字方式显示文件权限。在某些系统中，它甚至可能包括文件创建的日期和时间（称为“出生”）。除了提供所有这些信息外，stat 命令还可以用来创建文件列表。这些列表非常灵活，你可以选择包含上述任何或全部信息。要生成一个自定义列表，你只需要使用 stat 命令的 -c（或 --format）选项，并指定你想要包含的字段。例如，要创建一个以两种格式显示文件权限的列表，使用这个命令：$ stat -c '%n %a %A' my* my.banner 664 -rw-rw-r-- mydir 775 drwxrwxr-x myfile 664 -rw-rw-r-- myjunk 777 lrwxrwxrwx mykey 664 -rw-rw-r-- mylog 664 -rw-rw-r-- myscript 755 -rwxr-xr-x mytext 664 -rw-rw-r-- mytext.bak 664 -rw-rw-r-- mytwin 50 -rw-r----- mywords 664 -rw-rw-r-- 如上例所示，%n 代表文件名，%a 代表八进制的权限，%A 代表 rwx 形式的权限。完整的列表如后面所示。要为这个命令创建一个别名，输入这个命令，或在 .bashrc 文件中添加这个定义。$ alias ls_perms="stat -c '%n %a %A'" 要创建一个非常接近 ls -l 提供的长列表，可以这样做：$ stat -c '%A %h %U %G %s %y %n' my* -rw-rw-r-- 1 shs shs 255 2020-04-01 16:20:00.899374215 -0400 my.banner drwxrwxr-x 2 shs shs 4096 2020-09-07 12:50:20.224470760 -0400 mydir -rw-rw-r-- 1 shs shs 6 2020-05-16 11:12:00.460355387 -0400 myfile lrwxrwxrwx 1 shs shs 11 2020-05-28 18:49:21.666792608 -0400 myjunk -rw-rw-r-- 1 shs shs 655 2020-01-14 15:56:08.540540488 -0500 mykey -rw-rw-r-- 1 shs shs 8 2020-03-04 17:13:21.406874246 -0500 mylog -rwxr-xr-x 1 shs shs 201 2020-09-07 12:50:41.316745867 -0400 myscript -rw-rw-r-- 1 shs shs 40 2019-06-06 08:54:09.538663323 -0400 mytext -rw-rw-r-- 1 shs shs 24 2019-06-06 08:48:59.652712578 -0400 mytext.bak -rw-r----- 2 shs shs 228 2019-04-12 19:37:12.790284604 -0400 mytwin -rw-rw-r-- 1 shs shs 1983 2020-08-10 14:39:57.164842370 -0400 mywords 不同之处包括： 1、不试图将字段排成可辨认的一列，2、日期是 yy-mm-dd 格式，3、时间字段更精确，4、增加了时区（-0400 是 EDT）。如果你想根据最后一次访问的日期来列出文件（例如，用 cat 命令来显示），使用这样的命令：$ stat -c '%n %x' my* | sort -k2 mytwin 2019-04-22 11:25:20.656828964 -0400 mykey 2020-08-20 16:10:34.479324431 -0400 mylog 2020-08-20 16:10:34.527325066 -0400 myfile 2020-08-20 16:10:57.815632794 -0400 mytext.bak 2020-08-20 16:10:57.935634379 -0400 mytext 2020-08-20 16:15:42.323391985 -0400 mywords 2020-08-20 16:15:43.479407259 -0400 myjunk 2020-09-07 10:04:26.543980300 -0400 myscript 2020-09-07 12:50:41.312745815 -0400 my.banner 2020-09-07 13:22:38.105826116 -0400 mydir 2020-09-07 14:53:10.171867194 -0400 用 stat 列出文件细节时，可用的选项包括：%a - 八进制的访问权限（注意 # 和 0 的 printf 标志）%A – 人类可读的访问权限%b – 分配的块数（见 %B）%B – %b 报告的每个块的字节数%C – SELinux 安全上下文字符串%d – 十进制的设备编号%D – 十六进制的设备编号%f – 十六进制的原始模式%F – 文件类型%g – 所有者的组 ID%G – 所有者的组名%h – 硬链接的数量%i – inode 编号%m – 挂载点%n – 文件名%N – 如果是符号链接，会解引用为指向的文件名%o – 最佳 I/O 传输大小提示%s – 以字节为单位的总大小%t – 十六进制的主要设备类型，用于字符/块设备特殊文件%T – 十六进制的次要设备类型，用于字符/块设备特殊文件%u – 所有者的用户 ID%U – 所有者的用户名%w – 文件创建时间，以人类可读形式； 如果未知，则为 -。%W – 文件创建时间，以 UNIX 纪元以来的秒数形式；如果未知，则为 0。%x – 上次访问时间，以人类可读形式%X – 上次访问时间，以 UNIX 纪元以来的秒数形式%y – 上次数据修改时间，以人类可读形式%Y – 上次数据修改时间，以 UNIX 纪元以来的秒数形式%z – 上次状态改变的时间，以人类可读形式%Z – 上次状态改变的时间，以 UNIX 纪元以来的秒数形式这些字段的选择都列在手册页中，你可以选择任何一个，不过用你喜欢的选项创建一些别名应该可以省去很多麻烦。有些选项，如 SELinux 安全上下文字符串，除非在系统中有使用，它将不可用。文件创建时间只有在你的系统保留该信息的情况下才可用。via: https://www.networkworld.com/article/3573802/using-the-linux-stat-command-to-create-flexible-file-listings.html作者：Sandra Henry-Stocker 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
在 Linux 系统上，bash shell 的 history 命令可以方便地回顾和重用命令，但是你要控制它记住多少，忘记多少，有很多事情要做。Linux 系统中的 bash history 命令有助于记住你以前运行过的命令，并重复这些命令，而不必重新输入。如果可以的话，你肯定会很高兴不用翻阅十几页的手册，每过一会再次列出你的文件，而是通过输入 history 查看以前运行的命令。在这篇文章中，我们将探讨如何让 history 命令记住你希望它记住的内容，并忘记那些可能没有什么“历史价值”的命令。查看你的命令历史要查看以前运行过的命令，你只需输入 history。你可能会看到一长串命令。记忆的命令数量取决于在 ~/.bashrc 文件中设置的名为 $HISTSIZE 的环境变量，但是如果你想保存更多或更少的命令，你可以根据你的需要改变这个设置。要查看历史记录，请使用 history 命令：$ history 209 uname -v 210 date 211 man chage ... 要查看将显示的最大命令数量：$ echo $HISTSIZE 500 你可以通过运行这样的命令来改变 $HISTSIZE 并使之永久化：$ export HISTSIZE=1000 $ echo "HISTSIZE=1000" >> ~/.bashrc 在为你保留多少历史记录和当你输入 history 时显示多少历史记录之间也有区别。$HISTSIZE 变量控制显示多少历史记录，而 $HISTFILESIZE 变量控制在你的 .bash_history 文件中保留多少命令。$ echo $HISTSIZE 1000 $ echo $HISTFILESIZE 2000 你可以通过计算历史文件中的行数来验证第二个变量：$ wc -l .bash_history 2000 .bash_history 需要注意的是，在登录会话中输入的命令在注销前不会被添加到你的 .bash_history 文件中，尽管它们会立即显示在 history 命令输出中。使用历史有三种方法可以重发你在 history 中发现的命令。最简单的方法，特别是当你想重用的命令是最近运行的时候，通常是输入一个 ! 后面跟上命令中足够多的首字母来唯一地识别它。$ !u uname -v #37-Ubuntu SMP Thu Mar 26 20:41:27 UTC 2020 另一种简单的重复命令的方法是，只需按上箭头键，直到显示了该命令，然后按回车键。另外，如果你运行 history 命令，并看到你想重新运行的命令被列出，你可以输入一个 ! 后面跟着命令左边显示的序号。$ !209 uname -v #37-Ubuntu SMP Thu Mar 26 20:41:27 UTC 2020 隐藏历史如果你想在一段时间内停止记录命令，你可以使用这个命令：$ set +o history 当你输入 history 时，你输入的命令不会显示出来，当你退出会话或退出终端时，它们也不会被添加到你的 .bash_history 文件中。要取消这个设置，使用 set -o history。要使它永久化，你可以把它添加到你的 .bashrc 文件中，尽管不使用命令历史记录通常不是一个好主意。$ echo 'set +o history' >> ~/.bashrc 要暂时清除历史记录，这样在输入 history 时只显示之后输入的命令，可以使用 history -c（清除）命令：$ history | tail -3 209 uname -v 210 date 211 man chage $ history -c $ history 1 history 注意：在输入 history -c 后输入的命令不会被添加到 .bash_history 文件中。控制历史许多系统上的 history 命令的设置会默认包括一个名为 $HISTCONTROL 的变量，以确保即使你连续运行同一命令七次，也只会被记住一次。它还可以确保你在首先输入一个或多个空格后跟着的命令将从你的命令历史记录中忽略。$ grep HISTCONTROL .bashrc HISTCONTROL=ignoreboth ignoreboth 的意思是“忽略重复的命令和以空格开头的命令”。例如，如果你输入这些命令：$ echo try this $ date $ date $ date $ pwd $ history 你的 history 命令应该像这样报告：$ history $ echo try this $ date $ history 请注意，连续的 date 命令被缩减为一条，以空格缩进的命令被省略。忽略历史要忽略某些命令，使它们在你输入 history 时不会出现，也不会被添加到你的 .bash_history 文件中，可以使用 $HISTIGNORE 设置。例如：$ export HISTIGNORE=”history:cd:exit:ls:pwd:man” 这个设置将导致所有的 history、cd、exit、ls、pwd 和 man 命令从你的 history 命令的输出和 .bash_history 文件中被忽略。如果你想把这个设置变成永久性的，你必须把它添加到你的 .bashrc 文件中。$ echo 'HISTIGNORE="history:cd:exit:ls:pwd:man"' >> .bashrc 这个设置只是意味着当你回看以前运行的命令时，列表不会被你在查看命令历史记录时不想看到的命令所干扰。记住、忽略和忘记过去的命令命令历史记录很有用，因为它可以帮助你记住最近使用过的命令，并提醒你最近所做的更改。它还可以让你更容易地重新运行命令，特别是那些有一串参数但你不一定想重新创建的命令。定制你的历史设置可以让你对命令历史的使用变得更容易，更有效率。via: https://www.networkworld.com/article/3537214/tweaking-history-on-linux.html作者：Sandra Henry-Stocker 选题：lujun9972 译者：wxy 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
Linux 命令可以提供文件的详细信息，也可以自定义显示的文件列表，甚至可以深入到文件系统的目录中，只要你愿意看。在 Linux 系统上，有许多方法可以列出文件并显示它们的信息。这篇文章回顾了一些提供文件细节的命令，并提供了自定义文件列表的选项，以满足你的需求。大多数命令都会列出单个目录中的文件，而其他命令则可以深入到文件系统的目录中，只要你愿意看。当然，最主要的文件列表命令是 ls。然而，这个命令有大量的选项，可以只查找和列出你想看的文件。另外，还有 find 可以帮助你进行非常具体的文件搜索。按名称列出文件最简单的方法是使用 ls 命令按名称列出文件。毕竟，按名称（字母数字顺序）列出文件是默认的。你可以选择 ls（无细节）或 ls -l（大量细节）来决定你看到什么。$ ls | head -6 8pgs.pdf Aesthetics_Thank_You.pdf alien.pdf Annual_Meeting_Agenda-20190602.pdf bigfile.bz2 bin $ ls -l | head -6 -rw-rw-r-- 1 shs shs 10886 Mar 22 2019 8pgs.pdf -rw-rw-r-- 1 shs shs 284003 May 11 2019 Aesthetics_Thank_You.pdf -rw-rw-r-- 1 shs shs 38282 Jan 24 2019 alien.pdf -rw-rw-r-- 1 shs shs 97358 May 19 2019 Annual_Meeting_20190602.pdf -rw-rw-r-- 1 shs shs 18115234 Apr 16 17:36 bigfile.bz2 drwxrwxr-x 4 shs shs 8052736 Jul 10 13:17 bin 如果你想一次查看一屏的列表，可以将 ls 的输出用管道送到 more 命令中。按相反的名字顺序排列文件要按名称反转文件列表，请添加 -r（ 反转 Reverse ）选项。这就像把正常的列表倒过来一样。$ ls -r $ ls -lr 按文件扩展名列出文件ls 命令不会按内容分析文件类型，它只会处理文件名。不过，有一个命令选项可以按扩展名列出文件。如果你添加了 -X （ 扩展名 eXtension ）选项，ls 将在每个扩展名类别中按名称对文件进行排序。例如，它将首先列出没有扩展名的文件（按字母数字顺序），然后是扩展名为 .1、.bz2、.c 等的文件。只列出目录默认情况下，ls 命令将同时显示文件和目录。如果你想只列出目录，你可以使用 -d（ 目录 Directory ）选项。你会得到一个像这样的列表：$ ls -d */ 1/ backups/ modules/ projects/ templates/ 2/ html/ patches/ public/ videos/ bin/ new/ private/ save/ 按大小排列文件如果你想按大小顺序列出文件，请添加 -S（ 大小 Size ）选项。但请注意，这实际上不会显示文件的大小（以及其他文件的细节），除非你还添加 -l（ 长列表 Long listing ）选项。当按大小列出文件时，一般来说，看到命令在按你的要求做事情是很有帮助的。注意，默认情况下是先显示最大的文件。添加 -r 选项可以反过来（即 ls -lSr）。$ ls -lS total 959492 -rw-rw-r-- 1 shs shs 357679381 Sep 19 2019 sav-linux-free-9.tgz -rw-rw-r-- 1 shs shs 103270400 Apr 16 17:38 bigfile -rw-rw-r-- 1 shs shs 79117862 Oct 5 2019 Nessus-8.7.1-ubuntu1110_amd64.deb 按属主列出文件如果你想按属主列出文件（例如，在一个共享目录中），你可以把 ls 命令的输出传给 sort，并通过添加 -k3 来按第三个字段排序，从而挑出属主一栏。$ ls -l | sort -k3 | more total 56 -rw-rw-r-- 1 dory shs 0 Aug 23 12:27 tasklist drwx------ 2 gdm gdm 4096 Aug 21 17:12 tracker-extract-files.121 srwxr-xr-x 1 root root 0 Aug 21 17:12 ntf_listenerc0c6b8b4567 drwxr-xr-x 2 root root 4096 Aug 21 17:12 hsperfdata_root ^ | 事实上，你可以用这种方式对任何字段进行排序（例如，年份）。只是要注意，如果你要对一个数字字段进行排序，则要加上一个 n，如 -k5n，否则你将按字母数字顺序进行排序。这种排序技术对于文件内容的排序也很有用，而不仅仅是用于列出文件。按年份排列文件使用 -t（ 修改时间 Time modified ）选项按年份顺序列出文件 —— 它们的新旧程度。添加 -r 选项，让最近更新的文件在列表中最后显示。我使用这个别名来显示我最近更新的文件列表。$ alias recent='ls -ltr | tail -8' 请注意，文件的更改时间和修改时间是不同的。-c（ 更改时间 time Changed ）和 -t（修改时间）选项的结果并不总是相同。如果你改变了一个文件的权限，而没有改变其他内容，-c 会把这个文件放在 ls 输出的顶部，而 -t 则不会。如果你想知道其中的区别，可以看看 stat 命令的输出。$ stat ckacct File: ckacct Size: 200 Blocks: 8 IO Block: 4096 regular file Device: 801h/2049d Inode: 829041 Links: 1 Access: (0750/-rwxr-x---) Uid: ( 1000/ shs) Gid: ( 1000/ shs) Access: 2020-08-20 16:10:11.063015008 -0400 Modify: 2020-08-17 07:26:34.579922297 -0400 <== content changes Change: 2020-08-24 09:36:51.699775940 -0400 <== content or permissions changes Birth: - 按组别列出文件要按关联的组别对文件进行排序，你可以将一个长列表的输出传给 sort 命令，并告诉它在第 4 列进行排序。$ ls -l | sort -k4 按访问日期列出文件要按访问日期（最近访问的日期在前）列出文件，使用 -ltu 选项。u 强制“按访问日期”排列顺序。$ ls -ltu total 959500 -rwxr-x--- 1 shs shs 200 Aug 24 09:42 ckacct <== most recently used -rw-rw-r-- 1 shs shs 1335 Aug 23 17:45 lte 单行列出多个文件有时，精简的文件列表更适合手头的任务。ls 命令甚至有这方面的选项。为了在尽可能少的行上列出文件，你可以使用 --format=comma 来用逗号分隔文件名，就像这个命令一样：$ ls --format=comma 1, 10, 11, 12, 124, 13, 14, 15, 16pgs-landscape.pdf, 16pgs.pdf, 17, 18, 19, 192.168.0.4, 2, 20, 2018-12-23_OoS_2.pdf, 2018-12-23_OoS.pdf, 20190512_OoS.pdf, '2019_HOHO_application working.pdf' … 喜欢用空格？使用 --format=across 代替。$ ls --format=across z* z zip zipfiles zipfiles1.bat zipfiles2.bat zipfiles3.bat zipfiles4.bat zipfiles.bat zoom_amd64.deb zoomap.pdf zoom-mtg 增加搜索的深度虽然 ls 一般只列出单个目录中的文件，但你可以选择使用 -R 选项（ 递归 Recursively ）地列出文件，深入到整个目录的深处。$ ls -R zzzzz | grep -v "^$" zzzzz: zzzz zzzzz/zzzz: zzz zzzzz/zzzz/zzz: zz zzzzz/zzzz/zzz/zz: z zzzzz/zzzz/zzz/zz/z: sleeping 另外，你也可以使用 find 命令，对深度进行限制或不限制。在这个命令中，我们指示 find 命令只在三个层次的目录中查找：$ find zzzzz -maxdepth 3 zzzzz zzzzz/zzzz zzzzz/zzzz/zzz zzzzz/zzzz/zzz/zz 选择 ls 还是 find当你需要列出符合具体要求的文件时，find 命令可能是比 ls 更好的工具。与 ls 不同的是，find 命令会尽可能地深入查找，除非你限制它。它还有许多其他选项和一个 -exec 子命令，允许在找到你要找的文件后采取一些特定的行动。总结ls 命令有很多用于列出文件的选项。了解一下它们。你可能会发现一些你会喜欢的选项。via: https://www.networkworld.com/article/3572590/11-ways-to-list-and-sort-files-on-linux.html作者：Sandra Henry-Stocker 选题：lujun9972 译者：wxy 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
在 Linux 上合并和排序文本的方法有很多种，但如何去处理它取决于你试图做什么：你是只想将多个文件的内容放入一个文件中，还是以某种方式组织它，让它更易于使用。在本文中，我们将查看一些用于排序和合并文件内容的命令，并重点介绍结果有何不同。使用 cat如果你只想将一组文件放到单个文件中，那么 cat 命令是一个容易的选择。你所要做的就是输入 cat，然后按你希望它们在合并文件中的顺序在命令行中列出这些文件。将命令的输出重定向到要创建的文件。如果指定名称的文件已经存在，那么文件将被覆盖。例如：$ cat firstfile secondfile thirdfile > newfile 如果要将一系列文件的内容添加到现有文件中，而不是覆盖它，只需将 > 变成 >>。$ cat firstfile secondfile thirdfile >> updated_file 如果你要合并的文件遵循一些方便的命名约定，那么任务可能更简单。如果可以使用正则表达式指定所有文件名，那就不必列出所有文件。例如，如果文件全部以 file 结束，如上所示，你可以进行如下操作：$ cat *file > allfiles 请注意，上面的命令将按字母数字顺序添加文件内容。在 Linux 上，一个名为 filea 的文件将排在名为 fileA 的文件的前面，但会在 file7 的后面。毕竟，当我们处理字母数字序列时，我们不仅需要考虑 ABCDE，还需要考虑 0123456789aAbBcCdDeE。你可以使用 ls *file 这样的命令来查看合并文件之前文件的顺序。注意：首先确保你的命令包含合并文件中所需的所有文件，而不是其他文件，尤其是你使用 * 等通配符时。不要忘记，用于合并的文件仍将单独存在，在确认合并后，你可能想要删除这些文件。按时间期限合并文件如果要基于每个文件的时间期限而不是文件名来合并文件，请使用以下命令：$ for file in `ls -tr myfile.*`; do cat $file >> BigFile.$$; done 使用 -tr 选项（t = 时间，r = 反向）将产生按照最早的在最前排列的文件列表。例如，如果你要保留某些活动的日志，并且希望按活动执行的顺序添加内容，则这非常有用。上面命令中的 $$ 表示运行命令时的进程 ID。不是很必要使用此功能，但它几乎不可能会无意添加到现有的文件，而不是创建新文件。如果使用 $$，那么生成的文件可能如下所示：$ ls -l BigFile.* -rw-rw-r-- 1 justme justme 931725 Aug 6 12:36 BigFile.582914 合并和排序文件Linux 提供了一些有趣的方式来对合并之前或之后的文件内容进行排序。按字母对内容进行排序如果要对合并的文件内容进行排序，那么可以使用以下命令对整体内容进行排序：$ cat myfile.1 myfile.2 myfile.3 | sort > newfile 如果要按文件对内容进行分组，请使用以下命令对每个文件进行排序，然后再将它添加到新文件中：$ for file in `ls myfile.?`; do sort $file >> newfile; done 对文件进行数字排序要对文件内容进行数字排序，请在 sort 中使用 -n 选项。仅当文件中的行以数字开头时，此选项才有用。请记住，按照默认顺序，02 将小于 1。当你要确保行以数字排序时，请使用 -n 选项。$ cat myfile.1 myfile.2 myfile.3 | sort -n > xyz 如果文件中的行以 2020-11-03 或 2020/11/03（年月日格式）这样的日期格式开头，-n 选项还能让你按日期对内容进行排序。其他格式的日期排序将非常棘手，并且将需要更复杂的命令。使用 pastepaste 命令允许你逐行连接文件内容。使用此命令时，合并文件的第一行将包含要合并的每个文件的第一行。以下是示例，其中我使用了大写字母以便于查看行的来源：$ cat file.a A one A two A three $ paste file.a file.b file.c A one B one C one A two B two C two A three B three C thee B four C four C five 将输出重定向到另一个文件来保存它：$ paste file.a file.b file.c > merged_content 或者，你可以将每个文件的内容在同一行中合并，然后将文件粘贴在一起。这需要使用 -s（序列）选项。注意这次的输出如何显示每个文件的内容：$ paste -s file.a file.b file.c A one A two A three B one B two B three B four C one C two C thee C four C five 使用 join合并文件的另一个命令是 join。join 命令让你能基于一个共同字段合并多个文件的内容。例如，你可能有一个包含一组同事的电话的文件，其中，而另一个包含了同事的电子邮件地址，并且两者均按个人姓名列出。你可以使用 join 创建一个包含电话和电子邮件地址的文件。一个重要的限制是文件的行必须是相同的顺序，并在每个文件中包括用于连接的字段。这是一个示例命令：$ join phone_numbers email_addresses Sandra 555-456-1234 bugfarm@gmail.com Pedro 555-540-5405 John 555-333-1234 john_doe@gmail.com Nemo 555-123-4567 cutie@fish.com 在本例中，即使缺少附加信息，第一个字段（名字）也必须存在于每个文件中，否则命令会因错误而失败。对内容进行排序有帮助，而且可能更容易管理，但只要顺序一致，就不需要这么做。总结在 Linux 上，你有很多可以合并和排序存储在单独文件中的数据的方式。这些方法可以使原本繁琐的任务变得异常简单。via: https://www.networkworld.com/article/3570508/merging-and-sorting-files-on-linux.html作者：Sandra Henry-Stocker 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
使用合适的命令，你可以快速了解 Linux 系统上使用的命令以及执行的频率。汇总 Linux 系统上使用的命令只需一串相对简单的命令以及几条管道将它们绑定在一起。当你的历史记录缓冲区保留了最近的 1,000 或 2,000 条命令时，总结你的命令活动可能会变得很乏味。这篇文章提供了一种方便的方法来汇总命令的使用情况，并高亮显示最常用的命令。首先，请记住，典型的命令历史记录可能看起来像这样。请注意，命令是显示在命令序列号之后，并紧跟其参数。91 sudo apt-get install ccrypt ^ +-- command 请注意，history 命令遵循 HISTSIZE 的设置，这会决定保留多少条命令。可能是 500、1,000 或更多。如果你不喜欢它的设置，那么可以在 .bashrc 或其他启动文件中添加或更改 HISTSIZE 设置。$ echo $HISTSIZE 1000 $ history | wc -l 1000 $ grep HISTSIZE ~/.bashrc # for setting history length see HISTSIZE and HISTFILESIZE in bash(1) HISTSIZE=1000 记下大量命令的主要好处之一是，它可以让你轻松地重新运行过去使用的命令，而不必重新输入或记住它们。它还能让你轻松地查看你在一个任务中已经做了多少工作。单独使用 history 命令时，你会看到类似下面这样，最早的在最前面：$ history 7 vi tasks 8 alias 9 echo $HISTTIMEFORMAT 10 history 11 date … 查看最新使用命令需要查看记录的命令的尾部：$ history | tail -4 1007 echo $HISTSIZE 1008 history | wc -l 1009 history 1010 history | tail -4 另外，你可以使用 tail 命令查看 .bash_history 文件的尾部，但是 history 命令显示的数字可以让你输入如 !1010 这样的数字重新运行命令，这点通常更有用。要提供已使用命令的汇总（例如 vi 和 echo），你可以首先使用 awk 将命令与 history 中保存的其他信息分隔开来：$ history | awk '{print $2}' vi alias echo history date … 如果你将历史记录中的命令列表传递给 sort 命令以按字母顺序对命令进行分组，那么会得到以下内容：$ history | awk '{print $2}' | sort 7z 7z alias apropos cd cd … 接下来，将 sort 命令的输出传递给 uniq -c ，这将计算每个命令使用了多少次：$ history | awk '{print $2}' | sort | uniq -c 2 7z 1 alias 2 apropos 38 cd 21 chmod … 最后，添加第二个 sort 命令按倒序对命令组计数进行排序，这将先列出最常用的命令：$ history | awk '{print $2}' | sort | uniq -c | sort -nr 178 ls 95 vi 63 cd 53 sudo 41 more … 这样可以让你了解使用最多的命令，但不会包括任何你可能故意从历史记录文件中删除的命令，例如：HISTIGNORE="pwd:clear:man:history" 当修改了历史记录格式时对于默认的历史记录格式，history 命令输出中的第一个字段将是每个命令的序号，第二个字段是使用的命令。因此，上面所有 awk 命令都设置成显示 $2。$ alias cmds='history | awk '\''{print $2}'\'' | sort | uniq -c | sort -nr' 如果你像下面那样将日期和时间添加了到 history 命令中，那么你还必须修改所设置的别名：$ echo $HISTTIMEFORMAT %d/%m/%y %T 这个日期/时间信息有时会很有帮助，但是这意味着你必须在选择 history 命令的第 4 个字段而不是第 2 个字段来汇总命令，因为你的历史记录条目将如下所示：91 05/07/20 16:37:39 sudo apt-get install ccrypt ^ +-- command 因此，在将 $2 变为 $4 之后，用于检查 history 命令的别名将改为这样：$ alias cmds='history | awk '\''{print $4}'\'' | sort | uniq -c | sort -nr' 可将别名保存在 .bashrc 或其他启动文件中，请确保在 $ 符号前面插入反斜杠，以便 bash 不会尝试解释 $4。alias cmds='history | awk '\''{print \$2}'\'' | uniq -c | sort -nr' alias cmds='history | awk '\''{print \$4}'\'' | uniq -c | sort -nr' 请注意，日期和时间信息与命令本身保存在历史记录文件的不同行中。因此，添加此信息后，bash 历史记录文件的行数将增加一倍，尽管在 history 命令输出时不会：$ wc -l .bash_history 2000 .bash_history $ history | wc -l 1000 总结你可以随时决定要保留多少命令历史记录，哪些命令不值得记录，以使你的命令摘要最有用。via: https://www.networkworld.com/article/3567050/summarizing-your-command-usage-on-linux.html作者：Sandra Henry-Stocker 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出