0%

基本的导航

如果你只是使用h,j,k,l字符来导航,那你就太弱了,如果让你到有万行代码的第5500行你如何操作呢,如果让你去第10屏你将如何操作呢?下面的几个技巧教你在很少击打键盘情况下非常高效的导航文件内容。

滚动整屏或半屏

请使用下面的页导航按键:

  • CTRL-F 向下滚动整页(Forward)
  • CTRL-B 向上滚动整页(Back)
  • CTRL-D 向下滚动半页(Down)
  • CTRL-U 向上滚动半页(Up)

词导航

  • w 移动到下一个单词的开始
  • W 移动到下一个WORD的开始
  • e 移动到当前单词的结尾
  • E 移动到当前单词的结尾
  • b 移动到前一个词的开始
  • B 移动到前一个词的开始

在一行中特殊位置上的位置光标

  • 0(zero) 移动到当前行的开始位置
  • $(美元符号) 移动到当前行的结束位置
  • ^(…) 移动到当前行的第一个非空字符
  • g_ 移动到当前行的最后一个非空字符

快速跳转至文件首尾

导航键 描述

:0 跳转至文件头–方法1

gg 跳转至文件头–方法2

1G 跳转至文件头–方法3

:$ 跳转至文件尾–方法1

G 跳转至文件尾–方法2

段落、章节和句子导航

  • { 移动到当前段落的开始
  • } 移动到下一个段落的开始
  • [[ 移动到当前章节的开始
  • ]] 移动到下一个章节的开始
  • ( 移动到前一个句子的开始
  • ) 移动到下一个句子的开始

使用CTRL-o和CTRL-I跳转

Vim使用跳转列表来跟踪你的导航,你可以通过这个列表来向前或者向后导航。

跳转列表保留所有地方的轨迹,它可以跟踪文件名、行号和列号。

查看调整列表::jumps

导航键 描述
CTRL-o 跳转到上一个位置点
CTRL-I 跳转到下一个位置点
5CTRL-o 跳转到显示在位置0上面的位置5
5CTRL-I 跳转到显示在位置0下面的位置5

Vim命令行导航

当从命令行打开一个文件,你可以通过指定命令行参数来导航到一个特殊的位置,如下:

导航键 描述
$ vim +142 打开文件到143行
$ vim +/search-term 打开文件移动到向下搜索到指定词语的位置
$ vim +?search-term 打开文件移动到向上搜索到指定词语的位置
$ vim -t TAG 移动到指定的TAG处

在非常长的行中导航

当你遇到非常长的行(没有任何新的行)时,Vim对待它作为单个行。
因此,当你对这一行输入j键后,它将跳到下一行上。然而,你会觉得它跳过了好多行。但实际上它只是跳过一个长行。

可视化行:让我们假设有一个非常长的行,它回绕成5个可视化行。为了讨论的目的,让我们称每一单独的行为可视化行。

下面的快捷方式可以帮我们有效地导航一个非常长的行,只需要在前面的基础上加上一个g即可

导航键 描述
gj 向下滚动一个可视化行
gk 向上滚动一个可视化行
g^ 移动到当前可视化行的开始位置
g$ 移动到当前可视化行的结束位置
gm 移动到当前可视化行的中间位置

文本编辑

下面说明各种改变文件中文本的方法。

描述
cc 改变当前整行;与S键一样, 它会删除掉整行,并且进入到插入模式等待输入新文本
C 从当前光标位置改变当前行, 这会使出当前行中光标位置之后的文本,进入插入模式等待输入新的文本。

替换文本

这个与r的区别是,s会提前删除掉字符然后进入输入模式。

描述
s 使用新的字符替换当前字符
S 使用新的文本替换当前行
4s 使用新的文本替换4个字符(从当前位置开始)
4S 使用新的文本替换4行(从当前行开始)

插入文本

下面解释各种插入文本到文件的方法。

描述
i 在当前位置插入文本
I 在行的开始位置插入文本,键:大写的I,例如India
o 在当前行之后插入一行,并且插入文本,键:小写o,例如:orange
O 在当前行之前插入一行,并且插入文本键:大写O,例如:Orange
:r FILENAME 插入另外一个文件内容到当前文件的当前行之后
:r! COMMAND 插入执行命令的输出到当前文件的当前行之后

例如:你可以插入当前的日期和时间到你编辑的文件中,执行下面的命令:

:r! date

恢复删除的文本

如果你有与误操作删除文本,你可以恢复它。你可以恢复到9个删除文本的片段。

恢复删除 描述
“1p 恢复第一次删除
“2p 恢复第二次到最后一次删除
“3p 恢复第三次到最后一次删除

如果你不确切知道你删除的东西,你可以通过下面的方式浏览所有9次删除的缓冲区。当你看到你希望恢复的文笔,只需要在这一步停止。

浏览所有删除的内容,直到你找到正确的一个。

“1pu.u.u.u.u.

你也可以使用:reg查看寄存器0到9中(删除寄存器)的文本,这会告诉你每个寄存器中使什么内容。

以只读模式打开

使用-R选项在只读模式下打开文件,如下所示:

1
vim -R filename.txt

或者

1
view filename.txt

当你不想编辑一个文件时,使用上面的方法中的一个是习惯问题。这帮助你避免造成不必要的文件修改。

文件保存

当你执行:w时,它会保存文件。
:w的主要问题是当你输入:w时,不管文件有没有改变,它都会更新文件时间戳。

