0%

linux中最常用的帮助命令

仅个人想法,会持续不间断更新和改进。

Linux有好几个关于帮助的命令,可以让我们在不上网的情况下获取一些丰硕的信息。

唯一的要求就是英语好一些,唯二的情况就是不确定的情况下在此确认后再执行。


此man非man的意思

首先,这man是什么意思?

最开始很多人认为是不知道这个什么意思,找man呀。

其实man是manual的缩写,也就是手册的意思。

man命令提供了系统命令的详细帮助信息。

Linux提供了丰富的帮助手册,当你需要查看某个命令的参数时不必到处上网查找,只要man一下即可。这个也是每个程序员必备的功能,在没有网络的情况下,man能解决很多问题和疑惑。

看一下官方定义:

Man - format and display the on-line manual pages

man 的格式

如果要读懂并使用man,首先需要了解man命令输出的格式,下面的几个是比较常用且需要注意的:

同时也可以使用man man 查看man的使用方法。

章节 含义
NAME 命令名称及功能简要说明
SYNOPSIS 用法说明,包括可用的选项
DESCRIPTION 命令功能的详细说明,可能包括每一个选项的意义
OPTIONS 每一选项的意义
EXAMPLES 一些使用示例

man的操作

比如输入man ls 后,跳出下面的内容:

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
LS(1)                                               User Commands                                              LS(1)

NAME
ls - list directory contents

SYNOPSIS
ls [OPTION]... [FILE]...

DESCRIPTION
List information about the FILEs (the current directory by default). Sort entries alphabetically if none of
-cftuvSUX nor --sort is specified.

Mandatory arguments to long options are mandatory for short options too.

-a, --all
do not ignore entries starting with .

-A, --almost-all
do not list implied . and ..

--author
with -l, print the author of each file

-b, --escape
print C-style escapes for nongraphic characters

--block-size=SIZE
scale sizes by SIZE before printing them; e.g., '--block-size=M' prints sizes in units of 1,048,576
bytes; see SIZE format below

-B, --ignore-backups
Manual page ls(1) line 1 (press h for help or q to quit)

此时可以通过空格键或者回车键来向后翻屏或者翻页,可以使用b或者k向前查看。

 查看关键词时可以使用:

/关键词 向后查找 n:下一个

?关键词 向前查找 N:前一个

可以通过q来退出。

ls后面还有一个(1),详细的解释可以参考《Linux 安装 man 帮助程序》

类似于whatis命令

man有个参数为-f,就是whatis的功能,比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ man -f ls cd file cat more less
ls (1) - list directory contents
ls (1p) - list directory contents
cd (1) - bash built-in commands, see bash(1)
cd (1p) - change the working directory
cd (n) - Change working directory
file (1) - determine file type
file (1p) - determine file type
file (n) - Manipulate file names and attributes
cat (1) - concatenate files and print on the standard output
cat (1p) - concatenate and print files
more (1) - file perusal filter for crt viewing
more (1p) - display files on a page-by-page basis
less (1) - opposite of more
less (3pm) - perl pragma to request less of something

与whatis命令完全一致

类似于apropos命令

man有个参数为-k,就是apropos的功能,比如:

1
2
3
4
5
6
7
8
9
10
11
$ man -k  who
at.allow (5) - determine who can submit jobs via at or batch
at.deny (5) - determine who can submit jobs via at or batch
btrfs-filesystem (8) - command group of btrfs that usually work on the whole filesystem
docker-trust-signer (1) - Manage entities who can sign Docker images
ipsec_newhostkey (8) - generate a new raw RSA authentication key for a host
ipsec_showhostkey (8) - show host's authentication key
w (1) - Show who is logged on and what they are doing.
who (1) - show who is logged on
who (1p) - display who is on the system
whoami (1) - print effective userid

与apropos命令完全一致

使用man的小技巧

如果遇到一个不熟悉或者完全不知道的命令,此时可以通过下面的3个步骤来了解:

  1. 首先用man -k command 查询所有类似帮助文件信息,或许有可能就能找到你需要的信息;
  2. 然后man -f command 查询以command开始的相关帮助信息列表
  3. man N command 通过直接定位N获得详细帮助信息

你是干什么的 whatis

其实整个命令已出现,你的脑海里面应该浮现的是:

What is your name?

如题所述,这个命令用于查询一个命令到底执行了什么功能,并将查询的结果输出出来,相当于man的一个选项-f

whatis的官方定义为:

whatis - display manual page descriptions

仅仅提供一个比较简单的命令描述.

使用方法也比较简单,如下:

1
$ whatis [options] name

其中的name可以是Linux命令、系统调用、库函数、系统等等内容

以前面的命令为例,执行如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ whatis ls cd file cat more less
ls (1) - list directory contents
ls (1p) - list directory contents
cd (1) - bash built-in commands, see bash(1)
cd (1p) - change the working directory
cd (n) - Change working directory
file (1) - determine file type
file (1p) - determine file type
file (n) - Manipulate file names and attributes
cat (1) - concatenate files and print on the standard output
cat (1p) - concatenate and print files
more (1) - file perusal filter for crt viewing
more (1p) - display files on a page-by-page basis
less (1) - opposite of more
less (3pm) - perl pragma to request less of something

可以看到whatis是支持同时查询多个命令的

拓展

whatis可以通过-w-r以及-C等选项来设定通配符、正则表达式以及配置文件等等,不过最简单的还是简单查看一个命令的简单描述,其他的可以交给man来处理。

指定目录的定位 whereis

Linux whereis 命令用于定位查找一个命令的二进制、源文件或帮助文件。

不过这些文件一般是位于特定目录的。

其他的程序定位可以考虑使用locate命令。

官方的定义为:

whereis - locate the binary, source, and manual page files for a command

使用语法

使用语法如下:

1
$ whereis [options] [-BMS directory... -f] name...

其他的选项可以为:

  • -b : 查找二进制文件

  • -m:查找手册

  • -s:查找源文件

  • -B <directory>  在设置的目录下查找二进制文件。

  • -M <directory>  在设置的目录下查找说明文件。

  • -S <directory>  在设置的目录下查找原始代码文件。

实例

比如查找bash的位置,输入如下命令:

1
2
$ whereis bash
bash: /usr/bin/bash /etc/bash.bashrc /usr/share/man/man1/bash.1.gz

可以看到,以上的输出信息从左至右分别为程序名、bash路径、bash的man帮助手册路径。

单独查找文件

可以通过不同的参数来查找不同的文件,如下:

1
2
3
4
5
6
7
8
9
10
11
# 查找二进制文件
$ whereis -b bash
bash: /usr/bin/bash /etc/bash.bashrc

# 查找帮助文件
$ whereis -m bash
bash: /usr/share/man/man1/bash.1.gz

# 查找源文件
$ whereis -s bash
bash:

刚刚好合适的 apropos 命令

apropos的中文含义就是恰好的、合适的,奈何这个单词或者命令确实不好记,当然是可以扩充词汇量的。

什么时候会用到这个命令呢,先看看这个命令的定义。

apropos 命令的官方定义为:

search the manual page names and descriptions

意思很明显,如果我不记得命令或者不知道该用什么命令的时候,可以通过关键词来索引查找这些命令,比如我们想用linux绘制图像,但是不知道什么命令,测试可以使用:

1
2
3
4
5
6
$ apropos plot

bno_plot (1) – generate interactive 3D plot of IO blocks and sizes
gnuplot (1) – an interactive plotting program
pbmtoplot (1) – convert a PBM image into a Unix 'plot' file

或许每个人的输出不同,这个主要取决于安装的软件包和索引的数据库。以上。

再来一个实例,这个应该大部分的都类似:

1
2
3
4
5
6
7
8
9
10
11
12
$ apropos who

at.allow (5) - determine who can submit jobs via at or batch
at.deny (5) - determine who can submit jobs via at or batch
btrfs-filesystem (8) - command group of btrfs that usually work on the whole filesystem
docker-trust-signer (1) - Manage entities who can sign Docker images
ipsec_newhostkey (8) - generate a new raw RSA authentication key for a host
ipsec_showhostkey (8) - show host's authentication key
w (1) - Show who is logged on and what they are doing.
who (1) - show who is logged on
who (1p) - display who is on the system
whoami (1) - print effective userid

这个命令平时用的不多,跟whatis类似,因为这些功能都被加到了包罗万象的man命令。


Linux最有趣的几个命令

仅个人想法,会持续不间断更新和改进。

这次介绍一些好玩有趣的命令,不过说实话,实用性倒不是很大,纯粹好玩,给单调的命令行界面增加了一些童趣和欢乐。


命运的小火车sl

发现这个命令是在输入ls命令的时候,一不小心敲反了,直接命运的小火车开始跑了起来。

sl 是一个 “Steam Locomotive” 的缩写,它会显示一个老式的蒸汽火车在终端中穿梭。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ sl


( ) (@@) ( ) (@) () @@ O @ O @ O
@)




______ ___________
\__I_I_____===__|_________|
______/ | | =|___ ___| _________________
| | | ||_| |_|| _| \_____A
__--------------------| [___] | =| |
__|_____/[][]~\_______| | -| |
-I_____I [][] [] D |=======|____|________________________|_
=====O=====O\ ____Y___________|__|__________________________|_
|| || |_____/~\___/ |_D__D__D_| |_D__D__D_|
/ \__/ \__/ \_/ \_/ \_/ \_/ \_/


点亮终端的艺术之光figlet

在Linux的世界中,figlet是一个神奇的命令,可以将文字艺术化.

特别适合作为标题、口号或者问候语,还有很多软件程序的招呼语,也可以用这个来实现。

比如:

1
2
3
4
5
6
7
$ figlet HELLO          
_ _ _____ _ _ ___
| | | | ____| | | | / _ \
| |_| | _| | | | | | | | |
| _ | |___| |___| |__| |_| |
|_| |_|_____|_____|_____\___/

活灵活现的终端:发掘cowsay

cowsay顾名思义就是一头牛为你加持,一款让命令行界面生动有趣的工具。

cowsay 可说话、可思考,与fortune加持更可以变为一头睿智的牛。

该命令接受一个文本字符串,并输出一个牛说话的图形。

下面是一头牛在说它喜欢 Linux:

1
2
3
4
5
6
7
8
9
$  cowsay I love linux.
_______________
< I love linux. >
---------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||

探索Linux世界的智慧——fortunes命令

在Linux中,有一条神奇的命令连接着智慧与幽默,那就是fortunes命令。

看似普通的指令,背后却藏匿着千言万语,无论是名人箴言还是妙趣横生的笑话,在这里都能找到它们的踪迹。

另外最重要的,还可以根据自己的需求进行增删,目前就用基于唐诗宋词的库。

fortune并非只是简单的一句话,而是承载着古今中外智慧的涌泉。

每次执行,它都会带来截然不同的感受。或许是一位哲人的深刻格言,或是一句调皮的笑话,或者唐诗,或者宋词,与先贤对话,岂不快哉。

最简单的方法就是把这个命令,加到.bashrc文件中,每次启动,总会有触动。

1
2
3
4
5
6
7
8
9
10
$ fortune 
何以称英雄?识以领其先

    - 清·袁枚
$ fortune
一件作品的固有力量从来不会被长期地埋没或禁锢。一件艺术品可能被时间遗忘,可能遭到查禁,可能被埋进棺材,但威力强大的东西总要战胜没有过大前途的东西。

    - 茨威格
$ fortune
Yow! We're going to a new disco!

缤纷绚烂的终端体验:探索lolcat

lolcat是一款让终端从黑白灰变得缤纷多彩的神奇工具。

通过将文字渲染成彩虹般的颜色,让你的终端充满欢乐与活力。

可以把这个命令替换掉cat,这样你的内容都灵动了起来

比如lolcat /etc/resolv.conf会生成如下信息:

进入数字的魔幻世界:探秘cmatrix

来到黑客帝国的命令cmatrix,这不仅仅是一串字符在终端中的运动,它仿佛是数字的舞蹈,变幻着无穷的图案。从绿色的数字雨到模拟Matrix电影的效果,cmatrix让我们进入了数字的奇妙世界。

显示系统风貌的screenfetch命令

screenfetch命令的神奇之处在于其简单而又直观的功能,该命令能够快速地收集系统信息并以一种富有个性的方式展示出来。

