0%

Linux中最常用的文件操作命令

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

在Linux的庞大世界中,搜索犹如明灯,可以拨开云雾见青天,照亮我们前行大道路。

无论你是在浩瀚的代码库中搜索一个特定的函数,还是在庞大的文件系统中寻找一个文件,搜索命令着实是不可或缺尤为重要的工具。

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


一切皆可查的 find

find命令用来在指定目录下查找文件,功能相当之强大。

官方定义为:

find - search for files in a directory hierarchy

Linux的哲学是一切皆文件,那么find的使命就是一切皆可查

语法

使用语法为:

1
$ find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]

比较常用的几个参数为:

  • -exec <执行指令>:假设find指令的回传值为True,就执行该指令;
  • -size <文件大小>:查找符合指定的文件大小的文件;
  • -mtime <24小时>:查找在指定时间曾被更改过的文件或目录,单位以24小时计算;
    -name<范本样式>:指定字符串作为寻找文件或目录的范本样式;
  • -type <文件类型>:只寻找符合指定的文件类型的文件;

无参数

如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件,并且将查找到的子目录和文件全部进行显示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ ls -l
total 310M
-rw-rw-r-- 1 user user 10M Mar 21 20:01 a
drwxrwxr-x 2 user user 22 Mar 21 20:01 aa
-rw-rw-r-- 1 user user 100M Mar 21 20:01 b
-rw-rw-r-- 1 user user 200M Mar 21 20:01 c


$ find
.
./a
./b
./c
./test

查找小于,等于和大于100MB的文件

通过-size大小来查找文件

1
2
3
4
5
6
7
8
9
10
$ find . -size -100M
.
./a
./aa
$ find . -size 100M
./b
$ find . -size +100M
./c
./aa/d

查找多长时间修改过

可以通过参数-mtime来查找文件的修改时间,比如如下可以查找当前目录下最近60天没有被修改的文件。

1
2
3
4
$ find . -mtime +60

# 最近2天以内未修改
$ find . –mtime -2

稍微复杂但是很有用的命令

我经常把 find 命令和他的选项 exec一起使用,比如我想查找一个目录中的所有文件并将其更改其权限。可以通过以下简单命令完成:

1
$ find /path/ -type f -exec chmod 644 {} \;

这个命令会递归搜索指定目录内/path/下的所有文件,并对找到的文件执行 chmod 命令。

精准快速定位的locate

.. note::

众里寻他千百度,蓦然回首,那人却在灯火阑珊处
-李煜

Linux locate命令用于查找符合条件的文档、程序、目录等等。这个命令会在数据库中查找符合条件的各种信息。

一般情况我们只需要输入 locate name 即可查找。

官方定义为:

locate - list files in databases that match a pattern

使用方法为:

1
2
3
4
$ locate  [-d  path  |  --database=path]  [-e  | -E | --[non-]existing] [-i | --ignore-case] [-0 | --null] [-c |
--count] [-w | --wholename] [-b | --basename] [-l N | --limit=N] [-S | --statistics] [-r | --regex ] [--regex‐
type R] [--max-database-age D] [-P | -H | --nofollow] [-L | --follow] [--version] [-A | --all] [-p | --print]
[--help] pattern...

看着很复杂,不过常用的参数倒是不多,基本为:

  • -n : 至多显示 n个输出。
  • -i, --ignore-case : 忽略大小写

默认无参数

默认情况下,locate直接跟上需要查找的信息就可以了,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ locate set_vis.cpp
/home/user/mycode/src/set_vis.cpp

# 以查找apropos为例
$ locate apropos
/usr/bin/apropos
/usr/local/difmap/help/apropos.hlp
/usr/share/emacs/24.3/lisp/apropos.elc
/usr/share/man/de/man1/apropos.1.gz
/usr/share/man/es/man1/apropos.1.gz
/usr/share/man/fr/man1/apropos.1.gz
/usr/share/man/id/man1/apropos.1.gz
/usr/share/man/it/man1/apropos.1.gz
/usr/share/man/ja/man1/apropos.1.gz
/usr/share/man/man1/apropos.1.gz
/usr/share/man/nl/man1/apropos.1.gz
/usr/share/man/pl/man1/apropos.1.gz
/usr/share/man/ru/man1/apropos.1.gz

太多需要简单化

如果输出的信息很多,仅仅希望看到前面的几个,使用-n参数既可

1
2
3
4
5
# 仅仅查看前的3个
$ locate -n 3 apropos
/usr/bin/apropos
/usr/local/difmap/help/apropos.hlp
/usr/share/emacs/24.3/lisp/apropos.elc

不区分大小写

部分情况下,可能有大小写混淆的情况,此时使用-i参数既可

1
2
3
$ $ locate -i set_vis.cpp
/home/user/mycode/src/set_vis.cpp
/home/user/mycode_CPP/src/set_VIS.cpp

说明

不过刚按照的系统,这个命令并不一定有输出,主要是因为locatefind 不同, find 直接在硬盘找,而locate 只在数据库中查找。

这个数据库在CentOS系统默认的为 /var/lib/mlocate/mlocate.db 中,所以 locate 的查找会比较快,但并一定是实时的,而是以数据库的更新为准。

可以通过下面的命令手工升级数据库 ,命令为:

1
$ updatedb

然后就可以使用了。

文件内容搜索利器 - 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

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的文件管理命令也会帮助你更高效地在终端中操作文件和目录。

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

后记

更多信息请阅读原文。

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则是逻辑上的路径。