0%

终端技巧

打开终端的方式

  1. 鼠标点右键–terminal,即可打开。
  2. 点任务栏的”application”里面的”terminal”打开
  3. 命令方式:Alt+F2后在出现”运行应用程序”中输入x-terminal-emulator(一般在你输入到x-term后系统会自己显示全部)或者输入”gnome-terminal”

使用终端的快捷方式

  • Shift+Ctrl+T:新建标签页
  • Shift+Ctrl+W:关闭标签页
  • Ctrl+PageUp:前一标签页
  • Ctrl+PageDown:后一标签页
  • Shift+Ctrl+PageUp:标签页左移
  • Shift+Ctrl+PageDown:标签页右移
  • Alt+1:切换到标签页1
  • Alt+2:切换到标签页2
  • Alt+3:切换到标签页3
  • Shift+Ctrl+N:新建窗口
  • Shift+Ctrl+Q:关闭终端

终端中的复制/粘贴:

  • Shift+Ctrl+C:复制
  • Shift+Ctrl+V:粘贴

终端改变大小:

  • F11:全屏
  • Ctrl+plus:放大
  • Ctrl+minus:减小
  • Ctrl+0:原始大小

打开多个终端时,要从一个终端转到另外一个终端,可以通过同时按下alt后,再按tab键,按到自己想要的终端后松开,即可跳到想要得终端

通配符 - 命令行的倚天剑、屠龙刀

命令行能干很多GUI图形界面不能做的事情,不知道你的Linux倚天剑、屠龙刀有没有出鞘呢。

很多熟悉Linux命令行的人,对命令行的威力应该叹为观止了。

这其中,我认为通配符,或者广一点来说,正则表达式,真的可以成为天下武林至尊,宝刀屠龙了。

说个最简单的例子

我想拷贝某个文件夹里面的在三个小时内曾经修改过的包含hero的文件。

请大家踊跃发言,如何解决。

下面就说下几个比较常用的通配符。

通配符 匹配项
* 匹配任意多个字符
? 匹配任一单个字符
[characters] 匹配任意一个属于字符集合中的字符
![characters] 匹配任意一个不属于字符集合中的额字符

现在我们执行ls命令,可以看到有下面几个文件:

1
2
ls
ab abb ac ad ae af

实例一 *

匹配任意多个字符

1
2
3
4
5
ls a*
ab abb ac ad ae af
ls ab*
ab abb

实例二 ?

匹配任一单个字符

1
2
3
4
5
ls a?
ab ac ad ae af
ls a??
abb

实例三 [characters]

匹配任意一个属于字符集合中的字符

1
2
➜   ls a[bcd]
ab ac ad

实例四 ![characters]

匹配任意一个不属于字符集合中的额字符

1
2
➜   ls a[!(bcd)]
ae af

通配符 - 命令行的倚天剑、屠龙刀

继续昨天的倚天剑的通配符操作。

为什么分两次:

  • 俺觉得昨天的知道的肯定知道,无外乎复习下
  • 不知道的其实也够一天几分钟的量了

为什么说通配符

  • 后面的很多操作都会用到通配符
  • 通配符不掌握不要说你会用Linux
  • 考虑花几十个tips来说下正则表达式

昨天的都比较简单,今天来点有难度的。

其实我觉得屠龙刀比倚天剑厉害,因为我喜欢灭绝师太,^_^。

首先看下目前文件夹里面都有什么,下面所有的操作都基于这个文件列表:

1
2
➜  ls
1a 1b a12 a123 a13 a14 ab AB abb ABC ac ad ae af b12 b123 b13 b14

实例 [:alnum:] - 匹配任意一个字母或数字

1
2
➜  ls [[:alnum:]]*
1a 1b a12 a123 a13 a14 ab AB abb ABC ac ad ae af b12 b123 b13 b14

实例 [:alpha:] - 匹配任意一个字母

1
2
➜  ls [[:alpha:]]*
a12 a123 a13 a14 ab AB abb ABC ac ad ae af b12 b123 b13 b14

实例 [:digit:] - 匹配任意一个数字

1
2
➜  ls [[:digit:]]*
1a 1b

实例 [:lower:] - 匹配任意一个小写字母

1
2
➜  ls [[:lower:]]*
a12 a123 a13 a14 ab abb ac ad ae af b12 b123 b13 b14

实例 [:upper:] - 匹配任意一个大写字母

1
2
➜  ls [[:upper:]]*
AB ABC

Git Contributor / PR 建议步骤

  1. 首先Fork将要提交的工程,比如原地址为https://github.com/offical/repo.git

  2. clone到本地,并创建一个upstream远程

    1. git clone git@github.com:username/repo.git
    2. git remote add upstream git@github.com:offical/repo.git
  3. 创建自己的特性分支

    1. git checkout -b Name/AmazingFeature
    2. 修改并提交修改 (git commit -m 'Add some AmazingFeature')
    3. 将更新推送到远程分支 (git push origin Name/AmazingFeature)
  4. 登陆到github,提交一个Pull Request到官方repository

  5. 如果PR被接收了,此时可以更新master分支并删除创建的branch

    1. 更新master分支git pull upstream master
    2. 删除branch分支 git branch -D Name/AmazingFeature
  6. 恭喜成为代码贡献者