从使用的发行版到内核版本,再到处理器和内存,一目了然地展现系统的全貌。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ screenfetch
./+o+- oper@localhost
yyyyy- -yyyyyy+ OS: Ubuntu
://+//////-yyyyyyo Kernel: aarch64 Linux 6.4.16-linuxkit
.++ .:/++++++/-.+sss/` Uptime: 33m
.:++o: /++++++++/:--:/- Packages: 134
o:+o+:++.`..```.-/oo+++++/ Shell: bash 5.1.16
.:+o:+o/. `+sssoo+/ Disk: 32G / 59G (57%)
.++/+:+oo+o:` /sssooo. CPU: 12x Apple
/+++//+:`oo+o /::--:. RAM: 877MiB / 7844MiB
\+/+o+++`o++o ++////.
.++.o+++oo+:` /dddhhh.
.+.o+oo:. `oddhhhh+
\+.++o+o``-````.:ohdhhhhh+
`:o+++ `ohhhhhhhhyo++os:
.o:`.syhhhhhhh/.oo++o`
/osyyyyyyo++ooo+++/
````` +oo+++o\:
`oo++.

Linux最常用的硬件相关的命令

仅个人想法,会持续不间断更新和改进。

怎么忽然来硬的呢,因为在Linux的世界中,系统是灵活,但是骨架同样重要。

而跟踪确认硬件信息对于我们同样重要。

同时还增加了系统的关机。


查看块设备的lsblk

lsblk 命令可以查看系统中的块设备信息

1
$ lsblk

这个命令会列出系统中所有的块设备(比如硬盘、分区和挂载点)的信息。

默认情况下,它会显示每个设备的名称、大小、类型、挂载点等信息。

如果需要显示更详细的信息,可以使用 -a--all 选项:

1
$ lsblk -a

这会显示完整的块设备信息,包括未挂载的设备。

当然,还可以根据需求,定制化输出,不过单单这个命令,足矣。

显示管理磁盘分区 fdisk

fdisk是用于检查一个磁盘上分区信息最通用的命令。

fdisk可以显示分区信息及一些细节信息,比如文件系统类型等。

设备的名称通常是/dev/sda、/dev/sdb 等。

对于以前的设备有可能还存在设备名为 /dev/hd* (IDE)的设备,这个设备逐步淘汰了。

fdisk也可以用于创建并操控分区表信息,支持主任GPU、MBR、Sun、SGI和BSD。

块设备可以划分为一个或多个称为分区的逻辑磁盘。这种划分的记录会保存在分区表,通常位于磁盘的第 0 扇区。

fdisk的官方解释为:

fdisk - manipulate disk partition table

语法格式为:

1
2
3
$ fdisk [options] device

$ fdisk -l [device...]

其中一些常用的参数为:

  • -l 列出指定的外围设备的分区表状况
  • -L, --color[=when] :将输出颜色化,其中when可以指定为auto, never or always. 默认为 auto.

显示当前系统的分区情况

这个也是我唯一推荐入门者使用的 命令,仅仅list显示出目前的系统分区。

万万不要输入fdisk执行其他操作,极易格式化硬盘,切记切记。

1
2
3
4
5
6
7
8
9
$ fdisk -l
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.

Disk /dev/sda: 256.1 GB, 256060514304 bytes, 500118192 sectors # 磁盘空间及扇区信息
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: gpt
Disk identifier: FAF37680-0ECE-4BE7-93FC-E87A8F2F6455

显示硬件信息的hwinfo

hwinfo 又一个用于显示硬件信息的命令。

可以获得 Linux 系统的各种硬件组件(如CPU、内存、显卡、硬盘等)的详细信息。

显示所有硬件信息

1
sudo hwinfo

列出系统上几乎所有可用硬件的详细信息。

指定特定硬件信息

1
2
3
4
sudo hwinfo --cpu
sudo hwinfo --memory
sudo hwinfo --gfxcard
sudo hwinfo --disk

通过在命令后添加 --cpu--memory--gfxcard--disk 等参数,获取特定硬件的信息。

列出系统硬件信息的lshw

lshwHardware Lister 的缩写,直面意思即列出系统硬件信息。

可以显示关于计算机硬件组件(如处理器、内存、硬盘、网卡等)的详细信息,对于系统管理员和用户来说是一个非常有用的工具。

显示所有硬件信息

任何参数都不加的话,可用,信息极多,但是可用信息不多。

1
sudo lshw

这将输出系统中所有可用硬件的详细信息,包括硬件组件的制造商、型号、驱动程序等。

查看摘要硬件信息

显示摘要信息:相对而言,这个反而好一些,简单的就是有用的

1
sudo lshw -short

这将显示硬件的摘要信息,包括设备名、类别、描述等。

查看特定硬件信息(如网络、内存、硬盘等设备)

显示指定类型的硬件信息

1
sudo lshw -C network

上述示例将仅显示网络相关的硬件信息。

比如还可以查看memorycpudisk等信息。

lshw提供了全面的硬件信息,帮助用户了解系统配置和硬件组件的细节。在查看和诊断硬件问题或了解系统配置时,它是一个非常有用的工具。

放空一下自我 free

**free**这个命令在Linux系统监控的工具里面,算是使用的比较多的一个。

使用_man_查看可知,官方含义为:

Display amount of free and used memory in the system

也就是显示可用、易用的系统内存,它直接读取/proc/meminfo文件。

默认的效果

先看下不加任何参数的时候,free的效果:

1
2
3
4
$ free
total used free shared buff/cache available
Mem: 32664832 15667736 674136 464892 16322960 15803156
Swap: 16449532 3039756 13409776

看起来很多的样子,但是不直观,我比较喜欢加上-h参数。

使用易读的参数

-h参数,跟前面的df等命令类似,此处的h表示_human being_的含义方便人类阅读。 除了这个还有_-b,-k,-m,-g_,含义分别为按照_字节、KB、MB、GB_的格式来显示。

1
2
3
4
5
$ free -h
total used free shared buff/cache available
Mem: 31G 14G 655M 453M 15G 15G
Swap: 15G 2.9G 12G

Wow,此时的显示简直好简洁。

说下其中的含义:

  • total : 表示总的物理内存大小,比如上面的就表示31GB的内存

  • used :表示已经使用的内存大小,比如上面的就是使用了14GB

  • free :表示可用多少

  • shared:表示多个进程共享的内存大小

  • buff/cache:表示磁盘缓存的大小,这里有两个方面,buffcache,两个的含义不同

    • buff :something that has yet to be ‘writeen’ to disk ,还没有写入磁盘
    • cache: something that had been ‘read’ from the disk and store for later user,从磁盘读取的方便下一次使用
    • 这里就设计到Linux的设计哲学,比如读取一个100G的文件,第一次所使用的时间总归是后面再次读取的时间的好几倍,当然前提是没有释放掉caches
  • available:当然含义为可用的内存容量大小

间隔显示内存状态

还有一个比较常用的就是,如果你希望过一段时间就看下free的情况,OK,使用参数-s,后面跟的单位是秒,也就是每个几秒,统计一下使用的内存情况,比如我们每个2s,显示一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ free -s 2
total used free shared buff/cache available
Mem: 32664832 15668528 670964 464892 16325340 15802360
Swap: 16449532 3039756 13409776

total used free shared buff/cache available
Mem: 32664832 15669760 669724 464892 16325348 15801124
Swap: 16449532 3039756 13409776

total used free shared buff/cache available
Mem: 32664832 15670220 669248 464892 16325364 15800652
Swap: 16449532 3039756 13409776

total used free shared buff/cache available
Mem: 32664832 15669264 670204 464892 16325364 15801624
Swap: 16449532 3039756 13409776

查看meminfo文件

1
$ cat /proc/meminfo

其实free读取的就是这个文件的某些信息,可以通过同步监控这个文件来check free的状态。

显示CPU架构的有关信息 lscpu

Linux的CPU设备查看器。lscpu命令用来显示cpu的相关信息。
lscpusysfs/proc/cpuinfo收集cpu体系结构信息,命令的输出比较易读 。
命令输出的信息包含cpu数量,线程,核数,socket和Nom-Uniform Memeor Access(NUMA),缓存等等。

官方定义为:

lscpu - display information about the CPU architecture

参数基本用处不大,默认即可,部分参数可以查看offline和online的设备信息。

默认实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ lscpu
Architecture: x86_64 #架构信息
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 64 #逻辑cpu颗数
On-line CPU(s) list: 0-63
Thread(s) per core: 2 #每个核心线程
Core(s) per socket: 16 #每个cpu插槽核数/每颗物理cpu核数
Socket(s): 2 #cpu插槽数
NUMA node(s): 2
Vendor ID: GenuineIntel #cpu厂商ID
CPU family: 6 #cpu系列
Model: 63 #型号
Model name: Intel(R) Xeon(R) CPU E5-2698 v3 @ 2.30GHz
Stepping: 2 #步进
CPU MHz: 1290.335 #cpu主频
BogoMIPS: 4604.47
Virtualization: VT-x #cpu支持的虚拟化技术
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 40960K
NUMA node0 CPU(s): 0-15,32-47
NUMA node1 CPU(s): 16-31,48-63

其中几个概念需要理解清楚,基本比较重要的都有了备注。

其中第一个为CPU(s),这个值为Socket * Core * Thread得出,也就是逻辑的CPU个数。

1
2
3
4
5
CPU(s):                64   #逻辑CPU数
On-line CPU(s) list: 0-63
Thread(s) per core: 2
Core(s) per socket: 16
socket: 2

而其他几个概念为:

  • Socket : 物理上的CPU插槽的数量,也就是物理的实体概念
  • Core:即平常说的单核、多核、四核等,即每个CPU上的核数
  • Thread:每个core上的线程数,即超线程。

lspci 显示当前设备的PCI总线信息

lspci命令用于显示PCI总线的信息,以及所有已连接的PCI设备信息。

官方定义为:

lspci - list all PCI devices

默认情况下,lspci会显示一个简短的设备列表。 使用使用一些参数来显示更详细的输出或供其他程序解析的输出。

不过需要注意的是,在许多操作系统上,对 PCI 配置空间的某些部分的访问仅限于 root,因此普通用户可用的 lspci 功能受到限制。

使用方法为:

1
$ lspci [options]

其中常用的三个选项为:

  • -n 以数字方式显示PCI厂商和设备代码
  • -t 以树状结构显示PCI设备的层次关系
  • -v 显示更详细的输出信息

显示当前主机的所有PCI总线信息:

默认无参数的显示

1
2
3
4
5
6
7
8
9
10
11
$ lspci
00:00.0 Host bridge: Intel Corporation Xeon E7 v3/Xeon E5 v3/Core i7 DMI2 (rev 02)
00:01.0 PCI bridge: Intel Corporation Xeon E7 v3/Xeon E5 v3/Core i7 PCI Express Root Port 1 (rev 02)
00:02.0 PCI bridge: Intel Corporation Xeon E7 v3/Xeon E5 v3/Core i7 PCI Express Root Port 2 (rev 02)
00:03.0 PCI bridge: Intel Corporation Xeon E7 v3/Xeon E5 v3/Core i7 PCI Express Root Port 3 (rev 02)
00:03.2 PCI bridge: Intel Corporation Xeon E7 v3/Xeon E5 v3/Core i7 PCI Express Root Port 3 (rev 02)
00:04.0 System peripheral: Intel Corporation Xeon E7 v3/Xeon E5 v3/Core i7 DMA Channel 0 (rev 02)
00:04.1 System peripheral: Intel Corporation Xeon E7 v3/Xeon E5 v3/Core i7 DMA Channel 1 (rev 02)
00:04.2 System peripheral: Intel Corporation Xeon E7 v3/Xeon E5 v3/Core i7 DMA Channel 2 (rev 02)
......

以数字方式显示PCI厂商和设备代码

以数字形式显示

1
2
3
4
5
6
7
8
9
10
$ lspci -n
00:00.0 0600: 8086:2f00 (rev 02)
00:01.0 0604: 8086:2f02 (rev 02)
00:02.0 0604: 8086:2f04 (rev 02)
00:03.0 0604: 8086:2f08 (rev 02)
00:03.2 0604: 8086:2f0a (rev 02)
00:04.0 0880: 8086:2f20 (rev 02)
00:04.1 0880: 8086:2f21 (rev 02)
00:04.2 0880: 8086:2f22 (rev 02)
......

同时显示数字方式还有设备代码信息

1
2
3
4
5
6
7
8
9
10
$ lspci -nn
00:00.0 Host bridge [0600]: Intel Corporation Xeon E7 v3/Xeon E5 v3/Core i7 DMI2 [8086:2f00] (rev 02)
00:01.0 PCI bridge [0604]: Intel Corporation Xeon E7 v3/Xeon E5 v3/Core i7 PCI Express Root Port 1 [8086:2f02] (rev 02)
00:02.0 PCI bridge [0604]: Intel Corporation Xeon E7 v3/Xeon E5 v3/Core i7 PCI Express Root Port 2 [8086:2f04] (rev 02)
00:03.0 PCI bridge [0604]: Intel Corporation Xeon E7 v3/Xeon E5 v3/Core i7 PCI Express Root Port 3 [8086:2f08] (rev 02)
00:03.2 PCI bridge [0604]: Intel Corporation Xeon E7 v3/Xeon E5 v3/Core i7 PCI Express Root Port 3 [8086:2f0a] (rev 02)
00:04.0 System peripheral [0880]: Intel Corporation Xeon E7 v3/Xeon E5 v3/Core i7 DMA Channel 0 [8086:2f20] (rev 02)
00:04.1 System peripheral [0880]: Intel Corporation Xeon E7 v3/Xeon E5 v3/Core i7 DMA Channel 1 [8086:2f21] (rev 02)
00:04.2 System peripheral [0880]: Intel Corporation Xeon E7 v3/Xeon E5 v3/Core i7 DMA Channel 2 [8086:2f22] (rev 02)
......

以树状结构显示PCI设备的层次关系:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ lspci -t
lspci -t
-+-[0000:ff]-+-08.0
| +-08.2
| +-1f.0
| \-1f.2
+-[0000:80]-+-01.0-[81]----00.0
| +-04.0
| +-05.1
| +-05.2
| \-05.4
+-[0000:7f]-+-08.0
| +-08.2
| +-0c.1
\+-0c.2

Linux reboot/poweroff/halt 命令

Linux halt, poweroff, reboot 用来挂起、关机或者重启机器,成功后返回0。

这不是一个命令,这是三个命令,只不过三个命令的参数都是一致的。

官方定义为:

halt, poweroff, reboot - Halt, power-off or reboot the machine

其实这三个命令都可以通过shutdown来执行,并且相对而言shutdown的参数还更多一些。

语法

使用方法如下:

1
2
3
4
5
$ halt [OPTIONS...]

$ poweroff [OPTIONS...]

$ reboot [OPTIONS...]

参数如下所示:

  • --halt 将机器挂起,三个命令均相同
  • -p, --poweroff 将机器关机,三个命令均相同
  • --reboot 将机器重启,三个命令均相同
  • -f, --force 立即执行挂起、关机和重启,一般对于force而言,除非万不得已,否则进来莫用
  • -n, --no-sync 在挂起、关机或重启前不对硬盘进行同步,这个很危险呀,进来不要用呀
  • --no-wall 在挂起、关机或重启前不发送警告信息,对于多用户不友好

立即关机

接下来的三个命令一致,都是将电脑关机,不过这个用法总归感觉怪怪的,所以还是分开各司其职比较好。比如关机还是poweroff,重启还是reboot吧。

1
2
3
4
5
$ halt --poweroff

$ poweroff --poweroff

$ reboot --poweroff

Linux最常用的几个软件包管理命令

仅个人想法,会持续不间断更新和改进。

软件安装,应该算是Linux系统中最常见的操作之一,而软件包管理命令,也是我们在Linux系统中最常用的命令之一。

但凡系统安装好以后,第一件事情就是更新软件包,然后安装自己需要的软件包,这是一个很常见的操作。

Linux不同与Windows,直接下载一个exe文件双击就可以安装,Linux系统需要命令行来安装软件包,这是一个很大的区别。

而用于安装、更新、删除软件包,以及管理系统的软件包又由于不同的Linux发行版,由不同的方式,比如aptyumdpkgrpm等。


软件管理利器 - Debian系的apt

对于最常用的命令而言,apt可能排不上号,但是,在新安装的系统中,apt 命令绝对应该是排在前十位的存在,所以apt是管理 Debian 系列系统中软件包的必备工具。

apt - command-line interface

apt是Advanced Package Tool的缩写,恰如字面描述高级包工具apt 命令是用于 Debian 系列 Linux 发行版的强大工具,比如广为人知的Ubuntu,还有超赞桌面的Linux Mint。

apt使得处理软件包,比如安装、更新和删除软件包的过程特别丝滑,也结合了较早的工具如 apt-getapt-cache 的功能,提供了更友好的交互体验。

更新软件包列表

在安装或升级软件包之前,可以更新软件包列表,以确保拥有可用软件包的最新信息。

使用以下命令:

1
$ sudo apt update

此命令从配置的仓库中获取最新的软件包信息。

升级软件包

要将所有已安装的软件包升级到最新版本,可以使用:

1
$ sudo apt upgrade

要进行更全面的升级,包括删除旧软件包和安装新依赖项,请使用:

1
$ sudo apt full-upgrade # 特别留意,这个会把老版本给删除

安装软件包

apt 命令使得软件包安装变得非常简单。要安装一个软件包,只需要使用:

1
$ sudo apt install <软件包名称>

例如,要安装文本编辑器瑞士军刀 vim,您可以运行:

1
$ sudo apt install vim

删除软件包

卸载软件包同样简单。要删除一个软件包,使用:

1
$ sudo apt remove <软件包名称>

如果您想删除软件包及其配置文件,使用:

1
$ sudo apt purge <软件包名称>

搜索软件包

要查找某个软件包,可以使用关键词进行搜索:

1
$ apt search <关键词>

例如,要搜索与 “python” 相关的软件包,您可以运行:

1
$ apt search python

显示软件包信息

要查看特定软件包的详细信息,使用:

1
$ apt show <软件包名称>

此命令提供软件包描述、依赖关系和版本信息等详细信息。

清理

随着时间的推移,积累过时的软件包和缓存文件。要清理不必要的软件包,使用:

1
$ sudo apt autoremove

要清除本地存储库中获取的包文件,使用:

1
$ sudo apt clean

管理仓库

apt 获取软件包信息的仓库列表存储在 /etc/apt/sources.list/etc/apt/sources.list.d/ 目录下的文件中。

要添加新的仓库,可以直接编辑这些文件或使用 add-apt-repository 命令:

1
$ sudo add-apt-repository ppa:<仓库名称>

添加仓库后,需要更新软件包列表才能使用:

1
$ sudo apt update

红帽系的软件管理利器 - yum

.. note::
当年不肯嫁春风,无端却被秋风误。
贺铸《芳心苦·杨柳回塘》

我从ubuntu开始,后面短暂切换到Fedora,然后切换到CentOS,在CentOS断更之前,再无改变,所以最了解的还是yum命令了。

官方定义为:

yum - Yellowdog Updater Modified

说实话,yum跟yellowdog感觉半毛线关系都没有,那为什么有这个名字呢?

其实曾经有一个基于PowerPC架构的Linux发行版,名为Yellow Dog Linux。

yum的名字即来源于此,且为其改进版本。

yum是一个强大的包管理工具,常用于 Red Hat 系的 Linux 发行版,如 CentOS、Fedora 和 RHEL。

它简化了安装、更新、删除和管理软件包的过程。

基本其他基于RPM的Linux发行版也使用这个命令。

其他列出了一些常用和不太常用的命令,基本足矣。

安装软件包

使用 yum 安装软件包的基本语法是:

1
$ sudo yum install package_name

例如,要安装 wget 软件包,可以使用以下命令:

1
$ sudo yum install wget

yum 会自动解决依赖关系,确保所有必需的软件包都被安装。

更新软件包

保持系统更新对于安全性和性能非常重要。要更新特定的软件包,使用:

1
$ sudo yum update package_name

例如,更新 wget

1
$ sudo yum update wget

要更新所有已安装的软件包,只需运行:

1
$ sudo yum update

删除软件包

如果需要删除一个软件包,语法如下:

1
$ sudo yum remove package_name

例如,删除 wget

1
$ sudo yum remove wget

yum 将处理指定软件包的删除,并删除不再需要的依赖项。

检查可用更新

要检查是否有可用更新而不实际应用它们,使用:

1
$ yum check-update

此命令会列出所有有可用更新的软件包,帮助您决定哪些需要更新。

列出已安装的软件包

要列出系统上所有已安装的软件包,运行:

1
$ yum list installed

此命令提供了当前已安装的所有软件包的详细列表。

搜索软件包

如果不确定软件包的确切名称,可以使用:

1
$ yum search keyword

例如,搜索与 wget 相关的软件包:

1
$ yum search wget

此命令会返回与关键字匹配的软件包列表。

显示软件包信息

要查看特定软件包的详细信息,使用:

1
$ yum info package_name

例如,获取 wget 的信息:

1
$ yum info wget

此命令提供软件包的详细信息,如版本、发布、大小和简短描述。

清理 yum 缓存

随着时间推移,yum 的缓存会增长并占用磁盘空间。要清理缓存,使用:

1
$ sudo yum clean all

此命令会删除缓存数据,释放空间,并确保 yum 获取最新的软件包信息。

管理仓库

yum 使用仓库作为软件包的来源。要列出所有配置的仓库,运行:

1
$ yum repolist

启用特定仓库:

1
$ sudo yum-config-manager --enable repository_name

禁用特定仓库:

1
$ sudo yum-config-manager --disable repository_name

高级用法

安装特定版本的软件包

如果需要安装特定版本的软件包,使用:

1
$ sudo yum install package_name-version

例如,安装 wget1.20 版本:

1
$ sudo yum install wget-1.20

降级软件包

要将软件包降级到以前的版本,使用:

1
$ sudo yum downgrade package_name

组安装

yum 允许您安装为特定目的而设计的一组软件包。例如,安装开发工具组,使用:

1
$ sudo yum groupinstall "Development Tools"

稍显底层的红帽系软件管理工具 - rpm

如果说yum是高大上的软件安装管理工具,那么rpm就是低调奢华的底层工具。

简洁但略显繁琐。

官方定义为:

rpm - RPM Package Manager

其实rpm也可以看作是Redhat Package Manager的缩写,因为rpm也是基本用于Red Hat 系的 Linux 发行版,如 CentOS、Fedora 和 RHEL。

这个命令命令主要用于安装、卸载、升级、查询和验证软件包。所以重点来了,需要软件包

安装软件包

要使用 RPM 安装软件包,基本语法是:

1
$ sudo rpm -ivh package_name.rpm

比如,安装 example.rpm 软件包:

1
$ sudo rpm -ivh example.rpm

其中:

  • -i 表示安装(install)
  • -v 表示详细模式(verbose),显示安装过程的详细信息
  • -h 表示显示进度条(hash),可视化安装进度

升级软件包

要升级已安装的软件包,使用:

1
$ sudo rpm -Uvh package_name.rpm

比如,升级 example.rpm

1
$ sudo rpm -Uvh example.rpm

其中 -U 表示升级(upgrade),如果软件包未安装则进行安装。

删除软件包

要删除已安装的软件包,语法如下:

1
$ sudo rpm -e package_name

比如,删除 example 软件包:

1
$ sudo rpm -e example

其中 -e 表示删除(erase)。

查询软件包

查询已安装的软件包

要查询系统上已安装的软件包,使用:

1
rpm -qa

其中 -q 表示查询(query),-a 表示所有(all)。

查询特定软件包信息

要查看特定软件包的信息,使用:

1
$ rpm -qi package_name

比如,查询 example 软件包的信息:

1
$ rpm -qi example

其中 -i 表示信息(info)。

查询文件属于哪个软件包

要查询系统中文件属于哪个软件包,使用:

1
$ rpm -qf /path/to/file

比如,查询 /usr/bin/example 文件属于哪个软件包:

1
$ rpm -qf /usr/bin/example

其中 -f 表示文件(file)。

验证软件包

要验证已安装的软件包,使用:

1
$ rpm -V package_name

比如,验证 example 软件包:

1
$ rpm -V example

其中 -V 表示验证(verify)。

显示软件包内容

要显示软件包中的文件列表,使用:

1
$ rpm -ql package_name

比如,显示 example 软件包的文件列表:

1
$ rpm -ql example

其中 -l 表示列表(list)。

检查软件包依赖

要检查软件包的依赖关系,使用:

1
$ rpm -qpR package_name.rpm

比如,检查 example.rpm 软件包的依赖关系:

1
$ rpm -qpR example.rpm

其中:
- -p 表示指定包文件(package)。
- -R 表示依赖(requires)。

Linux最危险的几个命令

仅个人想法,会持续不间断更新和改进。

Linux系统中的命令最美妙也最危险。

如果几个操作系统(Windows/MacOSX/Linux)的危险水平有段位,那么Linux应该首当其冲。

如若使用不当,轻则伤筋动骨摔键盘,重则历年数据烟消云散。

本文本着大家熟悉其危险性,尽量避免一些误操作。

为什么Linux最危险呢?那主要是因为root 用户对系统具有绝对的操作权限,可以执行任何命令、任何操作,所以会产生任何后果。

所以在以 root 用户身份进行操作时,尤其一定要特别小心。

如果不确定命令的执行结果,可以在虚拟环境线操作一下,再在生产环境执行。

危险命令介绍

如果单纯按照熟悉或者段位来讲,rm首当其冲,轻则丢点数据,重则系统崩溃。目前看到的很多删库跑路的程序员大多就因为这个。

特别是rm -rf /,不要执行,不要执行,不要执行,重要的事情说三遍,这个命令会导致整个系统被毁坏

随后的应该就是chmod和chown,特别是对于重要的数据,一般建议对于新手而言,仅仅具备只读权限即可;

接下来的dd以及mkfs命令,可能不太常见,但是也具备一定的杀伤力。

fork炸弹暂且不表,总之随便来的命令不要随便执行。


风萧萧兮易水寒,壮士一去兮不复还的 rm 命令。

文件一旦通过rm命令删除,则无法恢复,所以必须格外一定切记小心地使用该命令。

因为发生过很多欲哭无泪的故事。。。

主要的痛点就在如果是在root账户权限下,rm无所不能呀

Linux的 rm 命令

Linux 的 dd 命令

dd这个命令一直没有弄明白缩写的含义,这个命令应该归到Linux炫技里面,因为我也是很晚才用到,不过有些功能还可以尝试一下。

官方含义为:

dd - convert and copy a file

从官方含义来看,是不是定义为cc比较合适,^_^

dd命令用于复制文件,转换或者格式化文件,这里也是危险所在,如果使用dd对设备进行低级别的复制和转换操作时,如果命令行参数错误,可能导致数据丢失。

比如 dd if=/dev/random of=/dev/sda:这个命令将设备(例如硬盘)的内容重写为随机数据,导致设备上所有数据的永久丢失。

mkfs 格式化硬盘分区

万万不要制定了错误的硬盘,切记切记。

这个命令格式化的很彻底。

shutdown

在root账户下,可以直接立即关闭系统,很容易造成数据没有保存,一般需要延迟个1分钟,不要使用shutdown -h now来立即关闭系统。

> file

> file:这个命令会清空文件内容。若对关键的系统文件使用这个命令,可能会破坏系统。

Linux数据处理的几个命令

仅个人想法,会持续不间断更新和改进。

Linux系统中的数据处理,可真假转换,可搜索,需排序、减重复。


真假转换之间 tr

Linux tr 命令用于转换或删除字符。

tr 命令可以从标准输入读取数据,经过字符串转译后,将结果输出到标准输出。

官方定义为:

tr - translate or delete characters

使用方法为:

1
$ tr [OPTION]... SET1 [SET2]

其中常用的三个选项为:

  • -d, --delete:删除指令字符
  • [:lower:] :所有小写字母
  • [:upper:] :所有大写字母
  • [:blank:] :所有空格

a-z小写全部转换为大写

默认无参数的显示

1
2
3
4
5
6
$ echo "Hello World, Welcome to Linux!" | tr a-z A-Z
HELLO WORLD, WELCOME TO LINUX!

# 还有一种方法
$ echo "Hello World, Welcome to Linux!" | tr [:lower:] [:upper:]
HELLO WORLD!

A-Z大写全部转换为小写

默认无参数的显示

1
2
3
4
5
6
$ echo "Hello World, Welcome to Linux!" | tr  A-Z a-z
hello world, welcome to linux!

# 还有一种方法
$ echo "Hello World, Welcome to Linux!" | tr [:upper:] [:lower:]
hello world, welcome to linux!

貌似起名可以用这个

很多变量或者函数起名字都会移除元音字符,可以考虑使用-d参数,如下:

1
2
$ echo "Hello World, Welcome to Linux!" | tr -d a,o,e,i
Hll Wrld Wlcm t Lnux!

不过感觉删除的多了,也不一定是好事。。。

比如里外看Wlcm不晓得啥意思

移除文件中的所有空格

同理,使用-d,结合[:blank:]可以快速删除所有空格。

1
2
$ echo "Hello World, Welcome to Linux!" | tr -d [:blank:]
HelloWorld,WelcometoLinux!

文件内容搜索利器 - grep

Linux grep 命令用于查找文件里符合条件的字符串。

官方定义为:

grep, egrep, fgrep - print lines matching a pattern

grep支持正则表达式,是一个强大的文本搜索工具。

语法

语法也挺复杂,因为功能确实很强大。

1
2
3
$ grep [OPTION...] PATTERNS [FILE...]
$ grep [OPTION...] -e PATTERNS ... [FILE...] # 使用egrep
$ grep [OPTION...] -f PATTERN_FILE ... [FILE...] # 使用fgrep

常用的参数为:

  • -r 或 –recursive : 此参数的效果和指定”-d recurse”参数相同
  • -v 或 –invert-match : 显示不包含匹配文本的所有行
  • -i 或 –ignore-case : 忽略字符大小写的差别
  • -n 或 –line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。

假定有如下3个文件,1个文件夹,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
a
This is a
Hello a

b
this is b
Hello b
c
This is c
Hello c

d/d
This is d
Hello d

默认无参数

在当前目录搜索包含is字符串,可以看到**a/b/c**三个文件均有输出,而d因为是目录,暂时无输出。

1
2
3
4
5
$ grep is *
a:This is a
b:this is b
c:This is c
grep: d: Is a directory

增加文件夹

与其他命令类似,增加-r参数,递归搜索

1
2
3
4
5
$ grep -r is *
a:This is a
b:this is b
c:This is c
d/d:This is d

反向查找

在某些情况下,或许正想找到不包含某些字符串的内容,如下:

1
2
3
4
5
$ grep -rv is *
a:Hello a
b:Hello b
c:Hello c
d/d:Hello d

此时可以看到,不包含is的内容显示了出来。

不区分大小写

而某些情况下,或许我们希望找到不区分大小写的内容,比如对于This/this而言:

1
2
3
4
5
6
7
8
9
10
$ grep -r This *
a:This is a
c:This is c
d/d:This is d

$ grep -ri This *
a:This is a
b:this is b
c:This is c
d/d:This is d

可以看到此时有可能笔误,或者其他原因的b文件已经被找到了。

显示行数,精准定位

如果文件内容比较多,此时显示内容在哪一行,是很重要的,加上-n参数既可解决。

1
2
3
4
$ grep -rn This *
a:1:This is a
c:1:This is c
d/d:1:This is d

没有规矩不成方圆 sort

Linux sort 命令用于将文本内容进行排序。

官方定义为:

sort - sort lines of text files

语法

1
2
$ sort [OPTION]... [FILE]...
$ sort [OPTION]... --files0-from=F

常用的参数为

  • -c 检查文件是否已经按照顺序排序。
  • -u 意味着是唯一的(unique),输出的结果是去完重了的。
  • -r 以相反的顺序来排序。
  • -k field1[,field2] 按指定的列进行排序。

这里假定测试文件名为testfile

1
2
3
4
5
6
7
LiSi            80

ZhangSan 70

WangWu 90

MaLiu 88

默认无参数

在使用 sort 命令以默认的式对文件的行进行排序,命令如下:

1
2
3
4
5
6
7
8
$ sort testfile 



LiSi 80
MaLiu 88
WangWu 90
ZhangSan 70

sort 命令默认情况下将第一列以 ASCII 码的次序排列,并将结果输出到标准输出。

根据第N列排序

对于测试文件而言,或许我们更希望使用数字来统计排序,此时可以使用-k N参数,其中N为列数

1
2
3
4
5
6
7
8
$  sort testfile -k 2



ZhangSan 70
LiSi 80
MaLiu 88
WangWu 90

检查是否已经排序

在某些情况下,或许只想看看文件是否已经排序,使用-c参数 :

1
2
$  sort -c testfile
sort: testfile:2: disorder

如果没有排序会有输出,而排序的话就没有输出。

逆序排列

如果希望看一下数字从高到低的培训,使用-r参数:

1
2
3
4
5
$  sort testfile -k 2  -r
WangWu 90
MaLiu 88
LiSi 80
ZhangSan 70

你是唯一的 uniq

Linux uniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用。

官方定义为:

uniq - report or omit repeated lines

uniq 可检查文本文件中重复出现的行列。

语法

语法比较简单,直接用就可以。

1
$ uniq [OPTION]... [INPUT [OUTPUT]]

常用的参数为:

  • -c--count 在每列旁边显示该行重复出现的次数。

  • -d--repeated 仅显示重复出现的行列。

  • -u--unique 仅显示出一次的行列。

假定有1个文件为testfile,内容如下:

1
2
3
4
5
6
7
8
9
10
11
testfile
Hello 1
Hello 2
Hello 2
Hello 3
Hello 3
Hello 3
Hello 4
Hello 4
Hello 4
Hello 4

默认无参数

使用uniq 命令可以删除重复的行,不管有多少重复的行,仅仅显示一行。

1
2
3
4
5
$  uniq testfile
Hello 1
Hello 2
Hello 3
Hello 4

统计出现频次

如果希望统计每一行出现的频次,可以使用-c参数,其中第一行输出为出现的次数

1
2
3
4
5
$  uniq -c testfile
1 Hello 1
2 Hello 2
3 Hello 3
4 Hello 4

仅仅显示重复的行

在某些情况下,或许只想看到有重复的列,使用-d参数 :

1
2
3
4
$  uniq -d testfile
Hello 2
Hello 3
Hello 4

仅仅显示不重复的行

而某些情况下,或许只想看到不重复的列,使用-u参数:

1
2
$  uniq -u testfile
Hello 1

linux终端中最漂亮的几款字体

.. note::
念去去,千里烟波,暮霭沉沉楚天阔。
柳永 《雨霖铃·寒蝉凄切》

仅个人想法,会持续不间断更新和改进。

对于长时间盯着终端来操作的拥趸而言,漂亮赏心悦目的字体是不可或缺的。

但编程字体的选择,看似简单,实则深藏玄机,不同的字体设计初衷各有千秋。

而编码阅读字体,追求的是流畅的感觉,轻松的识别和愉悦的体验。

不过,在编程的世界里,字体的功能性有点凌驾于美学之上。

这也是缘何程序员们偏爱等宽字体的原因,不易出bug。

所以结合功能性,兼具美术感,就是最佳的字体选择了。

举个最简单的例子,不易区分的1和I,不同宽度的W和I,给编程带来的体验是不同的。

这里整理的一些字体尽量能兼具以上的优点,规避一些缺点,助力书写代码新篇章。

Ubuntu 发行版是最开始用的,可是对终端下的字体一直不是很满意,今天终于找到了一些比较好看的终端字体,尤其是Droid sans mono字体,超爱,linux迷在Ubuntu下一直用的就是这款字体,很漂亮,极力推荐下面的几种字体:

Inconsolata 优雅漂亮的等宽字体

我最喜欢的等宽字体,免费。线条清晰,很适合长时间的阅读和编写代码。

偶遇它之后,很快就把原来的默认字体DejaVu Sans Mono抛弃了。真正适合任何字号的好字体。感谢它的创造者Raph Levien

programming-fonts-Inconsolata

monaspace 变成利器

Github出品的Monaspace字体家族,具有能够满足程序员挑剔需求的利器。

programming-fonts-monaspace

Ubuntu安装命令如下:

1
$ sudo apt-get install fonts-inconsolata

Monaco

Mac的默认字体,好像也只有Mac上有。小字号的时候表现不错,而且再大些也不寒碜。普遍被认为是写代码的专用字体。随后的Menlo字体也是相当的不错。

programming-fonts-Monaco

Profont

与Monaco类似的位图字体,你能够在Mac, Windows和Linux上面使用。小字号的时候表现好。非Mac平台上Monaco的最佳替代。喜欢小字号且不怕眼睛疲劳的同学可以考虑。

programming-fonts-ProFont

Envy Code R 具备复古风格

复古的风格,线条流畅,字母衔接自然,代码阅读更流畅。

programming-fonts-envycoder

Droid Sans Mono

开源字体,适合手机屏幕。是等宽字体中最突出的一个。可惜0和O区别不大。

安装命令:

1
$ sudo apt-get install ttf-droid

programming-fonts-DroidSansMono

DejaVu Sans Mono 很多Linux发行版的标配

我以前最喜欢的免费字体系列,以Vera为基础,但是比后者提供更多字符了。

适于任何字号,最重要的是无论终端窗口如何变化,始终能保持字体的清晰。

programming-fonts-DejaVu_Sans_Mono

安装命令如下:

1
$ sudo apt-get install fonts-dejavu-core

Terminus 机械感十足

机械感十足的字体,安装命令如下:

1
$ sudo apt-get install xfonts-terminus

programming-fonts-Terminus_Specimen

Fira Code 特别好的编程字体

Fira Code也是一款等宽字体,以其独特的编码连字和ASCII支持而闻名。

这款字体能够提供清晰、易读的文本,非常适合长时间在终端中工作。

programming-fonts--firacode

安装方法如下:

1
$ sudo apt-get install firacode

SourceCode Pro 优雅且剑指源码

SourceCode Pro单看这名字就知道剑指源码编辑,不过作为Adobe开发的字体,当然不仅仅为编码环境优化,清晰的线条和易读的字母,无论在何处使用,都能为你提供愉悦的体验。

更多详细的信息,可以参考官网:Source Code Pro (adobe-fonts.github.io)

programming-fonts-Source_Code

安装方法

对于MacOSX而言,其他很多字体都已经打包好了,以monaspace为例,执行下面的两个命令即可安装。

1
2
$ brew tap homebrew/cask-fonts
$ brew install font-monaspace

参考文献

linux中最常用的文件管理命令

仅个人想法,会持续不间断更新和改进。

在 Linux 系统中,文件管理是基础且重要。

如何显示,如何查找,如何编辑,如何删除,如何复制,如何移动,如何重命名,如何创建,如何修改,如何查看文件的属性等等,都是我们在日常工作中经常会用到的命令。

Linux的文件管理命令也会帮助你更高效地在终端中操作文件和目录。

而其中最绕不开的当属以下几个。


最常用的且没有之一的 ls

如果linux命令来个排名,ls命令应该是最常用的命令,除非你像黄蓉的母亲,有过目不忘的本领,惹得黄药师抱憾终身。

ls命令是list的缩写,通过ls命令,我们可以查看目录的内容,确定各种重要文件和目录的属性。

命令格式

1
ls [参数] [路径]

不加任何参数

如果不加任何参数,默认列出当前目录的内容。

1
2
3
4
5
6
$ ls /etc/sysconfig/network-scripts
ifcfg-em1
ifcfg-em2
ifcfg-em3
ifcfg-em4
....

使用-l显示更多细节

-l 就是使用long listing format长格式,来显示更多的内容信息。

1
2
3
4
5
6
7
$ ls -l /etc/sysconfig/network-scripts
total 264
-rw-r--r--. 1 root root 341 Nov 30 10:56 ifcfg-em1
-rw-r--r--. 1 root root 294 May 13 2016 ifcfg-em2
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em3
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em4
......

使用-t按照时间排序

如果希望看到最近创建的文件,就需要用到-t参数了。

1
2
3
4
5
6
7
$ ls -lt /etc/sysconfig/network-scripts/
total 264
-rw-r--r--. 1 root root 341 Nov 30 10:56 ifcfg-em1
-rw-r--r--. 1 root root 294 May 13 2016 ifcfg-em2
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em4
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em3
...

使用-r按照时间逆序

如果希望删除很早以前的文件,看到最早创建的文件,就需要用到-r参数了。

1
2
3
4
5
6
7
$ ls -ltr /etc/sysconfig/network-scripts/
total 264
...
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em3
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em4
-rw-r--r--. 1 root root 294 May 13 2016 ifcfg-em2
-rw-r--r--. 1 root root 341 Nov 30 10:56 ifcfg-em1

使用-S根据文件大小排序

1
2
3
4
5
6
7
$ ls -lS /etc/sysconfig/network-scripts/
total 264
...
-rw-r--r--. 1 root root 341 Nov 30 10:56 ifcfg-em1
-rw-r--r--. 1 root root 294 May 13 2016 ifcfg-em2
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em3
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em4

查看庐山真面貌的cat

cat命令可用于输出文件的内容到标准输出。

cat的官方定义为:

concatenate files and print on the standard output

翻译过来就是:把档案串连接后传到基本输出

其用法一般为:

1
$ cat [OPTION]... [FILE]...

cat命令的可选参数[OPTION]如下所示:

  • -n--number: 由 1 开始对所有输出的行数编号
  • -b--number-nonblank: 和 -n 相似,只不过对于空白行不编号
  • -s --squeeze-blank :当遇到有连续两行以上的空白行,就代换为一行的空白行
  • -T--show-tabs:显示TAB字符,显示为^I
  • -E--show-ends:显示行末符号,字符为$
  • -A--show-all:显示所有的信息

此时假定我们的文件为hello.c,内容为最经典的:

1
2
3
4
5
6
7
8
#include <stdio.h>

int main(int argc, char * argv[])
{
printf("Hello World\n");

return 0;
}

接下来的实例全部根据这个文件展开,Hello World. Hello Linux

实例 :简单显示内容

1
2
3
4
5
6
7
8
9
10
11
$ cat hello.c 

#include <stdio.h>

int main(int argc, char * argv[])
{
printf("Hello World\n");

return 0;
}

实例 :显示行号 -n

1
2
3
4
5
6
7
8
9
10
11
$ cat -n hello.c 

1 #include <stdio.h>
2
3 int main(int argc, char * argv[])
4 {
5 printf("Hello World\n");
6
7 return 0;
8 }

实例 : 显示行末

1
2
3
4
5
6
7
8
9
$ cat -E hello.c 
#include <stdio.h>$
$
int main(int argc, char * argv[])$
{$
printf("Hello World\n");$
$
return 0;$
}$

实例:显示空白字符

1
2
3
4
5
6
7
8
9
cat -T hello.c 
#include <stdio.h>

int main(int argc, char * argv[])
{
^Iprintf("Hello World\n");
^I
^Ireturn 0;
}

此时可以看到^I,which means Tab charcter.

加一个管道

比如,此时希望看到你的源码文件一共多少行,每行代表什么意思,就可以把含有行号的输入通过管道发送到另外一个文件,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ cat -n hello.c > hello_number.c

$ cat hello_number.c

1 #include <stdio.h>
2
3 int main(int argc, char * argv[])
4 {
5 printf("Hello World\n");
6
7 return 0;
8 }

其他的一些选项可以自行尝试。

反向显示之 tac

tac命令将文件反向输出,刚好与前面的cat输出相反,cat命令可用于输出文件的内容到标准输出。

这个命令其实就是cat的反向输出,😁

tac的官方定义为:

tac - concatenate and print files in reverse

其用法一般为:

1
$ tac [OPTION]... [FILE]...

tac命令的可选参数[OPTION]如下所示:

  • -b, --before :在行前而不是行尾添加分割标志
  • -r, --regex:将分割标志作为正则表达式来解析
  • -s, --separator=STRING:使用STRING作为分割标志

同样使用前面的hello.c文件,内容为:

1
2
3
4
5
6
7
8
#include <stdio.h>

int main(int argc, char * argv[])
{
printf("Hello World\n");

return 0;
}

接下来的实例全部根据这个文件展开,Hello World. Hello Linux

显示内容

与cat比对输出如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ cat hello.c 
#include <stdio.h>

int main(int argc, char * argv[])
{
printf("Hello World\n");

return 0;
}

$ tac hello.c
}
return 0;

printf("Hello World\n");
{
int main(int argc, char * argv[])

#include <stdio.h>

其他几个参数用的到时不多,不过搭配起来还是有一些帮助的,比如做一个反序输出,搭配使用-s-r参数,如下:

1
2
$ cat 'Hello World.' | tac -r -s "."
.dlroW olleH

这个方法就用到了管道、正则表达式。

识别文件类型的file

file鉴别大神

file的官方解释为:

1
file - determine file type

也就是说可以识别文件类型的意思,也可用来辨别一些文件的编码格式。它是通过查看文件的头部信息来获取文件类型,而不是像Windows通过扩展名来确定文件类型的,所以加不加后缀真的无所谓,谁会爱上谁,说起Windows吗,啥也不说了。

下面看几个比较使用的例子。

实例一 :默认

file后直接跟文件,得到如下所示信息

1
2
3
4
$ file book.pdf
delete.pdf: PDF document, version 1.3
➜ file book
delete: PDF document, version 1.3

可以看出加不加后缀都是没有关系的。

实例二:不显示名称

1
2
$ file -b book.pdf
PDF document, version 1.3

加上-b参数,是brief的含义,将只显示文件辨识结果,不显示文件名称了,这个其实对于很多文件而言,不是很友好。

实例三:输出易懂信息

1
2
$ file -i  delete.pdf
delete.pdf: application/pdf; charset=binary

加上-i参数,是mime类型的含义,我也不懂是啥意思,但是我能刚方便地读懂我想知道的文件类型的含义。这就够了,不是吗,毕竟我们是来是用file命令的。

实例四:查看文件中的文件名的文件信息

1
2
3
4
$ cat hello.txt
sunset.jpg
$ file -f hello.txt
sunset.jpg: JPEG image data, JFIF standard 1.01

这个咋听着这么拗口,其实很简单,其实并不难,加上·-f·参数,是file-from类型的含义,到底是几个意思呢,也就是你想查看文件的类型信息的文件名在一个文件里面,从这个文件里面读取文件的信息。

实例五:好看的鸡肋

1
2
$ file -F " === " sunset.jpg
sunset.jpg === JPEG image data, JFIF standard 1.01

这个功能说实话,没搞明白有什么作用,默认的:感觉挺好用的,当然这个应该属于定制型的,就是默认替换掉一些提示信息。

实例六:查看软链接的文件信息

1
2
3
4
$ file a.jpg
a.jpg: symbolic link to `sunset.jpg'
$ file -L a.jpg
a.jpg: JPEG image data, JFIF standard 1.01