幸运的是,:up可以保存文件,并且只是在文件存在改变时修改时间戳。

可视化模式类型 描述
v 小写的v 开始正常的可视化模式,在可视化模式下使用箭头导航选择文本
V(大写) 开始行可视化模式
CTRL-V 开始可视化块模式

vim 自动补全

自动单词不全

  • CRTL+X CRTL+N :单词前向补全;
  • CRTL+X CRTL+P :单词后向补全;

自动行补全

  • CRTL+X CRTL+L :自动行补全;

自动文件名补全

  • CRTL+X CRTL+F :文件名自动补全;

字典补全

只需要在vimrc中设置:set dictionary+=/usr/share/dict/words即可补全words中的单词。
也可以使用CTRL+X CTRL+K来显示匹配的单词。

词典自动补全

设置:set thesaurus+=/the/path/of/thesaurus文件,然后使用CTRL+X CTRL+T就可以找到相关单词的同义词。

可视化

下面是可视化模式下集中不同的类型:

可视化模式命令 描述
退出可视化模式
d 仅删除高亮的文本,例如,如果只是选择一行的部分,它只是删除该行上选择的部分。
D 删除高亮文本下的行,例如,如果只选择行的部分,它会删除整行。
y 仅拷贝(yank)高亮的文本
Y 拷贝高亮文本所在的行
c 删除高亮文本,进入插入模式
C 删除高亮文本所在的行,进入插入模式

窗口

  • :split file —打开水平的两个窗口
  • :vsplit file —打开垂直的两个窗口
  • CTRL+WW来移动到下一个窗口,或者使用CTRL+W{h/j/k/l}按照方向移动到相应的窗口;
  • CTRL+W (+/-)来增加或减小当前的窗口所占比例大小;
  • :N split filename来打开占用N列的窗口文件。

更改窗口显示标题

:set title titlestring=’I\ am\ coding\ now’

更改配色方案

可以使用:!ls $VIMRUNTIME/colors来查看支持的配色方案并更改。

1
2
3
4
5
6
Press ENTER or type command to continue
README.txt default.vim elflord.vim koehler.vim pablo.vim shine.vim zellner.vim
blue.vim delek.vim evening.vim morning.vim peachpuff.vim slate.vim
darkblue.vim desert.vim industry.vim murphy.vim ron.vim torte.vim

Press ENTER or type command to continue

编辑文件

使用vim –p file1 file2 file3 …. fileN可以打开多个文件,与不加-p的区别在于,这些文件全部显示在一个tab上。

然后我们就可以使用:tabn :tabp来到下一个tab或者上一个tab
可以使用:help tab来查看详情。

如何在插入状态下输入命令

先输入CTRL+O,然后就可以输入命令了,比如5j,就会跳转5行,然后重新进入插入状态。
注意,这里只能执行一次哟。

查看当前文件细节

使用CTRL+G或者gCTRL+G,得到的信息分别为基本信息和更详细信息。

数字增加或减少的快捷键

可以使用CTRL+A或者CTRL+X来将某位数字加1或者减1。

跳转到变量定义处

可以使用gd或者gD来跳转到变量定义处,一个为local定义,一个是global定义,在跳转过程中,会将该变量高亮显示。

标签

使用标签来创建的书签有两种类型的书签:局部书签和全局书签。

这里我们介绍下局部书签:

标签命令 描述
ma 在当前位置处创建一个名为“a”的标签
`a(反引号 a) 跳转到书签“a”的精确位置
‘a(单引号 a) 跳转到包含标签“a”哪行的开始

在单个文件中,当你希望跳转到特殊位置或者行上,你可以使用本地标签。如果你的标签名称是小写字符,那么它是个局部标签。

注意:Vim与Vi不同的是在编辑器推出之后该标签还是存在的,这是一个让许多UNIX用户吃惊的强大特征。

文件加密

在vim中使用:X然后输入密码就可是设置每次打开文件都要输入设置的密码,同时可以使用:set key=来取消密码。

保存会话

如果在编辑当前文件的时候,想编辑另外一个文件,可以使用:mksession来保存当前对话,等回来的时候,重新使用vim –S Session.vim即可打开原来保存的会话,这个会话会保存buffer、窗口大小、自定义选项、文件夹、当前目录等。

在vim中执行shell命令

使用方式为:!cmd即可。

比如在修改源码的时候,我比较喜欢使用:!date这样就可以快速注释修改的时间了。

vimbook–OPL –official publications library

又大概看了一遍VIM-OPL,大概记了一些还不是很熟的知识点。

1 Basic Editing

x—删除字符

u—撤销

Ctrl+U—还原

ZZ—保存退出

o—在当前行下方新建一行

O—在当前行上方新建一行

CTRL+] && CTRL+T:浏览器间前进后退

帮助前缀

What Prefix Example

Normal-mode commands (nothing) :help x

Control character CTRL- :help CTRL-u

Visual-mode commands v :help v_u

Insert-mode commands i :help i_

ex-mode commands : :help :quit

Command-line editing c :help c_

Vim command arguments – :help -r

Options ‘ (both ends) :help ‘textwidth’

​ 特殊键需要使用尖括号括起来,例如向上的键:help

移动到行首行尾

使用$移动到行尾,如果是2$就是移动到当前光标所在的下一行的行尾;

0是移动到行首

^是移动到第一个非空的字符上。

搜索字符

fx:即为从光标开始向前搜索字符x的所在;

Fx:即为从光标开始向后搜索字符x的所在;

与之相同的为tx和Tx,不过只是在前一个字符停下而已。

我在哪里

使用CTRL+G可以显示出你位于那里

向上或向下卷动

CTRL+U:向上移动半屏

CTRL+D:向下移动半屏

组合的威力

如果对于,当光标在<时,使用df>将会把整体删除,然后使用.就可以进行相同的编辑操作。

改变大小写

~

键盘宏–处理更复杂的操作

stdio.h

fcntl.h

unistd.h

stdlib.h

修改为

#include “stdio.h”

#include “fcntl.h”

#include “unistd.h”

#include “stdlib.h”

方法如下:

qa 开始录制宏到寄存器a

^ 移动到行首

i#include “ 在行首插入字符串#include

$ 移动到行尾

a” 在行尾添加”

j 移动到下一行

q 停止录制宏

然后我们就可以使用@a来重复刚才的动作。

输入图标或键盘上没有的符号

可以使用:digraphs来查看可以输入的符号,输入方法为CTRL-Kat****,即可输入@。

正则表达式搜索

/^include:只搜索每行中的第一个include

/include$:只搜索每行中的最后一个include

/^include$:只搜索准确的include,而不显示诸如includeaaa等。

正则表达式总结

x The literal character x

^ 行的开始

$ 行的结尾

. 匹配单个字符

character 诸如.*[]ˆ%/?~$需要来搜索

使用标记mark

  1. 使用:mark a来标记a

  2. 移动到另一个位置

  3. 执行d’a就可以删除从当前位置到a的文本

使用标记的好处是它可以为你一直保持,你可以随时跳转回去。

使用标记后,可以使用y’a来复制当前位置到标记的地方。

!!的妙用

!!date就是把当前 时间插入,同样地!!ls就是把当前文件夹列表的内容插入到当前行。

直接在vim中打开另一个文件

​ 如果你已经使用vim打开了一个文件,又想打开另外一个文件,可以先退出在打开另一个,但是还有一个比较快捷的方法,就是直接:vi filename,就可以自动关闭原来的文件,打开filename。

我位于那个文件

​ 输入:args可以在打开过个文件的时候定位到底在那个文件。

三种visual模式

l V:选择整行;

l v:按照字符选择;

l CTRL+V:矩形块选择;

Visual模式中连接多行

在V模式下,使用J可以连接各行,而gJ可以不让连接的各行有空格。

Visual模式下平移

选定文本后,使用SHIFT+>来平移文本。

多行插入相同文本

使用CTRL+V选定文本后,使用I即可插入在选定的地方插入相同文本(光标其实);而A在选定的区域之后。

如果c程序的后缀名不是c

可以使用:set filetype=c来强制默认为c类型

自动缩进

有三个缩进

l cindent

l smartindent

l autoindent

程序中定位

*:可以定位到光标下的单词;

gd:移动到变量的定义处;

[d:显示宏定义

匹配对

%:用于匹配()、/* */、{}或[];

查找man信息

在关键词上直接敲K就可以打开man帮助信息。

在文件中直接make

我们可以在文件中直接使用:make来编译程序,这样就可以自动定位到错误的地方。:cc可以列出所有的编译信息,:cnext或这:clist可以到下一个报警错误或者列出所有信息。

进入命令行模式

按下Q即可进入。

文本格式命令

:range center/right/left width可以居中

自动补全

我们可以使使用CTRL+N或者CTRL+P来自动搜索匹配的词。

显示字符的ascii码

输入ga就可以显示出光标下字符的各个进制数。

package-cleanup的使用

以前对于多余的内核,都是rpm-grep-remove你懂的,这次发现了这个软件包。神呐,节省了很多时间,只需要package-cleanup –oldkernels就可以把就内核(对于版本升级而言)删除,加上–count参数就可以指定留下几个grub选项,注意最好轻易不要设定1,除非你确定刚升级好的内核是OK的,默认值是2,即会保存前一个内核。

package-cleanup : 用于清理本地安装的RPM软件包

注意:这是一个只对RPM有用的工具,Ubuntu 之类的无法使用。

Fedora系统中package-cleanup是默认安装的,而且manpage也比较好懂,这里挑出几个命令来解释一下。

命令格式:

1
package-cleanup [options] <item …>
  1. 列出与其他RPM没有依赖关系的软件包,又叫叶节点(leaf node),即,没有软件包依赖叶节点。
1
2
3
4
5
6
7
8
9
10
11
12
$ package-cleanup –leaves

libacl-devel-2.2.49-8.fc14.i686
libcap-devel-2.17-1.fc13.i686
libchamplain-gtk-0.6.1-4.fc14.i686
libcurl-devel-7.21.0-5.fc14.i686
libdbi-dbd-mysql-0.8.3-6.fc14.i686
libertas-usb8388-firmware-5.110.22.p23-4.fc13.noarch
libgail-gnome-1.20.3-1.fc14.i686
libgtop2-devel-2.28.2-1.fc14.i686
libidn-devel-1.18-1.fc14.i686
libiodbc-3.52.7-1.fc12.i686

可以看到,列出的都是一些函数库,这些库函数没有被其他程序用到。

  1. 列出当前软件仓库中不再提供支持的本地已安装的软件包。也就是说,列出的软件包将不会再升级。
1
2
3
4
5
6
7
8
9
10
$ package-cleanup –orphans

alchemist-1.0.37-8.fc12.i686
antlr-2.7.7-6.fc12.i686
kernel-2.6.34.7-61.fc13.i686
kernel-devel-2.6.34.7-61.fc13.i686
kmod-nvidia-2.6.34.7-61.fc13.i686-260.19.12-1.fc13.1.i686
schroedinger-1.0.10-1.fc13.i686
system-config-display-2.2-1.fc12.i686
xorg-x11-drv-wacom-0.10.8-2.fc13.i686
  1. 删除旧内核文件(kernel, kernel-devel)。
1
$ package-cleanup –oldkernels

前面一篇文章提到过如何手工删除旧内核文件,这条命令就可以解决了。

可以用参数 “–count ” 指定要保留的内核个数,默认是2。

可以用参数 “–keepdevel” 指定不要删除 kernel-devel 。

例如:

1
$ package-cleanup –oldkernels –count=3 –keepdevel

含义是:保留最近3个内核文件和kernel-devel文件,并删除其余的kernels。

  1. 列出有依赖问题的软件包。
1
2
3
4
5
6
$ package-cleanup –problems

Package alchemist-1.0.37-8.fc12.i686 requires python(abi) = (’0′, ’2.6′, None)
Package alchemist-1.0.37-8.fc12.i686 requires python-abi = (’0′, ’2.6′, None)
Package system-config-display-2.2-1.fc12.i686 requires libpython2.6.so.1.0
Package system-config-display-2.2-1.fc12.i686 requires python(abi) = (’0′, ’2.6′, None)

我的运行结果显示有些软件包需要python 2.6的支持,Fedora 14已经默认安装python 2.7。

  1. 扫描重复安装的RPM软件包。
1
$ package-cleanup –dupes
  1. 扫描重复安装的软件包,并删除老版本的软件包。
1
$ package-cleanup –cleandupes

首先要查看网卡的MAC地址

在终端上输入命令:#ifconfig或者#ifconfig -a,就可以查看到网卡的信息,其中的HWaddr后面的XX:XX:XX:XX:XX:XX就是我们网卡MAC地址。

如何修改Linux/Centos下的MAC地址

linux/Centos下如何临时修改MAC地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1)闭网卡设备

[root@localhost ~]# ifconfig eth0 down

2)修改MAC地址

  [root@localhost ~]#ifconfig eth0 hw ether MAC地址(此处添加你要修改的MAC地址)

3)重启网卡

[root@localhost ~]#ifconfig eth0 up

4)查看修改是否生效:

[root@localhost ~]#ifconfig eth0 | grep HWaddr

注意:上述修改MAC地址只是暂时的,系统重启后,系统会恢复原物理MAC地址。

Linux/Centos下如何永久的修改MAC地址

永久修改MAC信息,在每次系统启动的时候自动更新MAC地址:

打开/etc/rc.d/rc.local ,追加三行内容:

1
2
3
4
5
6
ifconfig eth0 down

ifconfig eth0 hw ether XX:XX:XX:XX:XX:XX

ifconfig eth0 up

然后重启电脑就可以完成修改。

Linux 安装 manual

man 命令提供有关主题的参考信息,例如命令、子例程和文件。man 命令提供由名称指定的对命令的单行描述。man 命令也提供所有命令的信息,这些命令的描述包含用户指定的关键字集合。

大部分系统都会预装相关的程序,如果使用docker来pull的系统,并一定具备,此时需要安装一下即可。

对于Debian系列的,可以使用

1
$ sudo apt-get install manpages-dev

对于Redhat系列的,可以使用

1
$ sudo yum install man-pages

Redhat系列中,有一个Development Tools组包,特别适合开发运维人员,可以通过下面的命令来安装

1
$ sudo yum groupinstall "Development Tools"

man不同的数字

man 命令格式化指定的手册页面集合。如果为 Section 参数指定一个段,那么 man 命令在手册页面的该段中搜索 Title 参数指定的标题。Section 参数的值可以是 1 到 8 的阿拉伯数字或字母。

Section 数字是:

  • 1 表示用户命令和守护进程。
  • 2 表示系统调用和内核服务。
  • 3 表示函数或者函数库。
  • 4 表示特殊文件、设备驱动程序和硬件。
  • 5 表示配置文件。
  • 6 表示游戏。
  • 7 表示杂项命令。
  • 8 表示管理命令和守护进程。
  • 9 表示和内核相关的文件

此时使用whatis命令,参考whatis命令,

1
2
3
4
5
6
$ whatis read
read (1) - bash built-in commands, see bash(1)
read (1p) - read a line from standard input
read (2) - read from a file descriptor
read (3p) - read from a file
read (n) - Read from a channel

此时可以看到搜索到很多read的命令,而此时可以通过在man命令的后面跟上数字来搜索相关的内容,默认显示1,及bash内建的命令。

比如此时希望了解系统调用和内核服务,即2,此时的命令为:

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

READ(2) Linux Programmer's Manual READ(2)

NAME
read - read from a file descriptor

SYNOPSIS
#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);

DESCRIPTION
read() attempts to read up to count bytes from file descriptor fd into the buffer starting at buf.

On files that support seeking, the read operation commences at the current file offset, and the file offset
is incremented by the number of bytes read. If the current file offset is at or past the end of file, no
bytes are read, and read() returns zero.

If count is zero, read() may detect the errors described below. In the absence of any errors, or if read()
does not check for errors, a read() with a count of 0 returns zero and has no other effects.

If count is greater than SSIZE_MAX, the result is unspecified.

Linus Torvalds 关闭了合并窗口,发布了Linux 3.11-rc1,同时正式将代号从Unicycling Gorilla改为Linux For Workgroups,并递交了一个替代的企鹅吉祥物logo(如图)。Linux For Workgroups这个代号应该对应的是1990年代初的Windows for Workgroups扩展,微软在1993年8月11日发布了Windows 3.11及其扩展Windows for Workgroups 3.11,企鹅上飘扬着视窗旗帜的恶搞logo不知道会不会遭到微软的反击?

在配置网络的时候出现No such device eth0,可能的原因是可能更换了网卡或者硬盘,而系统记录还保留在原来的网卡配置信息上,导致无法判断到相应的网卡。

解决方法为:

1
rm /etc/udev/rules.d/70-persistent-net.rules

然后重启即可解决。

此时在使用service network restart应该就可以了。

非交互的下载工具 wget

Linux系统中的wget是一个下载文件📀的命令行工具,特别普遍 。

对于Linux用户是必不可少的工具,对于经常要下载一些软件或从远程服务器恢复备份到本地服务器,这个命令尤为重要。

wget支持很多协议,比如HTTPHTTPSFTP协议,还可以使用HTTP代理。

wget的有诸多特点,比如

  • 自动下载 wget支持自动下载,即wget可以在用户退出系统的之后在后台执行。这意味着你可以登录系统,启动一个wget下载任务,然后退出系统,wget将在后台执行直到任务完成,这是个牛气冲天的功能。
  • 完全重建 wget 可以跟踪HTML页面上的链接依次下载来创建远程服务器的本地版本,完全重建原始站点的目录结构。这又常被称作”递归下载”。在递归下载的时候,wget 遵循Robot Exclusion标准(/robots.txt). wget可以在下载的同时,将链接转换成指向本地文件,以方便离线浏览。
  • 高稳定 wget 非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性.如果是由于网络的原因下载失败,wget会不断地尝试,直到整个文件下载完毕。如果是服务器打断下载过程,它会再次联到服务器上从停止的地方继续下载。这对从那些限定了链接时间的服务器上下载大文件非常有用。

命令格式

1
$ wget [参数] [URL地址]

用于从网络上下载资源,没有指定目录,下载资源会默认为当前目录。wget虽然功能强大,但是使用起来还是比较简单:

使用范例

wget的命令参数很多,不过常用的为下面几个,详细的可以看进阶。

使用wget下载单个文件

比如,我们下载个Ubuntu的最新版本,试下效果如何

1
$ wget http://releases.ubuntu.com/16.04/ubuntu-16.04-desktop-amd64.iso

在下载的过程中会显示进度条,包含(下载完成百分比,已经下载的字节,当前下载速度,剩余下载时间)。

使用wget -O下载并以不同的文件名保存

这个对于动态链接的下载比较有用,特别是有些文件的名字实在是太……………….长了

1
$ wget -O wordpress.zip http://www.ubuntu.com/download.aspx?id=1234

使用wget -c断点续传

1
2
3
4
5
$ wget -c http://releases.ubuntu.com/16.04/ubuntu-16.04-desktop-amd64.iso

# or

$ wget --continue http://releases.ubuntu.com/16.04/ubuntu-16.04-desktop-amd64.iso

使用wget -c重新启动下载中断的文件,对于我们下载大文件时突然由于网络等原因中断非常有帮助,我们可以继续接着下载而不是重新下载一个文件。需要继续中断的下载时可以使用-c参数。

使用wget -o把下载信息存入日志文件

1
$ wget -o download.log URL

不希望下载信息直接显示在终端而是在一个日志文件,可以使用,特别注意需要与-O来区分开~

Linux 之 wget 下载命令

Linux系统中的wget是一个下载文件📀的命令行工具,特别普遍 。

对于Linux用户是必不可少的工具,对于经常要下载一些软件或从远程服务器恢复备份到本地服务器,这个命令尤为重要。

wget支持很多协议,比如HTTPHTTPSFTP协议,还可以使用HTTP代理。

wget的特点

自动下载

wget支持自动下载,即wget可以在用户退出系统的之后在后台执行。这意味着你可以登录系统,启动一个wget下载任务,然后退出系统,wget将在后台执行直到任务完成,这是个牛气冲天的功能。

完全重建

wget 可以跟踪HTML页面上的链接依次下载来创建远程服务器的本地版本,完全重建原始站点的目录结构。这又常被称作”递归下载”。在递归下载的时候,wget 遵循Robot Exclusion标准(/robots.txt). wget可以在下载的同时,将链接转换成指向本地文件,以方便离线浏览。

高稳定

wget 非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性.如果是由于网络的原因下载失败,wget会不断地尝试,直到整个文件下载完毕。如果是服务器打断下载过程,它会再次联到服务器上从停止的地方继续下载。这对从那些限定了链接时间的服务器上下载大文件非常有用。

命令格式

1
$ wget [参数] [URL地址]

用于从网络上下载资源,没有指定目录,下载资源会默认为当前目录。wget虽然功能强大,但是使用起来还是比较简单:

使用范例

wget的命令参数很多,不过常用的为下面几个,详细的可以看进阶。

使用wget下载单个文件

比如,我们下载个Ubuntu的最新版本,试下效果如何

1
$ wget http://releases.ubuntu.com/16.04/ubuntu-16.04-desktop-amd64.iso

在下载的过程中会显示进度条,包含(下载完成百分比,已经下载的字节,当前下载速度,剩余下载时间)。

使用wget -O下载并以不同的文件名保存

这个对于动态链接的下载比较有用,特别是有些文件的名字实在是太……………….长了

1
$ wget -O wordpress.zip http://www.ubuntu.com/download.aspx?id=1234

使用wget -c断点续传

1
$ wget -c http://releases.ubuntu.com/16.04/ubuntu-16.04-desktop-amd64.iso

使用wget -c重新启动下载中断的文件,对于我们下载大文件时突然由于网络等原因中断非常有帮助,我们可以继续接着下载而不是重新下载一个文件。需要继续中断的下载时可以使用-c参数。

使用wget -o把下载信息存入日志文件

1
$ wget -o download.log URL

不希望下载信息直接显示在终端而是在一个日志文件,可以使用,特别注意需要与-O来区分开~

使用wget 下载网站上的所有文件

1
$ wget -r -np -nd http://example.com/packages/	

这条命令可以下载 http://example.com 网站上 packages 目录中的所有文件。其中,-np 的作用是不遍历父目录,-nd 表示不在本机重新创建目录结构。

支持扩展名

1
$ wget -r -np -nd --accept=iso http://example.com/centos-5/i386/

与上一条命令相似,但多加了一个 –accept=iso 选项,这指示wget仅下载 i386 目录中所有扩展名为 iso 的文件。你也可以指定多个扩展名,只需用逗号分隔即可。

镜像一个网站

1
$ wget -m -k (-H) http://www.example.com/

该命令可用来镜像一个网站,wget将对链接进行转换。如果网站中的图像是放在另外的站点,那么可以使用 -H 选项。

使用wget –limit -rate限速下载

1
$ wget --limit-rate=300k http://releases.ubuntu.com/16.04/ubuntu-16.04-desktop-amd64.iso

当你执行wget的时候,它默认会占用全部可能的宽带下载。但是当你准备下载一个大文件,而你还需要下载其它文件时就有必要限速了。

使用wget -b后台下载

1
$ wget -b http://releases.ubuntu.com/16.04/ubuntu-16.04-desktop-amd64.iso

对于下载非常大的文件的时候,我们可以使用参数-b进行后台下载。

1
2
3
$ wget -b http://releases.ubuntu.com/16.04/ubuntu-16.04-desktop-amd64.iso
Continuing in background, pid 1840.
Output will be written to `wget-log'.