如果PR出现冲突,解决方式为:

  1. 将源版本库添加为一个远端,并命名为“upstream”(上游)
  2. 从远端抓取最新的内容
  3. 将该仓库的主分支的内容合并到你的分支中
  4. 修复产生的冲突
  5. 再推送回同一个分支

当然,在这个过程中最好不要rebase操作

显示管理磁盘分区 fdisk

.. _linux_fdisk_beginner:

.. note::
浮云一别后,流水十年间。

  • 韦应物《淮上喜会梁川故人 》

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

存同求异 join

.. note::
劝君莫惜金缕衣,劝君惜取少年时。

  • 杜秋娘《金缕衣》

Linux join命令用于将两个文件中指定栏位内容相同的行连接起来。

找出两个文件中,指定栏位内容相同的行,并加以合并,再输出到标准输出设备。

类似于SQL的JOIN操作

官方解释为:

join - join lines of two files on a common field

语法为:

1
$  join [OPTION]... FILE1 FILE2

这个命令的参数还是有一些的,不过基本默认的足够使用了。

join实例

最简单的连接两个文件。

首先看一下两个文件的内容,然后进行join操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 查看file1、file2 的文件内容:
$ cat file1
Zhangsan age 14
Lisi age 15
Wangwu age 16

$ cat file2
Zhangsan score 80
Lisi score 90
Wangwu score 85

# 使用join命令
$ join file1 file2
Zhangsan age 14 score 80
Lisi age 15 score 90
Wangwu age 16 score 85

# 交互两个文件的顺序
$ join file2 file1
Zhangsan score 80 age 14
Lisi score 90 age 15
Wangwu score 85 age 16

可以看到交换顺序对输出是有影响的,会影响到最终的输出内容。

不同的栏内容进行join操作

而如果两个文件的内容不同,那么在进行join操作时会有警告信息输出,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ cat file1       
Jialiu age 15
Zhangsan age 14
Lisi age 15
Wangwu age 16
$ cat file2
Zhangsan score 80
Lisi score 90
Wangwu score 85
Jialiu score 88
$ join file1 file2
join: file1:3: is not sorted: Lisi age 15
join: file2:2: is not sorted: Lisi score 90
Zhangsan age 14 score 80
Lisi age 15 score 90
Wangwu age 16 score 85
$ join file2 file1
join: file2:2: is not sorted: Lisi score 90
join: file1:3: is not sorted: Lisi age 15
Zhangsan score 80 age 14
Lisi score 90 age 15
Wangwu score 85 age 16

为工程生成目标文件

语法:

1
2
3
add_executable(<name> [WIN32] [MACOSX_BUNDLE]
[EXCLUDE_FROM_ALL]
source1 [source2 ...])

简单的例子如下:

1
2
3
add_executable(demo
main.cpp
)

查找库所在目录FIND_LIBRARY

语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
find_library (
<VAR>
name | NAMES name1 [name2 ...] [NAMES_PER_DIR]
[HINTS path1 [path2 ... ENV var]]
[PATHS path1 [path2 ... ENV var]]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[DOC "cache documentation string"]
[NO_DEFAULT_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_CMAKE_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_SYSTEM_PATH]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH]
)

例子如下:

1
FIND_LIBRARY(RUNTIME_LIB mylib /usr/lib  /usr/local/lib NO_DEFAULT_PATH)

cmake会在目录中查找,如果所有目录中都没有,值RUNTIME_LIB就会被赋为NO_DEFAULT_PATH

添加头文件目录INCLUDE_DIRECTORIES

语法:

1
include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])

它相当于g++选项中的-I参数的作用,也相当于环境变量中增加路径到CPLUS_INCLUDE_PATH变量的作用。

1
include_directories(/include/path/)

添加需要链接的库文件目录LINK_DIRECTORIES

语法:

1
link_directories(directory1 directory2 ...)

它相当于g++命令的-L选项的作用,也相当于环境变量中增加LD_LIBRARY_PATH的路径的作用。

1
link_directories("/lib/directory/")

添加需要链接的库文件路径LINK_LIBRARIES

语法:

1
link_libraries(library1 <debug | optimized> library2 ...)

直接是全路径

1
link_libraries(“/home/server/third/lib/libcommon.a”)

下面的例子,只有库名,cmake会自动去所包含的目录搜索

1
link_libraries(iconv)

传入变量

1
link_libraries(${RUNTIME_LIB})

也可以链接多个

1
link_libraries("/the/path/of/lib1.so" "/the/path/of/lib2.so")

可以链接一个,也可以多个,中间使用空格分隔.