默认情况下,如果没有-L参数,只能得到这个文件是软链接的信息,如果加上这个参数,就能看到源文件的文件信息,这个功能还是很赞的。

less - 少就是多

Linux系统如果希望查阅文件,有三个命令,是在命令行里面,如果GUI界面,请自行绕过,选择太多了。

  • cat 入门级的
  • more 文件内容一屏幕装不下的时候使用的
  • less 可以简单地认为是more的升级版 , 首推

我首推less命令的原因是该命令可以往回卷动浏览已经看过的部分,但是more是不可以的。或者可以认为less是查看模式下的vim

首先看看为什么用less命令吧。

If the file is longer than the size of Terminal window then it will be not easy to read or view all the content of the file easily. But there is a tweak, you can use less with cat command. It will give user an ability to scroll forward and backward through the content of the files using PgUp and PgDn keys or Up and Down Arrow keys on the keyboard.

如题,在文件内容足够多的时候,屏幕足够不大的时候,就会出现上面描述的问题,这就出现了less命令。

Linux系统可以说把少就是多这个哲学用到了极致,恰如小巧优美的C语言,不该有的功能坚决不给你提供,应该有的也不给你提供,哈哈,比如内存的管理,程序员就是神,你就是神。

命令简介

less - opposite of more # 我觉得这是废话