你可以使用以下命令来察看下载进度:

1
tail -f wget-log

使用wget –tries增加重试次数

1
wget --tries=40 URL

如果网络有问题或下载一个大文件也有可能失败。wget默认重试20次连接下载文件。如果需要,你可以使用–tries增加重试次数。

使用wget -i下载多个文件

1
wget -i filelist.txt

首先,保存一份下载链接文件

1
2
3
4
5
cat > filelist.txt
url1
url2
url3
url4

接着使用这个文件和参数-i下载

使用wget –reject过滤指定格式下载

1
wget --reject=gif ur

下载一个网站,但你不希望下载图片,可以使用以下命令。

使用wget -Q限制总下载文件大小

1
wget -Q5m -i filelist.txt

当你想要下载的文件超过5M而退出下载,你可以使用。注意:这个参数对单个文件下载不起作用,只能递归下载时才有效。

使用wget -r -A下载指定格式文件

1
wget -r -A .pdf url

可以在以下情况使用该功能:

  • 下载一个网站的所有图片
  • 下载一个网站的所有视频
  • 下载一个网站的所有PDF文件

使用wget -P下载文件到指定目录

默认情况下,wget会将文件下载到当前目录,并且都是非交互静默发生的,我们这里使用-P或者--directory-prefix参数来指出特定目录,避免了下载后需要再次移动的操作。

如下所示,我们这里使用wget下载一个wget的最新源码包到/tmp/wget目录。

1
2
$ mkdir /tmp/wget
$ wget -P /tmp/wget https://ftp.gnu.org/gnu/wget/wget-1.19.tar.gz

使用wget FTP下载

可以使用wget来完成ftp链接的下载。

使用wget匿名ftp下载:

1
wget ftp-url

使用wget用户名和密码认证的ftp下载

1
wget --ftp-user=USERNAME --ftp-password=PASSWORD url

使用wget递归下载某目录下的所有文件

1
2
3
$ wget -c -r -k -p url
or
$ wget -c -r -nd -np -k -L -p -A c,h url
  • -c 断点续传
  • -r 递归下载,下载指定网页某一目录下(包括子目录)的所有文件
  • -nd 递归下载时不创建一层一层的目录,把所有的文件下载到当前目录
  • -np 递归下载时不搜索上层目录。如wget -c -r www.xxx.org/pub/path/ 没有加参数-np,就会同时下载path的上一级目录pub下的其它文件
  • -k 将绝对链接转为相对链接,下载整个站点后脱机浏览网页,最好加上这个参数
  • -L 递归时不进入其它主机,如wget -c -r www.xxx.org/ 如果网站内有一个这样的链接: www.yyy.org,不加参数-L,就会像大火烧山一样,会递归下载www.yyy.org网站
  • -p 下载网页所需的所有文件,如图片等
  • -A 指定要下载的文件样式列表,多个样式用逗号分隔
  • -i 后面跟一个文件,文件内指明要下载的URL。