我嘞个去,什么鬼?这是什么意思,我也知道少的反义词是多,大的反义词是小。

别急,那就看看more的含义吧,不会是 opposite of less 吧。OMG

more - file perusal filter for crt viewing

什么意思,淡定,听我说,在Linux系统中有三种命令可以用来查阅全部的文件,分别是catmoreless命令,关于more的解释主要针对在上古年代的计算机,你不理解crt也没有关系,毕竟现在已经是Retina的年代了。

一起看看下面的实例吧。

命令格式

1
less [参数] 文件

与其他命令类似,直接跟上文件名即可。

接下来依旧使用/etc/services来进行示例。

-m 显示类似more命令的百分比

这个是more命令比较好用的一个功能,可以显示目前浏览的百分比。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ less -m /etc/services

auditd 48/udp # Digital Audit Daemon
la-maint 51/tcp # IMP Logical Address Maintenance
la-maint 51/udp # IMP Logical Address Maintenance
xns-time 52/tcp # XNS Time Protocol
xns-time 52/udp # XNS Time Protocol
xns-ch 54/tcp # XNS Clearinghouse
xns-ch 54/udp # XNS Clearinghouse
isi-gl 55/tcp # ISI Graphics Language
isi-gl 55/udp # ISI Graphics Language
xns-auth 56/tcp # XNS Authentication
xns-auth 56/udp # XNS Authentication
xns-mail 58/tcp # XNS Mail
xns-mail 58/udp # XNS Mail
ni-mail 61/tcp # NI MAIL
ni-mail 61/udp # NI MAIL
5%

此时可以在左下角看到,有个百分比。

-N 显示行号

使用-N可以实现cat中-n的效果,显示行号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 $ less -N /etc/services
1 # /etc/services:
2 # $Id: services,v 1.55 2013/04/14 ovasik Exp $
3 #
4 # Network services, Internet style
5 # IANA services version: last updated 2013-04-10
6 #
7 # Note that it is presently the policy of IANA to assign a single well-known
8 # port number for both TCP and UDP; hence, most entries here have two entries
9 # even if the protocol doesn't support UDP operations.
10 # Updated from RFC 1700, ``Assigned Numbers'' (October 1994). Not all ports
11 # are included, only the more common ones.
12 #
13 # The latest IANA port assignments can be gotten from
14 # http://www.iana.org/assignments/port-numbers
15 # The Well Known Ports are those from 0 through 1023.
16 # The Registered Ports are those from 1024 through 49151

搜索字符串

在less中,可以比较容易的搜索字符串,比如可以:

  • /字符串:向下搜索“字符串”的功能
  • ?字符串:向上搜索“字符串”的功能
  • n:重复前一个搜索(与 / 或 ? 有关)
  • N:反向重复前一个搜索(与 / 或 ? 有关)

其实这些功能或者热键与vim相同。

在用less打开文件后,可以直接输入/number来搜索nubmer这个字符串,回车后可以看到该字符串高亮显示,这个也是优于more的一点;同样?number可以反向搜索number字符串。

可以通过-i选项来忽略搜索时的大小写

设置缓冲区的大小

可以通过-b <缓冲区大小> 设置缓冲区的大小,这个一般用于文件很大、巨大、不是一般大的时候,此时你的内容可能不足以承载打开整个文件,比如4G的内存,而你却要打开10G的文件,此时可以通过该选项来设置,默认单位为KB,比如

1
$ less -b 1024 filename

即打开1024KB的文件缓冲

编辑less浏览的文件

要编辑一个正在用less浏览的文件,可以按下v。你就可以用变量$EDITOR所指定的编辑器来编辑了: 按下v键来编辑文件,退出编辑器后,你可以继续用less浏览了。

移动

我比较喜欢less的原因是对于该命令的很多操作都是与vim相同,而我是一个重度vimer,so 推荐less

说几个比较简单的移动:

  • j 向下移动
  • k 向上移动
  • g 移动到第一行
  • G 移动到最后一行
  • b 向后翻一页
  • d 向后翻半页
  • u 向前滚动半页
  • y 向前滚动一行
  • 空格键 滚动一行
  • 回车键 滚动一页

more - 多多益善

more功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上。 more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能 。more命令从前向后读取文件,因此在启动时就加载整个文件。

在查阅文件的时候,我们说过可以用cat命令,不过这个是入门级别的,但凡用了几天Linux的,基本不太会再使用cat,而是另外两个指令,more或者less。这次说一下more,more是在文件的内容一个屏幕装不小的时候使用的。而less是more的升级版本,稍后会介绍。

more : 文件内容一屏幕装不下的时候使用的

看看为什么用less命令吧。

more - file perusal filter for crt viewing

看不懂,什么是CRT,莫慌,关于more的解释主要针对在上古年代的计算机,你不理解crt也没有关系,毕竟现在已经是Retina的年代了。

命令格式

less的命令格式与cat一样,可以直接跟上文件名,如下:

1
less [参数] 文件

其中的参数如下所示:

  • +n 从笫n行开始显示
  • -n 定义屏幕大小为n行
  • +/pattern 在每个档案显示前搜寻该字串(pattern),然后从该字串前两行之后开始显示
  • -c 从顶部清屏,然后显示
  • -d 提示“Press space to continue,’q’ to quit(按空格键继续,按q键退出)”,禁用响铃功能
  • -l 忽略Ctrl+l(换页)字符
  • -p 通过清除窗口而不是滚屏来对文件进行换页,与-c选项相似
  • -s 把连续的多个空行显示为一行
  • -u 把文件内容中的下画线去掉

一起看看下面的实例吧,这里以文件/etc/services为例:

这个文件的开始信息如下:

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
# /etc/services:
# $Id: services,v 1.55 2013/04/14 ovasik Exp $
#
# Network services, Internet style
# IANA services version: last updated 2013-04-10
#
# Note that it is presently the policy of IANA to assign a single well-known
# port number for both TCP and UDP; hence, most entries here have two entries
# even if the protocol doesn't support UDP operations.
# Updated from RFC 1700, ``Assigned Numbers'' (October 1994). Not all ports
# are included, only the more common ones.
#
# The latest IANA port assignments can be gotten from
# http://www.iana.org/assignments/port-numbers
# The Well Known Ports are those from 0 through 1023.
# The Registered Ports are those from 1024 through 49151
# The Dynamic and/or Private Ports are those from 49152 through 65535
#
# Each line describes one service, and is of the form:
#
# service-name port/protocol [aliases ...] [# comment]

tcpmux 1/tcp # TCP port service multiplexer
tcpmux 1/udp # TCP port service multiplexer
rje 5/tcp # Remote Job Entry
rje 5/udp # Remote Job Entry
echo 7/tcp

+n 从第n行开始显示

接下来的命令从第10行开始显示:

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
$ more +10 /etc/service

# Updated from RFC 1700, ``Assigned Numbers'' (October 1994). Not all ports
# are included, only the more common ones.
#
# The latest IANA port assignments can be gotten from
# http://www.iana.org/assignments/port-numbers
# The Well Known Ports are those from 0 through 1023.
# The Registered Ports are those from 1024 through 49151
# The Dynamic and/or Private Ports are those from 49152 through 65535
#
# Each line describes one service, and is of the form:
#
# service-name port/protocol [aliases ...] [# comment]

tcpmux 1/tcp # TCP port service multiplexer
tcpmux 1/udp # TCP port service multiplexer
rje 5/tcp # Remote Job Entry
rje 5/udp # Remote Job Entry
echo 7/tcp
echo 7/udp
discard 9/tcp sink null
discard 9/udp sink null
systat 11/tcp users
systat 11/udp users
daytime 13/tcp
daytime 13/udp
qotd 17/tcp quote
qotd 17/udp quote

可以看到前面的10行是没有显示的。

-n 定义屏幕大小为n行

这里的含义为定义输出的内容为10行,你的屏幕可能足够大,不过显示的内容只有n行,如下:只显示10行的内容,此时终端可能还会残留以前的内容:

1
2
3
4
5
6
7
8
9
10
11
$ more -10 /etc/services
# /etc/services:
# $Id: services,v 1.55 2013/04/14 ovasik Exp $
#
# Network services, Internet style
# IANA services version: last updated 2013-04-10
#
# Note that it is presently the policy of IANA to assign a single well-known
# port number for both TCP and UDP; hence, most entries here have two entries
# even if the protocol doesn't support UDP operations.
# Updated from RFC 1700, ``Assigned Numbers'' (October 1994). Not all ports

可以关注一下,此时每次显示的只有10行。

+/pattern 搜寻字符串(pattern)

这个参数用于在文件中搜索字符串pattern,然后在该字符串的前两行之前开始显示。比如搜索number,会显示以下内容:

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
$ more +/number /etc/services
#
# Note that it is presently the policy of IANA to assign a single well-known
# port number for both TCP and UDP; hence, most entries here have two entries
# even if the protocol doesn't support UDP operations.
# Updated from RFC 1700, ``Assigned Numbers'' (October 1994). Not all ports
# are included, only the more common ones.
#
# The latest IANA port assignments can be gotten from
# http://www.iana.org/assignments/port-numbers
# The Well Known Ports are those from 0 through 1023.
# The Registered Ports are those from 1024 through 49151
# The Dynamic and/or Private Ports are those from 49152 through 65535
#
# Each line describes one service, and is of the form:
#
# service-name port/protocol [aliases ...] [# comment]

tcpmux 1/tcp # TCP port service multiplexer
tcpmux 1/udp # TCP port service multiplexer
rje 5/tcp # Remote Job Entry
rje 5/udp # Remote Job Entry
echo 7/tcp
echo 7/udp
discard 9/tcp sink null
discard 9/udp sink null
systat 11/tcp users
systat 11/udp users
daytime 13/tcp
......

可以留意,此时显示的内容,第三行即包含搜索的字符串。

其他

除以上介绍的以外,还有比较容易理解的以下参数:

  • -c 从顶部清屏,然后显示
  • -p 通过清除窗口而不是滚屏来对文件进行换页,与-c选项相似
  • -s 把连续的多个空行显示为一行
  • -u 把文件内容中的下画线去掉

不可狗尾续貂的tail

tail命令用来查看文件尾部的n行,如果没有指定的n,默认显示10行。

命令格式:

1
$ tail [option] [filename]  

参数option比较常用的如下所示:

  • -f 循环读取
  • -c <数目> 显示的字节数
  • -n <行数> 显示文件的尾部 n 行内容

常规使用

假定文件text.txt有20行,从1-20,默认情况下的使用如下:

1
2
3
4
5
6
7
8
9
10
11
$ tail text.txt
11
12
13
14
15
16
17
18
19
20

显示N行

可以通过-n参数来只显示N行,而不是默认的10行,比如15行,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ tail -n 15 text.txt
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

从第N行显示

此时如果希望从第N行显示,而不是显示N行,可以通过下面的参数,比如从第15行显示

1
2
3
4
5
6
7
$ tail -n +15 text.txt
15
16
17
18
19
20

按照字符显示

如果希望显示文件的最后几个字符,比如6个,如下:

1
2
3
4
5
6
7
8
9
$ tail -c 6 text.txt
19
20

# NICE
# 查看文件的后60KB
$ tail -c 60k filename
# 查看文件的后60MB
$ tail -c 60m filename

特别赞的一个实时更新的功能

参数 -f 常常用于查阅正在改变的日志文件。如下面👇所示:

1
$ tail -f filename

如果filename的内容在增加,那么显示在屏幕上的内容就会一直更新。

查看目录命令pwd

pwd命令的作用是查看当前目录,没有参数,输入后回车即可显示当前绝对路径。

官方定义为:

pwd - print name of current/working directory

所以pwdPrint Working Directory第一个字的缩写。

唯二需要了解的参数如下:

  • -L, --logical:打印逻辑路径,与pwd一致
  • -P, --physical:打印物理路径,这里可以从超级链接直达原处

实例展示

此时比如我们进入一个目录,然后在打印出来,如下:

1
2
3
4
$ cd /etc/sysconfig/network-scripts/

$ pwd
/etc/sysconfig/network-scripts

可以看到pwd将输出完全路径

逻辑与物理路径

比如如下:

1
2
3
4
5
6
7
$ pwd
/opt/test

$ ls -l
总用量 1
lrwxrwxrwx 1 root root 14 Jan 15 2012 dir -> source/dir
drwxrwxrwx 1 root root 14 Jan 15 2012 source

可以看到此时的路径在/opt/test/里面有两个目录sourcedir,其中dir链接到source里面的dir。

接下来对比一下-L和-P的区别。

1
2
3
4
5
6
7
8
9
10
$ cd dir

$ pwd
/opt/test/dir

$ pwd -L
/opt/test/dir

$ pwd -P
/opt/test/source/dir

从上面的输出可以发现,-P参数会显示文件最原始的路径;而-L则是逻辑上的路径。

Linux 的 echo 命令

echo命令用于在终端设备上输出字符串或变量的值,类似于PythonprintC语言的printf,是Linux系统中最常用的命令之一。

其中输出字符串主要在shell脚本中使用,常用的还是输出变量的值。

命令格式为:echo [参数] [字符串]

其中常用的参数为:

  • -n 不输出结尾的换行符
  • -e “\a”发出警告音
  • -e “\n”换行,光标移至行首
  • -e “\r”光标移至行首,但不换行、主用用在打印循环的情况下

几个示例

输出一段字符串:

1
2
$  echo "Hello Linux" 
Hello Linux

输出变量提取后的值:

1
2
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

一般使用在变量前加上$符号的方式提取出变量的值,例如:$PATH,然后再用echo命令予以输出。或者直接使用echo命令输出一段字符串到屏幕上,起到给用户提示的作用。

其中的PATH与Windows的环境变量类似

几个Linux命令来输出:

1
2
$ echo `date`
Sat 12 Feb 2011 22:19:03 PM CST

查询上一次的执行结果

1
$echo $?

$?是Shell中的一个特殊变量,表示上一条命令的退出状态,0表示成功。

Linux ln 命令

ln 命令是一个非常重要的命令,可以为某一个文件或目录在其他不同的位置建立一个同步的链接。部分功能与Windows的快捷方式类似。但更加强大。

官方解释为:

ln - make links between files

当我们需要在不同的目录,或者不同的工程,甚至是不同的人员需要用到同一个文件的时候,此时不需要每个位置都通过cp来拷贝一份,因为在源文件更新的时候,这个文件是不会同步更新的 。而此时ln命令就不一样了,通过该命令链接到源文件或目录,不仅可以不用占用重复的更多的磁盘空间,还可以同步更新。NICE

使用格式

1
$ ln [参数][源文件或目录][目标文件或目录]

其中参数的格式为

  • -b ,或 like –backup but does not accept an argument
  • -f,或 --force : 强制执行,这个在链接已经存在的情况下必用
  • -s,或 --symbolic:创建符号链接

在Linux文件系统中,又有两种链接类型:

  1. 硬链接(hard link)
  2. 软链接(symbolic link):又称符号链接,类似于Windows的快捷方式

硬链接会复制一份相同大小的源文件,而软链接是一种特殊的文件,占用很小的磁盘空间。

创建硬链接

默认情况下,不加任何参数,创建的是硬链接,如下,创建源文件a.log的硬链接a1.log

1
2
3
4
5
$ ln a.log a1.log

$ ll
-rw-rw-r--. 3 user user 85710 Apr 5 21:29 a.log
-rw-rw-r--. 3 user user 85710 Apr 5 21:29 a1.log

这个时候修改源文件a.log的部分内容,可以看到硬链接也同步更新。

1
2
3
4
5
$ vim a.log

$ ll
-rw-rw-r--. 3 user user 85716 Apr 5 21:34 a.log
-rw-rw-r--. 3 user user 85716 Apr 5 21:34 a1.log

创建软链接

如果需要创建软链接,就需要参数-s,如下,创建源文件a.log的软链接a1.log

1
2
3
4
5
$ ln -s a.log a1.log

$ ll
-rw-rw-r--. 3 user user 85710 Apr 5 21:29 a.log
lrwxrwxrwx. 1 user user 5 Apr 5 21:30 a1.log -> a.log

这个时候修改源文件a.log的部分内容,可以看到软链接没有更新,不过其指向的内容依然更新了。

1
2
3
4
5
$ vim a.log

$ ll
-rw-rw-r--. 3 user user 85716 Apr 5 21:34 a.log
lrwxrwxrwx. 1 user user 5 Apr 5 21:30 a1.log -> a.log

此时可以看到,对于软链接a1.log而言,其仅为一个符号链接,用file看一下:

1
2
$ file a1.log
a1.log: symbolic link to `a.log'

删除源文件后的情况

此时通过ln创建a.log的硬链接ah.log和软链接as.log,然后看一下如果删除源文件会发生什么情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 创建软硬链接
$ ln a.log ah.log
$ ln -s a.log as.log
$ ll
-rw-rw-r--. 2 user user 85716 Apr 5 21:34 a.log
lrwxrwxrwx. 1 user user 5 Apr 5 21:30 as.log -> a.log
-rw-rw-r--. 2 user user 85716 Apr 5 21:34 ah.log

# 删除源文件
$ rm a.log

# 此时如果有颜色显示,as.log应该会是红色的警告色
$ ll
lrwxrwxrwx. 1 user user 5 Apr 5 21:30 as.log -> a.log
-rw-rw-r--. 2 user user 85716 Apr 5 21:34 ah.log

# 此时看一下as.log的状态
$ file as.log
as.log: broken symbolic link to `a.log'

可以看到如果删除了源文件,硬链接不受影响,但是软链接已经提示链接损坏了。

强制更新软链接

在软链接存在的情况下,如果再创建一个同名的,会报错,此时就需要强制创建了,加上-f参数即可。

1
2
3
4
5
6
7
8
9
10
11
$ ln -s b.log as.log
ln: failed to create symbolic link 'as.log': File exists

# 强制创建
$ ln -sf b.log as.log

$ ll
-rw-rw-r--. 1 user user 85716 Apr 5 22:16 a.log
-rw-rw-r--. 2 user user 85716 Apr 5 21:34 ah.log
lrwxrwxrwx. 1 user user 5 Apr 5 22:21 as.log -> b.log
-rw-rw-r--. 1 user user 85716 Apr 5 22:17 b.log

文件权限设置命令 chmod

文件权限指的是文件是否可以执行、写入、读取等操作。

而Linux/Unix的文件存取权限分为三级 : 文件所有者、用户组及其他,分别使用以下字母来表示:

  • u:所有者
  • g:用户组
  • o:其他用户

如下图所示,每个级别都可以设置为rwx三种权限 。

Linux chmod

该命令官方定义为:

chmod - change mode

所以可以通过chmod来控制文件如何被他人所存取。

使用的语法如下所示:

1
$ chmod [-cfvR] [--help] [--version] mode file...

其中mode权限设定的格式如下 : [ugoa] [+-=] [rwxX]

其中u表示该文件的拥有者,g表示与该文件的拥有者属于同一个群体(group)者,o表示其他以外的人,a表示这三者皆是。

  • + 表示加权限、 表示减权限、= 表示设定唯一权限。
  • r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行。
  • -R : 对目前目录下的所有文件与子目录进行相同的权限变更(即以递回的方式逐个变更)