命令参数全

启动参数

  • -V, –version 显示wget的版本后退出
  • -h, –help 打印语法帮助
  • -b, –background 启动后转入后台执行
  • -e, –execute=COMMAND 执行.wgetrc格式的命令,wgetrc格式参见/etc/wgetrc或~/.wgetrc

记录和输入文件参数:

  • -o, –output-file=FILE 把记录写到FILE文件中
  • -a, –append-output=FILE 把记录追加到FILE文件中
  • -d, –debug 打印调试输出
  • -q, –quiet 安静模式(没有输出)
  • -v, –verbose 冗长模式(这是缺省设置)
  • -nv, –non-verbose 关掉冗长模式,但不是安静模式
  • -i, –input-file=FILE 下载在FILE文件中出现的URLs
  • -F, –force-html 把输入文件当作HTML格式文件对待
  • -B, –base=URL 将URL作为在-F -i参数指定的文件中出现的相对链接的前缀
  • –sslcertfile=FILE 可选客户端证书
  • –sslcertkey=KEYFILE 可选客户端证书的KEYFILE
  • –egd-file=FILE 指定EGD socket的文件名

下载参数

  • –bind-address=ADDRESS 指定本地使用地址(主机名或IP,当本地有多个IP或名字时使用)
  • -t, –tries=NUMBER 设定最大尝试链接次数(0 表示无限制).
  • -O –output-document=FILE 把文档写到FILE文件中
  • -nc, –no-clobber 不要覆盖存在的文件或使用.#前缀
  • -c, –continue 接着下载没下载完的文件
  • –progress=TYPE 设定进程条标记
  • -N, –timestamping 不要重新下载文件除非比本地文件新
  • -S, –server-response 打印服务器的回应
  • –spider 不下载任何东西
  • -T, –timeout=SECONDS 设定响应超时的秒数
  • -w, –wait=SECONDS 两次尝试之间间隔SECONDS秒
  • –waitretry=SECONDS 在重新链接之间等待1…SECONDS秒
  • –random-wait 在下载之间等待0…2*WAIT秒
  • -Y, –proxy=on/off 打开或关闭代理
  • -Q, –quota=NUMBER 设置下载的容量限制
  • –limit-rate=RATE 限定下载输率