对于chmod的使用而言,只有文件所有者和超级用户可以修改文件或目录的权限。

具体的方法为可以使用符号模式或者绝对模式来进行操作。

而我比较喜欢用的是绝对数字模式,比较粗暴简单。

符号模式

使用符号模式需要考虑多个因素,其中包括用户类型,操作符 和设定权限。

who 用户类型 说明
u user 文件所有者
g group 文件所有者所在组
o others 所有其他用户
a all 所用用户, 相当于 ugo

operator 的符号模式表:

Operator 说明
+ 为指定的用户类型增加权限
- 去除指定用户类型的权限
= 设置指定用户权限的设置,即将用户类型的所有权限重新设置

permission 的符号模式表:

模式 名字 说明
r 设置为可读权限
w 设置为可写权限
x 执行权限 设置为可执行权限

绝对数字模式

chmod命令可以使用八进制数来指定权限。文件或目录的权限位是由9个权限位来控制,每三位为一组,它们分别是文件所有者的读、写、执行权限,用户组的读、写、执行以及其它用户的读、写、执行。历史上,文件权限被放在一个比特掩码中,掩码中指定的比特位设为1,用来说明一个类具有相应的优先级。比如下面的0-7分别表示各自的权限定义。

No 权限 rwx 二进制
7 读 + 写 + 执行 rwx 111
6 读 + 写 rw- 110
5 读 + 执行 r-x 101
4 只读 r– 100
3 写 + 执行 -wx 011
2 只写 -w- 010
1 只执行 –x 001
0 000

如表所示:

  • 对于7而言就表示所有者的权限为可读、可写、可执行,也就是对应的八进制为111,所以就是7;
  • 而对于 5而言,表示所有者的权限为可读、可执行,对应的八进制为101,所以就是5;

其他类似。

实例更改为全部可读

接下来将文件 a.c 设为所有人皆可读取 ,有三种方式可以使用,如下,分别为 :

  1. chmod ugo+r filename
  2. chmod a+r filename
  3. chmod 444 filename

具体如下所示:

通过方法1:

1
2
3
4
5
6
7
8
9
# 默认设定为没有任何属性
$ ll
---------- 1 user user 5KB Feb 12 22:22 a.c

# 更改为全部可读
$ chmod ugo+r file1.txt

$ ll
-r--r--r-- 1 user user 5KB Feb 12 22:22 a.c

通过方法2:

1
2
3
4
5
6
7
8
9
# 默认设定为没有任何属性
$ ll
---------- 1 user user 5KB Feb 12 22:23 a.c

# 更改为全部可读
$ chmod a+r file1.txt

$ ll
-r--r--r-- 1 user user 5KB Feb 12 22:23 a.c

通过方法3:

1
2
3
4
5
6
7
8
9
# 默认设定为没有任何属性
$ ll
---------- 1 user user 5KB Feb 12 22:23 a.c

# 更改为全部可读
$ chmod 444 file1.txt

$ ll
-r--r--r-- 1 user user 5KB Feb 12 22:24 a.c

设置用户及组可读写,其他用户无法写入但可以查看

接下来继续把文件 a.c设置为用户 和组可以读写,而其他 用户无法写入但是 可以查看 。

使用符号模式如下:

1
2
3
4
5
6
7
$ ll
-r--r--r-- 1 user user 5KB Feb 12 22:24 a.c

$ chmod ug+rw,o+r,o-w a.c

$ ll
-rw-rw-r-- 1 user user 5KB Feb 12 22:26 a.c

使用数字模式如下:

1
2
3
4
5
6
7
$ ll
-r--r--r-- 1 user user 5KB Feb 12 22:24 b.c

$ chmod 664 a.c

$ ll
-rw-rw-r-- 1 user user 5KB Feb 12 22:26 b.c

设定为所有人只有可执行权限

此时不管文件的权限是什么,因为只具有可执行权限,所以符号模式可以使用**=**,而数字模式只需要1即可,如下:

1
2
3
4
5
6
7
$ chmod a=x filename
#或者
$ chmod 111 filename

# 无法读取
$ cat a.c
cat: a.c: Permission denied

所以对于只有可执行权限的文件,是无法执行读取或者写入操作的,这也保证了文件的安全性。

炫技 - TODO

其实对于每个文件或者目录而言,除了rwx权限,还有 一个权限位,这个权限为一般为特殊权限。

模式 名字 说明
X 特殊执行权限 只有当文件为目录文件,或者其他类型的用户有可执行权限时,才将文件权限设置可执行
s setuid/gid 当文件被执行时,根据who参数指定的用户类型设置文件的setuid或者setgid权限
t 粘贴位 设置粘贴位,只有超级用户可以设置该位,只有文件所有者u可以使用该位

若用 chmod 4755 filename 可使此程序具有 root 的权限。

更多说明

命令 说明
chmod 4755 *file* 4设置了设置用户ID位,剩下的相当于 u=rwx (4+2+1),go=rx (4+1 & 4+1)。
find path/ -type d -exec chmod a-x {} \; 删除可执行权限对path/以及其所有的目录(不包括文件)的所有用户,使用’-type f’匹配文件
find path/ -type d -exec chmod a+x {} \; 允许所有用户浏览或通过目录path/

极具归属感的 - chown

Linux chown 命令用于设置文件所有者和文件关联组的命令。

官方的定义为:

chown - change file owner and group

Linux/Unix 的有个理念就是一切皆文件,而对于每个文件也是如chmod所述,均拥有所有者。

此时就可以利用 chown 指定文件的拥有者或者指定的用户或组,用户可以是用户名或者用户 ID,组可以是组名或者组 ID,文件是以空格分开的要改变权限的文件列表,支持通配符

不过需要注意的是 chown 需要超级用户 root 的权限才能执行此命令,或者使用sudo也可以。

使用语法

使用语法如下:

1
2
3
$ chown [option] [user[:group]] file...
# 或者
$ chown [option] --reference=RFILE file...

其中user为新的文件拥有者的用户名或者IDgroup为新的文件拥有者的用户组名或ID****。

并且可以通过--referenc=RFILE选项来设定希望修改的文件和目录。

其他的选项可以为: :

  • -c : 与-v类似,不过只显示更改的信息
  • -R : 递归地处理指定的目录以及其子目录下的所有文件

通用实例

最简单的使用方式应该就是指定用户和用户组了,如下:

1
2
3
4
5
6
7
$ ll 
-rw-rw-r--. 1 user user 5 May 7 14:56 a

$ sudo chown user1:group1 a

$ ll
-rw-rw-r--. 1 user1 group1 5 May 7 14:56 a

上面的命令将把a指定为用户user1,组group1。注意user1group1必须存在,不然会提示无效的用户或者组。

更新组而不更新用户

这个选项一般用在,希望把某个用户的文件共享到一个组,此时的方法如下:

1
$ sudo chown :newgroup filename

此时的用户所有者不变,而仅仅更改了文件所属组。

提示更新

1
2
3
4
5
6
7
8
9
10
$ sudo chown -c user1 a b c d
changed ownership of "b" from user to user1
changed ownership of "c" from user to user1
changed ownership of "d" from user to user1

$ sudo chown -v user1 a b c d
changed ownership of "a" from user to user1
changed ownership of "b" from user to user1
changed ownership of "c" from user to user1
changed ownership of "d" from user to user1

从这个例子可以看出,对于-c和-v的区别,-v全部显示,而-c仅仅显示更新的部分。

递归处理文件或文件夹

1
$ sudo chown -R user:group file directory

此条命令将递归地将文件file和目录directory及其子目录的文件更新为user用户拥有,group组拥有。

有所依靠的chgrp

.. code::
鸿鹄志、向炎天。
宋 刘克庄《贺新郎·杜子昕凯歌》

Linux的chgrp命令用于变更文件或者目录所属的组group。

这里的变更不仅限于本人的组,只要用户属于的组,均可以使用chgrp更改相应的权限而不是必须使用管理员权限。

很多权限的操作可以与chmod来交叉。比如如果希望文件只有本组成员访问,可以通过chmod 770 file/directory,此时就涉及到组的概念了。

官方定义为:

chgrp - change group ownership

语法为:

1
2
$ chgrp [OPTION]... GROUP FILE...
$ chgrp [OPTION]... --reference=RFILE FILE...

常用的几个参数为:

  • --reference=RFILE : 参考指定文件进行所属组更换

  • -R, --recursive :递归处理,将某个目录的所有文件均更改用户组

默认用法

最简单的使用为将文件file归属到组group,使用方法为:

1
2
$ chgrp group file
$ chgrp group1 file1

此时的file数组组group,file1属于组group1。

更改文件夹的所属组

对于文件夹而言,就需要使用-R参数来递归实现了,不然会报错的。

1
2
$ chgrp -R group1 directory1
$ chgrp -R group2 directory2

根据指定文件来修改组

这个参数比较有趣,也比较高效,如果希望某个用户的组权限与另外一个文件一致,此时--reference强势出现

1
$ chgrp --reference=ref_file stage_file

该命令执行后,stage_file的权限将与ref_file的组权限一样。

Linux的 tee 命令

Linux的tee命令可以将输出输出到终端的同时写入文件。

这个命令对于既想试试看到输出保存到文件稍后查看的操作十分有用。

官方定义为:

tee - read from standard input and write to standard output and files

语法

具体的使用方法为:

1
$ tee [OPTION]... [FILE]...

参数

  • -a, --append  追加到现有文件的后面,而非覆盖它.
  • -i, --ignore-interrupts  忽略中断信号。

一般使用

比如最简单的想查看一下当前有哪些文件并保存到一个日志,如下:

1
2
3
4
5
6
7
8
$ ls
a.txt b.txt c.txt d.txt e.txt

$ ls | tee list.log
a.txt b.txt c.txt d.txt e.txt

$ cat list.log
a.txt b.txt c.txt d.txt e.txt

可以看到tee在保证同时显示在终端上还输出到了文件 list.log中。

同时保存到多个文件

tee当然也是可以同时输出到多个文件的,比如:

1
2
3
4
5
6
7
8
9
10
$ ls
a.txt b.txt c.txt d.txt e.txt

$ ls | tee list.log listB.log
a.txt b.txt c.txt d.txt e.txt

$ cat list.log
a.txt b.txt c.txt d.txt e.txt
$ cat listB.log
a.txt b.txt c.txt d.txt e.txt

与自己对话

与自己对话如何呢,或者叫做复读机?

tee命令直接跟文件的话,会等待输入,并同步进行输出到终端和文件的操作。

1
2
3
4
5
6
7
8
9
$ tee test.log 
hello
hello
world
world

$ cat test.log
hello
world


Linux最常用的几个命令

​ Linux系统中的命令那是相当地丰富,不同的版本可能还有不同的命令,不过Linux核心自带的命令大概有几百个,这个不管是什么发行版一般都是共用的。

​ 如果希望探索Linux的所有命令,可能不太实际,因为这个数字可能达到惊人的万计。

​ 不过还好的是,Linux命令的入门只要掌握不到100个命令即可,而如果相对而言行云流水的话也就200个命令足矣。

​ 而如果准备试试Linux,可能只需要下面的几个实用频率最高、功能最关键、也最常用的命令也就基本可以完成日常的工作、学习需要了。

​ 忽然想用姓氏排序的方法,不过感觉不太行,索性就大概按照使用率来统计了。

​ 仅个人习惯,会持续不间断更新和改进。


ls 列出当前目录下的文件📃和文件夹📁列表

​ 个人感觉这个命令,属于名副其实用的最多的命令,我们进入Linux的第一个命令,可能除了输入用户名密码就属它了。

​ 工欲善其事,必先利其器,你欲使用Linux,必先了解当前的文件和内容。

不加任何参数

如果不加任何参数,默认列出当前目录的内容。

1
2
3
4
5
6
$ ls /etc/sysconfig/network-scripts
ifcfg-em1
ifcfg-em2
ifcfg-em3
ifcfg-em4
....

使用-l显示更多细节

-l 就是使用long listing format长格式,来显示更多的内容信息。

1
2
3
4
5
6
7
$ ls -l /etc/sysconfig/network-scripts
total 264
-rw-r--r--. 1 root root 341 Nov 30 10:56 ifcfg-em1
-rw-r--r--. 1 root root 294 May 13 2016 ifcfg-em2
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em3
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em4
......

使用-t按照时间排序

如果希望看到最近创建的文件,就需要用到-t参数了。

1
2
3
4
5
6
7
$ ls -lt /etc/sysconfig/network-scripts/
total 264
-rw-r--r--. 1 root root 341 Nov 30 10:56 ifcfg-em1
-rw-r--r--. 1 root root 294 May 13 2016 ifcfg-em2
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em4
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em3
...

使用-r按照时间逆序

如果希望删除很早以前的文件,看到最早创建的文件,就需要用到-r参数了。

1
2
3
4
5
6
7
$ ls -ltr /etc/sysconfig/network-scripts/
total 264
...
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em3
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em4
-rw-r--r--. 1 root root 294 May 13 2016 ifcfg-em2
-rw-r--r--. 1 root root 341 Nov 30 10:56 ifcfg-em1

使用-S根据文件大小排序