目录参数

  • -nd –no-directories 不创建目录
  • -x, –force-directories 强制创建目录
  • -nH, –no-host-directories 不创建主机目录
  • -P, –directory-prefix=PREFIX 将文件保存到目录 PREFIX/…
  • –cut-dirs=NUMBER 忽略 NUMBER层远程目录

HTTP 选项参数:

  • –http-user=USER 设定HTTP用户名为 USER.
  • –http-passwd=PASS 设定http密码为 PASS
  • -C, –cache=on/off 允许/不允许服务器端的数据缓存 (一般情况下允许)
  • -E, –html-extension 将所有text/html文档以.html扩展名保存
  • –ignore-length 忽略 Content-Length头域
  • –header=STRING 在headers中插入字符串 STRING
  • –proxy-user=USER 设定代理的用户名为 USER
  • –proxy-passwd=PASS 设定代理的密码为 PASS
  • –referer=URL 在HTTP请求中包含 Referer: URL
  • -s, –save-headers 保存HTTP头到文件
  • -U, –user-agent=AGENT 设定代理的名称为 AGENT而不是 Wget/VERSION
  • –no-http-keep-alive 关闭 HTTP活动链接 (永远链接)
  • –cookies=off 不使用 cookies
  • –load-cookies=FILE 在开始会话前从文件 FILE中加载cookie
  • –save-cookies=FILE 在会话结束后将 cookies保存到 FILE文件中

FTP 选项参数

  • -nr, –dont-remove-listing 不移走 .listing文件
  • -g, –glob=on/off 打开或关闭文件名的 globbing机制
  • –passive-ftp 使用被动传输模式 (缺省值).
  • –active-ftp 使用主动传输模式
  • –retr-symlinks 在递归的时候,将链接指向文件(而不是目录)

递归下载参数

  • -r, –recursive 递归下载--慎用!
  • -l, –level=NUMBER 最大递归深度 (inf 或 0 代表无穷)
  • –delete-after 在现在完毕后局部删除文件
  • -k, –convert-links 转换非相对链接为相对链接
  • -K, –backup-converted 在转换文件X之前,将之备份为 X.orig
  • -m, –mirror 等价于 -r -N -l inf -nr
  • -p, –page-requisites 下载显示HTML文件的所有图片

递归下载中的包含和不包含(accept/reject)

  • -A, –accept=LIST 分号分隔的被接受扩展名的列表
  • -R, –reject=LIST 分号分隔的不被接受的扩展名的列表
  • -D, –domains=LIST 分号分隔的被接受域的列表
  • –exclude-domains=LIST 分号分隔的不被接受的域的列表
  • –follow-ftp 跟踪HTML文档中的FTP链接
  • –follow-tags=LIST 分号分隔的被跟踪的HTML标签的列表
  • -G, –ignore-tags=LIST 分号分隔的被忽略的HTML标签的列表
  • -H, –span-hosts 当递归时转到外部主机
  • -L, –relative 仅仅跟踪相对链接
  • -I, –include-directories=LIST 允许目录的列表
  • -X, –exclude-directories=LIST 不被包含目录的列表
  • -np, –no-parent 不要追溯到父目录
  • wget -S –spider url 不下载只显示过程

指定用户名密码下载

部分网站可能需要用户名密码才能下载,如果是自己的机器,可以使用下面的命令

1
$ wget --username user --passwd password http://example.com/filenam

其中的username和passwd分别为用户名和密码。

但是如果是公用服务器就有一个风险,别人可以看到这些信息,所以此时,可以通过下面的命令,手动输入密码:

1
2
3
$ wget --user=username --ask-password http://example.com/filename

Password for user `username`:[SECRET (not visible)]

此时输入密码就万无一失了。

命令格式

1
wget [参数] [URL地址]

用于从网络上下载资源,没有指定目录,下载资源回默认为当前目录。wget虽然功能强大,但是使用起来还是比较简单:

wget下面的特点是使用它主要考虑的方面:

  1. 支持断点下传功能,可以让网络不是太好的用户可以放心了
  2. 同时支持FTP和HTTP下载方式;尽管现在大部分软件可以使用HTTP方式下载,但是,有些时候,仍然需要使用FTP方式下载软件
  3. 支持代理服务器
  4. 设置方便简单;可能,习惯图形界面的用户已经不是太习惯命令行了,但是,命令行在设置上其实有更多的优点,最少,鼠标可以少点很多次,也不要担心是否错点鼠标
  5. 程序小,完全免费

使用范例

wget的命令参数很多,不过常用的为下面几个,详细的可以看最后。

使用wget下载单个文件

比如,我们下载个Ubuntu的最新版本,试下效果如何

1
wget http://releases.ubuntu.com/16.04/ubuntu-16.04-desktop-amd64.iso

在下载的过程中会显示进度条,包含(下载完成百分比,已经下载的字节,当前下载速度,剩余下载时间)。

使用wget -O下载并以不同的文件名保存

这个对于动态链接的下载比较有用

1
wget -O wordpress.zip http://www.ubuntu.com/download.aspx?id=1234

使用wget –limit -rate限速下载

1
wget --limit-rate=300k http://releases.ubuntu.com/16.04/ubuntu-16.04-desktop-amd64.iso

当你执行wget的时候,它默认会占用全部可能的宽带下载。但是当你准备下载一个大文件,而你还需要下载其它文件时就有必要限速了。

使用wget -c断点续传

1
wget -c http://releases.ubuntu.com/16.04/ubuntu-16.04-desktop-amd64.iso

使用wget -c重新启动下载中断的文件,对于我们下载大文件时突然由于网络等原因中断非常有帮助,我们可以继续接着下载而不是重新下载一个文件。需要继续中断的下载时可以使用-c参数。

使用wget -b后台下载

1
wget -b http://releases.ubuntu.com/16.04/ubuntu-16.04-desktop-amd64.iso

对于下载非常大的文件的时候,我们可以使用参数-b进行后台下载。

1
wget -b http://releases.ubuntu.com/16.04/ubuntu-16.04-desktop-amd64.iso Continuing in background, pid 1840. Output will be written to `wget-log'.

你可以使用以下命令来察看下载进度:

1
tail -f wget-log

使用wget –tries增加重试次数

1
wget --tries=40 URL

如果网络有问题或下载一个大文件也有可能失败。wget默认重试20次连接下载文件。如果需要,你可以使用–tries增加重试次数。

使用wget -i下载多个文件

1
wget -i filelist.txt

首先,保存一份下载链接文件

1
cat > filelist.txt url1 url2 url3 url4

接着使用这个文件和参数-i下载

使用wget –reject过滤指定格式下载

1
wget --reject=gif ur

下载一个网站,但你不希望下载图片,可以使用以下命令。

使用wget -o把下载信息存入日志文件

1
wget -o download.log URL

不希望下载信息直接显示在终端而是在一个日志文件,可以使用

使用wget -Q限制总下载文件大小

1
wget -Q5m -i filelist.txt

当你想要下载的文件超过5M而退出下载,你可以使用。注意:这个参数对单个文件下载不起作用,只能递归下载时才有效。

使用wget -r -A下载指定格式文件

1
wget -r -A.pdf url

可以在以下情况使用该功能:

  • 下载一个网站的所有图片
  • 下载一个网站的所有视频
  • 下载一个网站的所有PDF文件

使用wget FTP下载

可以使用wget来完成ftp链接的下载。

使用wget匿名ftp下载:

1
wget ftp-url

使用wget用户名和密码认证的ftp下载

1
wget --ftp-user=USERNAME --ftp-password=PASSWORD url

-

更详细的命令阅读原文吧…

cpgpanl – 切换到当前视图的不同面板

对应的C函数为

1
void cpgpanl(int nxc, int nyc);

开始在一个不同的面板作图。如果视口被PGBEG 或者PGSUBP划分为几个子窗口,
这个函数可以移动到一个不同的面板。

注:PGPLOT不记录使用哪个视口和窗口。需要通过PGPANL来设定。
PGPLOT不清空这个面板,在调用PGPANL再调用PGERAS来清空面板。

参数:

  • IX (输入) : 水平索引值
  • IY (输入) : 垂直索引值

cpgpage – 前进到新的页面

对应的C函数为

1
void cpgpage(void);

在一个新页或者面板显示图形,如果需要也可以清空屏幕。
如果“提示状态”是打开的(参考PGASK),那么清空屏幕前需要用户的确认。
如果视图被PGBEG 或 PGSUBP 分成了几个子面板,PGPAGE将前进到下一个面板,如果当前的面板已经是最后一个了,
那么PGPAGE将清空屏幕或者打开一个新的页。PGPAGE不会改变PGPLOT的窗口或视图,
但是如果由于设备的不同,
而导致的视图面的大小改变,PGPAGE将同比例改变。
参数: 无