1
2
3
4
5
6
7
$ ls -lS /etc/sysconfig/network-scripts/
total 264
...
-rw-r--r--. 1 root root 341 Nov 30 10:56 ifcfg-em1
-rw-r--r--. 1 root root 294 May 13 2016 ifcfg-em2
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em3
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em4

cd 改变当前的工作目录

这个命令可能估计能排在第二,类似于Winows的双击,在不同目录件徜徉。

在各个文件夹遍历是我们的习惯和倔强的证明。

cd命令没有太多参数,但是有一些技巧所在,可以N多人从来没有用过。

cd直接使用即可,技巧是下面几个:

进入刚才的目录

想要进入刚才进入的地方(目测没有很多人再用,但是真的很好用)运行:

1
$ cd

快速返回家目录

需要快速地回到你的家目录,输入cd即可,这里其实不用一级一级的进入

1
$ cd

进入某用户的家目录

这个需要你有root权限

1
cd ~username

进入username的家目录。

mkdir - 创建目录

说到cd到某个目录,就需要提高创建目录,也就新建文件夹。

参数不过,处理默认什么参数也不加,会一个-p递归创建文件夹即可。

创建一个空目录

1
$ mkdir hello

递归创建多个目录

1
$ mkdir -p a/b/c/d/e/f/g

rm - 删除文件

rm 命令用于删除文件或者目录。

这个命令其实我不想把它归为最常用的命令,因为它也是最危险⚠️的命令之一,文件一旦通过rm命令删除❌,则无法恢复,所以必须格外一定切记小心地使用该命令。因为发生过很多欲哭无泪的故事。。。

文件如果少,可以使用-i 删除前逐一询问确认,确认时比较好用;

而下面的两个参数十分残暴,除非百分之两百确认,否则慎用:

  • -f 即使原档案属性设为唯读,也直接删除,无需逐一确认,是force的意思。
  • -r 将目录及里面的子文件逐一删除。

cp - 复制文件

cp可以实现文件和目录的复制,如果你只会cp a b,或者加上-r来递归目录,那么你还需要挖掘很多呀,比如只复制不存在或者更新的文件。

以下就是cp常用的选项如下所示:

  • i : 覆盖一个已经存在的文件前,提示用户进行确认
  • r:递归地复制目录及其内容,复制目录的时候必须使用这个参数
  • u:只复制不存在或者更新的文件
  • v:复制文件时,显示复制信息

组合rv - 可以拷贝文件或文件夹

这个在显示复制信息的时候,也可以复制目录

1
2
3
4
5
$ cp -rv dir1/* dir2/
‘dir1/a’ -> ‘dir2/a’
‘dir1/b’ -> ‘dir2/b’
‘dir1/c’ -> ‘dir2/c’
‘dir1/d’ -> ‘dir2/d’

拷贝时提示确认

这个参数在使用rm的时候已经记得使用,不然就像rm -rf /一样,一个公司没有了。

1
2
3
4
$ cp -i dir1/* dir2/
cp: overwrite ‘dir2/a’? y
cp: overwrite ‘dir2/b’? y
cp: overwrite ‘dir2/c’? y

这个选项在文件超级多时候,慎用!!

只拷贝不存在或更新的文件

u表示update,也就是从一个目录拷贝到另外一个目录时,只会复制那些不存在或者目标目录相应文件的更新文件。

执行下面的命令:

1
$ cp -u dir1/* dir2/

可以得到:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ ll *
dir1:
total 0
-rw-rw-r-- 1 user user 0 Jul 20 21:23 a
-rw-rw-r-- 1 user user 0 Jul 20 21:23 b
-rw-rw-r-- 1 user user 0 Jul 20 21:23 c
-rw-rw-r-- 1 user user 0 Jul 20 21:23 d

dir2:
total 0
-rw-rw-r-- 1 user user 0 Jul 20 21:29 a
-rw-rw-r-- 1 user user 0 Jul 20 21:25 b
-rw-rw-r-- 1 user user 0 Jul 20 21:29 c
-rw-rw-r-- 1 user user 0 Jul 20 21:25 d
-rw-rw-r-- 1 user user 0 Jul 20 21:25 e

如何用cp拷贝指定序号的文件

现在有文件夹filename,内有文档,名字是从1.txt, 2.txt, 3.txt 一直到9999.txt,10000.txt,现在希望从第N组数据即N.txt到第M组数据M.txt的文件拷贝到别的文件夹中,方法如下:

1
$ cp {N..M}.txt   newfilename/

这个方法可是相当的赞呀(≧▽≦)/,基本可以秒掉大多数的GUI程序了。

mv - 文件移动或者叫重命名

如果mv的命令还停留在重命名一个文件或者文件夹,那么就花3分钟看一下。

mv能做的还很多。

比如为了防止误删,mv可以提前做个备份;比如为了防止覆盖,可以考虑只有文件较新的时候才移动。

详细如下:

mv几个比较常用的选项如下:

  • -b: 当目标文件或目录存在时,在执行覆盖前,会为其创建一个备份,文件后缀用~表示;
  • -i或–interactive: 如果指定移动的源目录或文件与目标的目录或文件同名,则会先询问是否覆盖旧文件,输入 y 表示直接覆盖,输入 n 表示取消该操作,一般而言,对于不确定的时候可以用此选项,不过文件或文件夹居多时,最好不要用
  • -f或–force: 如果指定移动的源目录或文件与目标的目录或文件同名,不会询问,直接覆盖旧文件,强制的意思force
  • -n或–no-clobber: 不要覆盖任何已存在的文件或目录。
  • -u:当源文件比目标文件新或者目标文件不存在时,才执行移动操作。

常规操作

1
2
3
4
5
6
7
$ ls
a.txt

$ mv a.txt b.txt

$ ls
b.txt

直接移动或者叫做重命名,文件夹也类似的操作。

覆盖前备份

1
2
3
4
5
6
7
$ ls
a.txt a.txt~

$ cp -b ../a.txt a.txt

$ ls
a.txt a.txt~

可以看到此时多了一个备份文件

增量更新

1
$ cp -u a b	

此时的操作为,只有a比b更新或者b不存在的时候,才会进行更新,否则失败。

这个用法多用在:当横向对比两个文价夹有无重要更新的时候才会用到。

交互提示

1
2
$ cp -i b.txt a.txt
cp:是否覆盖"a.txt"

在文件存在的时候,-i选项会进行提示,此时需要输入y才能覆盖,而输入n就会取消这个操作。

pwd - 查看目录所在的命令

pwd命令的作用是查看当前目录,没有参数,输入后回车即可显示当前绝对路径, 所以pwdPrint Working Directory第一个字的缩写。

唯二需要了解的参数如下:

  • -L, --logical:打印逻辑路径,与pwd一致
  • -P, --physical:打印物理路径,这里可以从超级链接直达原处

实例展示

此时比如我们进入一个目录,然后在打印出来,如下:

1
2
3
4
$ cd /etc/sysconfig/network-scripts/

$ pwd
/etc/sysconfig/network-scripts

可以看到pwd将输出完全路径

逻辑与物理路径

比如如下:

1
2
3
4
5
6
7
$ pwd
/opt/test

$ ls -l
总用量 1
lrwxrwxrwx 1 root root 14 Jan 15 2012 dir -> source/dir
drwxrwxrwx 1 root root 14 Jan 15 2012 source

可以看到此时的路径在/opt/test/里面有两个目录sourcedir,其中dir链接到source里面的dir。

接下来对比一下-L和-P的区别。

1
2
3
4
5
6
7
8
9
10
$ cd dir

$ pwd
/opt/test/dir

$ pwd -L
/opt/test/dir

$ pwd -P
/opt/test/source/dir

从上面的输出可以发现,-P参数会显示文件最原始的路径;而-L则是逻辑上的路径。


Linux入门命令汇总

从2021年8月19日开始分享以前陆陆续续汇总的一些小技巧,截止到今天(2021年11月29)为止,100天,100个技巧。

Bingo,第一个小汇总顺利完成。

从发送的顺序上来看,100个命令的链接如下所示,PDF汇总文件根据这个顺序,或者字母表顺序,或者分类顺序来进行阅读。具体参考公众号商店

  1. ls
  2. cd
  3. cat
  4. file
  5. less
  6. more
  7. whatis
  8. apropos
  9. man
  10. mkdir
  11. cp
  12. mv
  13. rm
  14. rmdir
  15. df
  16. du
  17. pwd
  18. ln
  19. chmod
  20. chown
  21. su
  22. sudo
  23. tail
  24. head
  25. free
  26. touch
  27. stat
  28. ping
  29. ifconfig
  30. ip
  31. wall
  32. write
  33. tracepath
  34. date
  35. useradd
  36. userdel
  37. passwd
  38. tty
  39. uname
  40. whoami
  41. who
  42. w
  43. id
  44. top
  45. dd
  46. echo
  47. kill
  48. wget
  49. ps
  50. wc
  51. last
  52. time
  53. find
  54. scp
  55. rsync
  56. grep
  57. uniq
  58. sort
  59. which
  60. tar
  61. history
  62. alias
  63. diff
  64. curl
  65. usermod
  66. cal
  67. sleep
  68. ssh
  69. locate
  70. split
  71. hostname
  72. lscpu
  73. lspci
  74. tr
  75. tree
  76. bc
  77. pstree
  78. tac
  79. xargs
  80. pgrep
  81. pkill
  82. env
  83. chgrp
  84. whereis
  85. tee
  86. nice
  87. shutdown
  88. reboot
  89. poweroff
  90. halt
  91. fdisk
  92. join
  93. ulimit
  94. traceroute
  95. zip
  96. unzip
  97. login–
  98. logname—
  99. logout–
  100. arp–
  101. locatedb
  102. glob(3)
  103. telnet—
  104. netconfig–
  105. nc—
  106. minicom—
  107. mesg—
  108. netstat—
  109. talk—
  110. tcpdump—
  111. get–
  112. mcopy—
  113. ftp—
  114. fsck–
  115. hdparm–
  116. sync–
  117. exit–
  118. finger–
  119. suspend–
  120. rsh–
  121. rlogin–
  122. pstree–
  123. screen–
  124. chsh—-
  125. whois—
  126. skill—
  127. reset–
  128. clear–
  129. bind–
  130. chroot–
  131. clock–
  132. dmesg—
  133. export—
  134. rpm—
  135. set—
  136. resize—
  137. setenv—
  138. chkconfig—
  139. unalias—
  140. ar—
  141. dump–
  142. gzip–

而从分类来讲,主要包括了大概N个类别

文件管理类

  1. ls
  2. cat
  3. tac
  4. file
  5. less
  6. more
  7. tail
  8. pwd
  9. echo
  10. ln
  11. chmod
  12. chown
  13. chgrp
  14. tee

时间

  1. date
  2. cal

磁盘管理类

  1. cd
  2. df
  3. du
  4. mkdir
  5. rmdir
  6. pwd
  7. stat
  8. find
  9. locate

文档编辑类

  1. grep
  2. join
  3. sort
  4. wc
  5. uniq
  6. diff
  7. split
  8. pgrep/pkill

帮助类

  1. whatis
  2. apropos
  3. man
  4. which
  5. whereis

文件传输类

  1. cp
  2. mv
  3. scp
  4. rsync
  5. rcp—
  6. mcopy—
  7. ftp—
  8. tftp—
  9. ncftp—
  10. ftpshut—
  11. ftpwho–

磁盘维护类

  1. dd
  2. fsck–
  3. hdparm–
  4. sync–

文件传输

  1. wget
  2. curl

网络通信类

  1. telnet—
  2. netconfig–
  3. nc–
  4. minicom—
  5. wall
  6. netstat—
  7. talk—
  8. traceroute
  9. tty—
  10. write
  11. tcpdump—

系统管理类

  1. adduser–
  2. useradd
  3. exit–
  4. finger–
  5. sleep
  6. suspend–
  7. groupadd—
  8. groupdel–
  9. groupmod–
  10. kill
  11. last
  12. halt
  13. login–
  14. logname—
  15. logout–
  16. ps
  17. nice
  18. top
  19. reboot
  20. poweroff
  21. rsh–
  22. rlogin–
  23. pstree–
  24. screen–
  25. shutdown
  26. sudo
  27. uname
  28. chsh—
  29. userdel
  30. usermod
  31. who
  32. whoami
  33. whois—
  34. su
  35. skill—
  36. w
  37. id
  38. free

系统设置类

  1. reset–
  2. clear–
  3. alias
  4. bind–
  5. chroot–
  6. clock–
  7. crontab–
  8. dmesg—
  9. export—
  10. rpm—
  11. insmod—
  12. lsmod—
  13. set—
  14. passwd
  15. resize—
  16. rmmod—
  17. modinfo—
  18. time—
  19. setup—
  20. setenv—
  21. ulimit
  22. chkconfig—
  23. hwclock—
  24. unalias—

压缩备份类

  1. ar
  2. cpio–
  3. dump–
  4. gzip–
  5. tar
  6. zip
  7. unzip

炫技类

  1. awk–
  2. xargs

炫技 - 快速执行上一条命令

第一种方法:在终端输入两个感叹号,然后回车就可以快速地执行上一条命令了。

1
$ !!

其他

  1. history
  2. ssh
  3. tree

危险命令

  • rm
  • chmod
  • chown
  • hostname
  • reboot
  • poweroff
  • halt
  • shutdown

硬件

  • lscpu
  • lspci
  • reboot
  • poweroff
  • halt
  • shutdown