snjl

我大概率会编程。


  • 首页

  • 标签

  • 分类

  • 归档

  • 搜索

调试

发表于 2019-01-31 | 分类于 python
字数统计: 1.3k 字 | 阅读时长 ≈ 5 分钟

程序能一次写完并正常运行的概率很小,基本不超过1%。总会有各种各样的bug需要修正。有的bug很简单,看看错误信息就知道,有的bug很复杂,我们需要知道出错时,哪些变量的值是正确的,哪些变量的值是错误的,因此,需要一整套调试程序的手段来修复bug。

第一种方法简单直接粗暴有效,就是用print()把可能有问题的变量打印出来看看:

1
2
3
4
5
6
7
8
9
10

def foo(s):
n = int(s)
print('>>> n = %d' % n)
return 10 / n

def main():
foo('0')

main()

执行后在输出中查找打印的变量值:

1
2
3
4
5
6

$ python err.py
>>> n = 0
Traceback (most recent call last):
...
ZeroDivisionError: integer division or modulo by zero

用print()最大的坏处是将来还得删掉它,想想程序里到处都是print(),运行结果也会包含很多垃圾信息。所以,我们又有第二种方法。

断言

凡是用print()来辅助查看的地方,都可以用断言(assert)来替代:

1
2
3
4
5
6
7
8

def foo(s):
n = int(s)
assert n != 0, 'n is zero!'
return 10 / n

def main():
foo('0')

assert的意思是,表达式n != 0应该是True,否则,根据程序运行的逻辑,后面的代码肯定会出错。

如果断言失败,assert语句本身就会抛出AssertionError:

1
2
3
4
5

$ python err.py
Traceback (most recent call last):
...
AssertionError: n is zero!

程序中如果到处充斥着assert,和print()相比也好不到哪去。不过,启动Python解释器时可以用-O参数来关闭assert:

1
2
3
4
5

$ python -O err.py
Traceback (most recent call last):
...
ZeroDivisionError: division by zero

关闭后,你可以把所有的assert语句当成pass来看。

logging

把print()替换为logging是第3种方式,和assert比,logging不会抛出错误,而且可以输出到文件:

1
2
3
4
5
6
7

import logging

s = '0'
n = int(s)
logging.info('n = %d' % n)
print(10 / n)

logging.info()就可以输出一段文本。运行,发现除了ZeroDivisionError,没有任何信息。怎么回事?

别急,在import logging之后添加一行配置再试试:

1
2
3

import logging
logging.basicConfig(level=logging.INFO)

看到输出了:

1
2
3
4
5
6
7

$ python err.py
INFO:root:n = 0
Traceback (most recent call last):
File "err.py", line 8, in <module>
print(10 / n)
ZeroDivisionError: division by zero

这就是logging的好处,它允许你指定记录信息的级别,有debug,info,warning,error等几个级别,当我们指定level=INFO时,logging.debug就不起作用了。同理,指定level=WARNING后,debug和info就不起作用了。这样一来,你可以放心地输出不同级别的信息,也不用删除,最后统一控制输出哪个级别的信息。

logging的另一个好处是通过简单的配置,一条语句可以同时输出到不同的地方,比如console和文件。

pdb

第4种方式是启动Python的调试器pdb,让程序以单步方式运行,可以随时查看运行状态。我们先准备好程序:

1
2
3
4
5

# err.py
s = '0'
n = int(s)
print(10 / n)

然后启动:

1
2
3
4

$ python -m pdb err.py
> /Users/michael/Github/learn-python3/samples/debug/err.py(2)<module>()
-> s = '0'

以参数-m pdb启动后,pdb定位到下一步要执行的代码-> s = ‘0’。输入命令l来查看代码:

1
2
3
4
5
6

(Pdb) l
1 # err.py
2 -> s = '0'
3 n = int(s)
4 print(10 / n)

输入命令n可以单步执行代码:

1
2
3
4
5
6
7

(Pdb) n
> /Users/michael/Github/learn-python3/samples/debug/err.py(3)<module>()
-> n = int(s)
(Pdb) n
> /Users/michael/Github/learn-python3/samples/debug/err.py(4)<module>()
-> print(10 / n)

任何时候都可以输入命令p 变量名来查看变量:

1
2
3
4
5

(Pdb) p s
'0'
(Pdb) p n
0

输入命令q结束调试,退出程序:

1
2

(Pdb) q

这种通过pdb在命令行调试的方法理论上是万能的,但实在是太麻烦了,如果有一千行代码,要运行到第999行得敲多少命令啊。还好,我们还有另一种调试方法。

1
2

pdb.set_trace()

这个方法也是用pdb,但是不需要单步执行,我们只需要import pdb,然后,在可能出错的地方放一个pdb.set_trace(),就可以设置一个断点:

1
2
3
4
5
6
7
8

# err.py
import pdb

s = '0'
n = int(s)
pdb.set_trace() # 运行到这里会自动暂停
print(10 / n)

运行代码,程序会自动在pdb.set_trace()暂停并进入pdb调试环境,可以用命令p查看变量,或者用命令c继续运行:

1
2
3
4
5
6
7
8
9
10
11

$ python err.py
> /Users/michael/Github/learn-python3/samples/debug/err.py(7)<module>()
-> print(10 / n)
(Pdb) p n
0
(Pdb) c
Traceback (most recent call last):
File "err.py", line 7, in <module>
print(10 / n)
ZeroDivisionError: division by zero

这个方式比直接启动pdb单步调试效率要高很多,但也高不到哪去。

IDE

如果要比较爽地设置断点、单步执行,就需要一个支持调试功能的IDE。目前比较好的Python IDE有:

Visual Studio Code:https://code.visualstudio.com/,需要安装Python插件。

PyCharm:http://www.jetbrains.com/pycharm/

另外,Eclipse加上pydev插件也可以调试Python程序。

小结

写程序最痛苦的事情莫过于调试,程序往往会以你意想不到的流程来运行,你期待执行的语句其实根本没有执行,这时候,就需要调试了。

虽然用IDE调试起来比较方便,但是最后你会发现,logging才是终极武器。

scrapy命令行

发表于 2019-01-31 | 分类于 scrapy , 爬虫
字数统计: 769 字 | 阅读时长 ≈ 3 分钟

命令行输入scrapy,输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Usage:
scrapy <command> [options] [args]

Available commands:
bench Run quick benchmark test
commands
fetch Fetch a URL using the Scrapy downloader
genspider Generate new spider using pre-defined templates
runspider Run a self-contained spider (without creating a project)
settings Get settings values
shell Interactive scraping console
startproject Create new project
version Print Scrapy version
view Open URL in browser, as seen by Scrapy

[ more ] More commands available when run from project directory

Use "scrapy <command> -h" to see more info about a command

以下介绍常用的。

创建项目

1
scrapy startproject myproject [ project_dir ]

这将在该project_dir目录下创建一个Scrapy项目。如果project_dir没有指定,project_dir将会和myproject名称一样。

接下来,进入新的项目目录:

1
cd project_dir

创建爬虫

1
scrapy genspider mydomain mydomain.com

通过上述命令创建了一个spider name为mydomain的爬虫,start_urls为http://www.cnblogs.com/的爬虫。

启动爬虫

1
scrapy crawl <spider>

检查爬虫

1
scrapy check [-l] <spider>

示例

1
2
3
4
5
6
C:\shu_item\tutorial>scrapy check quotes

----------------------------------------------------------------------
Ran 0 contracts in 0.000s

OK

列出爬虫

1
scrapy list

列出当前项目中的所有可用爬虫。每行输出一个爬虫。

打开shell

1
scrapy shell [url]

参数

1
2
3
--spider=SPIDER:绕过爬虫自动检测和强制使用特定的爬虫
-c code:评估shell中的代码,打印结果并退出
--no-redirect:不遵循HTTP 3xx重定向(默认是遵循它们); 这只影响你可以在命令行上作为参数传递的URL; 一旦你在shell中,fetch(url)默认情况下仍然会遵循HTTP重定向。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ scrapy shell http://www.example.com/some/page.html
[ ... scrapy shell starts ... ]

$ scrapy shell --nolog http://www.example.com/ -c '(response.status, response.url)'
(200, 'http://www.example.com/')

# shell follows HTTP redirects by default
$ scrapy shell --nolog http://httpbin.org/redirect-to?url=http%3A%2F%2Fexample.com%2F -c '(response.status, response.url)'
(200, 'http://example.com/')

# you can disable this with --no-redirect
# (only for the URL passed as command line argument)
$ scrapy shell --no-redirect --nolog http://httpbin.org/redirect-to?url=http%3A%2F%2Fexample.com%2F -c '(response.status, response.url)'
(302, 'http://httpbin.org/redirect-to?url=http%3A%2F%2Fexample.com%2F')

view

1
scrapy view <url>

在浏览器中打开给定的URL,并以Scrapy spider获取到的形式展现。 有些时候spider获取到的页面和普通用户看到的并不相同。 因此该命令可以用来检查spider所获取到的页面,并确认这是您所期望的。

例如,访问淘宝,就会发现很多内容是ajax加载的,实际上写在页面中的基本只有一个模版。

1
scarpy view http://www.taobao.com

version

1
scrapy version [-v]

输出Scrapy版本。配合 -v 运行时,该命令同时输出Python, Twisted以及平台的信息,方便bug提交。
示例

1
2
3
4
5
6
7
8
9
10
11
12
λ scrapy version -v
Scrapy : 1.5.0
lxml : 4.2.1.0
libxml2 : 2.9.5
cssselect : 1.0.3
parsel : 1.4.0
w3lib : 1.19.0
Twisted : 17.9.0
Python : 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:54:40) [MSC v.1900 64 bit (AMD64)]
pyOpenSSL : 17.5.0 (OpenSSL 1.1.0h 27 Mar 2018)
cryptography : 2.2.2
Platform : Windows-10-10.0.17134-SP0

bench测试

1
scrapy bench

测试当前爬行速度,运行性能等。

settings

1
scrapy settings [options]

在项目中运行时,该命令将会输出项目的设定值,否则输出Scrapy默认设定。

示例

1
2
3
4
C:\shu_item\tutorial>scrapy settings --get MONGO_URI
localhost
C:\shu_item\tutorial>scrapy settings --getbool=ROBOYSTXT_OBEY
False

Ubuntu:安装selenium和chromedriver并测试(不需要图形化界面)

发表于 2019-01-31 | 分类于 python , 爬虫 , 服务器
字数统计: 174 字 | 阅读时长 ≈ 1 分钟

安装chrome驱动

1
2
wget https://npm.taobao.org/mirrors/chromedriver/72.0.3626.7/chromedriver_linux64.zip
unzip chromedriver_linux64.zip

将文件移动到usr/bin文件夹,配置即完成。

1
mv chromedriver /usr/bin/

安装chrome

1
2
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo dpkg -i google-chrome*.deb

测试代码:

1
2
3
4
5
6
7
8
9
10
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument('--headless') # 设置无界面
chrome_options.add_argument('--no-sandbox') # root用户下运行代码需添加这一行
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get("https://www.baidu.com")
print(driver.page_source)
driver.quit()

如果遇到不兼容其他安装包,应该会提示执行命令

1
apt-get install -f

sudo apt-get -f install 是修复损坏的软件包,尝试卸载出错的包,重新安装正确版本。

python:os文件和目录

发表于 2019-01-31 | 分类于 python
字数统计: 158 字 | 阅读时长 ≈ 1 分钟
1
os.listdir(path)

返回path指定的文件夹包含的文件或文件夹的名字的列表。

path为“.”时,返回当前路径下的文件和文件夹内容;path为绝对路径时,返回绝对路径下的文件和文件夹内容。

1
os.mkdir(path[, mode])

以数字mode的mode创建一个名为path的文件夹.默认的 mode 是 0777 (八进制)。

1
os.path.exists(path)

判断某个路径是否存在,存在的话则返回True,不存在返回False。

1
os.makedirs(path, mode=0o777)

用于递归创建目录。像 mkdir(), 但创建的所有intermediate-level文件夹需要包含子目录。

爬虫基本原理

发表于 2019-01-31 | 分类于 python
字数统计: 850 字 | 阅读时长 ≈ 2 分钟

1. 请求网站并提取数据的自动化程序

  1. 用python/java模拟浏览器,获取网址的代码
  2. 从里面提取有用信息,存入文本或者数据库
  3. 可以进行长时间,自动地,批量地提取数据,分析数据

    2.基本流程

    1. 发起请求

    通过http向目标站点发起请求,即发送request,请求可以包含headers等信息(例如发送浏览器的配置信息,伪装成浏览器),等待服务器响应

    2.获取响应内容

    服务器正常响应,可以获得response,里面的内容就是页面内容,可能会有html,json,二进制等格式类型

    3.解析内容

    可以使用正则表达式之类的方法进行解析,如果是json,可以用json的方法进行解析

    4.保存数据

    存为文本,或数据库,或存为特定格式(视频,音频)

对于多网页,可以采取下面的流程爬取:
image

python爬虫架构

Python 爬虫架构主要由五个部分组成,分别是调度器、URL管理器、网页下载器、网页解析器、应用程序(爬取的有价值数据)。

  1. 调度器:相当于一台电脑的CPU,主要负责调度URL管理器、下载器、解析器之间的协调工作。
  2. URL管理器:包括待爬取的URL地址和已爬取的URL地址,防止重复抓取URL和循环抓取URL,实现URL管理器主要用三种方式,通过内存、数据库、缓存数据库来实现。
  3. 网页下载器:通过传入一个URL地址来下载网页,将网页转换成一个字符串,网页下载器有urllib2(Python官方基础模块)包括需要登录、代理、和cookie,requests(第三方包)
  4. 网页解析器:将一个网页字符串进行解析,可以按照我们的要求来提取出我们有用的信息,也可以根据DOM树的解析方式来解析。网页解析器有正则表达式(直观,将网页转成字符串通过模糊匹配的方式来提取有价值的信息,当文档比较复杂的时候,该方法提取数据的时候就会非常的困难)、html.parser(Python自带的)、beautifulsoup(第三方插件,可以使用Python自带的html.parser进行解析,也可以使用lxml进行解析,相对于其他几种来说要强大一些)、lxml(第三方插件,可以解析 xml 和 HTML),html.parser 和 beautifulsoup 以及 lxml 都是以 DOM 树的方式进行解析的。
  5. 应用程序:就是从网页中提取的有用数据组成的一个应用。

下面用一个图来解释一下调度器是如何协调工作的:

image

  1. 调度器可以认为是整个程序;
  2. url管理器可以使用类似于set的手段或者是使用数据库,从数据库中提取标记为未爬取过的信息,爬取后进行标记;
  3. 通过Requests、urllib2等库或者Scrapy框架对url进行访问,下载网页,如果需要加载ajax,可以使用selenium或者框架进行操作;
  4. 使用BeautifulSoup、re、css选择器、xpath等手段对网页进行解析;
  5. 解析后提取数据,存入数据库,以这些数据作为应用程序的后端,组成应用程序。

tail命令

发表于 2019-01-25 | 分类于 服务器
字数统计: 534 字 | 阅读时长 ≈ 2 分钟

tail命令用于输入文件中的尾部内容。tail命令默认在屏幕上显示指定文件的末尾10行。如果给定的文件不止一个,则在显示的每个文件前面加一个文件名标题。如果没有指定文件或者文件名为“-”,则读取标准输入。

注意:如果表示字节或行数的N值之前有一个”+”号,则从文件开头的第N项开始显示,而不是显示文件的最后N项。N值后面可以有后缀:b表示512,k表示1024,m表示1 048576(1M)。

语法

tail(选项)(参数)

选项

1
2
3
4
5
6
7
8
9
10
11
--retry:即是在tail命令启动时,文件不可访问或者文件稍后变得不可访问,都始终尝试打开文件。使用此选项时需要与选项“——follow=name”连用;
-c<N>或——bytes=<N>:输出文件尾部的N(N为整数)个字节内容;
-f<name/descriptor>或;--follow<nameldescript>:显示文件最新追加的内容。“name”表示以文件名的方式监视文件的变化。“-f”与“-fdescriptor”等效;
-F:与选项“-follow=name”和“--retry"连用时功能相同;
-n<N>或——line=<N>:输出文件的尾部N(N位数字)行内容。
--pid=<进程号>:与“-f”选项连用,当指定的进程号的进程终止后,自动退出tail命令;
-q或——quiet或——silent:当有多个文件参数时,不输出各个文件名;
-s<秒数>或——sleep-interal=<秒数>:与“-f”选项连用,指定监视文件变化时间隔的秒数;
-v或——verbose:当有多个文件参数时,总是输出各个文件名;
--help:显示指令的帮助信息;
--version:显示指令的版本信息。

参数

文件列表:指定要显示尾部内容的文件列表。

实例

1
2
3
tail file (显示文件file的最后10行)
tail +20 file (显示文件file的内容,从第20行至文件末尾)
tail -c 10 file (显示文件file的最后10个字符)

一般用法

一般用来查看实施日志

1
tail -f LOGFILE

history命令

发表于 2019-01-25 | 分类于 服务器
字数统计: 324 字 | 阅读时长 ≈ 1 分钟

history命令用于显示指定数目的指令命令,读取历史命令文件中的目录到历史命令缓冲区和将历史命令缓冲区中的目录写入命令文件。

该命令单独使用时,仅显示历史命令,在命令行中,可以使用符号!执行指定序号的历史命令。例如,要执行第2个历史命令,则输入!2。

历史命令是被保存在内存中的,当退出或者登录shell时,会自动保存或读取。在内存中,历史命令仅能够存储1000条历史命令,该数量是由环境变量HISTSIZE进行控制。

语法

history(选项)(参数)

选项

1
2
3
4
-c:清空当前历史命令;
-a:将历史命令缓冲区中命令写入历史命令文件中;
-r:将历史命令文件中的命令读入当前历史命令缓冲区;
-w:将当前历史命令缓冲区命令写入历史命令文件中。

参数

n:打印最近的n条历史命令。

实例

使用history命令显示最近使用的10条历史命令,输入如下命令:

1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# history 10
92 ls
93 cd ..
94 ls
95 exit
96 ls -a
97 cd .ssh/
98 ls
99 cat known_hosts
100 exit
101 history 10

ps命令

发表于 2019-01-25 | 分类于 服务器
字数统计: 1.5k 字 | 阅读时长 ≈ 6 分钟

ps命令用于报告当前系统的进程状态。可以搭配kill指令随时中断、删除不必要的程序。ps命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等,总之大部分信息都是可以通过执行该命令得到的。

常用

1
2
ps
ps -ef | grep NAME

显示同一终端下的所有程序 ps –a

1
2
3
4
snjl@VM-0-2-ubuntu:~$ ps
PID TTY TIME CMD
10427 pts/0 00:00:00 bash
17880 pts/0 00:00:00 ps

ps可以与grep组合一起查询,例如

1
ps -ef | grep java

表示查看所有进程里 CMD 是 java 的进程信息等等。

1
2
3
4
5
root@ubuntu:/home/docker# ps -ef | grep python
root 11011 31568 0 Jan03 ? 00:00:51 /root/anaconda3/envs/py3/bin/python -m ipykernel_launcher -f /run/user/0/jupyter/kernel-dd69b2b9-f097-43e3-92f2-71f8ee1dce1b.json
root 25557 24830 0 11:01 pts/0 00:00:00 grep --color=auto python
root 31568 1 0 2018 ? 00:02:50 /root/anaconda3/envs/py3/bin/python /root/anaconda3/envs/py3/bin/jupyter-notebook --allow-root
root 31700 1 0 2018 ? 00:02:47 python -m http.server 8088

语法

ps(选项)

选项

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
-a:显示所有终端机下执行的程序,除了阶段作业领导者之外。
a:显示现行终端机下的所有程序,包括其他用户的程序。
-A:显示所有程序。
-c:显示CLS和PRI栏位。
c:列出程序时,显示每个程序真正的指令名称,而不包含路径,选项或常驻服务的标示。
-C<指令名称>:指定执行指令的名称,并列出该指令的程序的状况。
-d:显示所有程序,但不包括阶段作业领导者的程序。
-e:此选项的效果和指定"A"选项相同。
e:列出程序时,显示每个程序所使用的环境变量。
-f:显示UID,PPIP,C与STIME栏位。
f:用ASCII字符显示树状结构,表达程序间的相互关系。
-g<群组名称>:此选项的效果和指定"-G"选项相同,当亦能使用阶段作业领导者的名称来指定。
g:显示现行终端机下的所有程序,包括群组领导者的程序。
-G<群组识别码>:列出属于该群组的程序的状况,也可使用群组名称来指定。
h:不显示标题列。
-H:显示树状结构,表示程序间的相互关系。
-j或j:采用工作控制的格式显示程序状况。
-l或l:采用详细的格式来显示程序状况。
L:列出栏位的相关信息。
-m或m:显示所有的执行绪。
n:以数字来表示USER和WCHAN栏位。
-N:显示所有的程序,除了执行ps指令终端机下的程序之外。
-p<程序识别码>:指定程序识别码,并列出该程序的状况。
p<程序识别码>:此选项的效果和指定"-p"选项相同,只在列表格式方面稍有差异。
r:只列出现行终端机正在执行中的程序。
-s<阶段作业>:指定阶段作业的程序识别码,并列出隶属该阶段作业的程序的状况。
s:采用程序信号的格式显示程序状况。
S:列出程序时,包括已中断的子程序资料。
-t<终端机编号>:指定终端机编号,并列出属于该终端机的程序的状况。
t<终端机编号>:此选项的效果和指定"-t"选项相同,只在列表格式方面稍有差异。
-T:显示现行终端机下的所有程序。
-u<用户识别码>:此选项的效果和指定"-U"选项相同。
u:以用户为主的格式来显示程序状况。
-U<用户识别码>:列出属于该用户的程序的状况,也可使用用户名称来指定。
U<用户名称>:列出属于该用户的程序的状况。
v:采用虚拟内存的格式显示程序状况。
-V或V:显示版本信息。
-w或w:采用宽阔的格式来显示程序状况。 
x:显示所有程序,不以终端机来区分。
X:采用旧式的Linux i386登陆格式显示程序状况。
-y:配合选项"-l"使用时,不显示F(flag)栏位,并以RSS栏位取代ADDR栏位 。
-<程序识别码>:此选项的效果和指定"p"选项相同。
--cols<每列字符数>:设置每列的最大字符数。
--columns<每列字符数>:此选项的效果和指定"--cols"选项相同。
--cumulative:此选项的效果和指定"S"选项相同。
--deselect:此选项的效果和指定"-N"选项相同。
--forest:此选项的效果和指定"f"选项相同。
--headers:重复显示标题列。
--help:在线帮助。
--info:显示排错信息。
--lines<显示列数>:设置显示画面的列数。
--no-headers:此选项的效果和指定"h"选项相同,只在列表格式方面稍有差异。
--group<群组名称>:此选项的效果和指定"-G"选项相同。
--Group<群组识别码>:此选项的效果和指定"-G"选项相同。
--pid<程序识别码>:此选项的效果和指定"-p"选项相同。
--rows<显示列数>:此选项的效果和指定"--lines"选项相同。
--sid<阶段作业>:此选项的效果和指定"-s"选项相同。
--tty<终端机编号>:此选项的效果和指定"-t"选项相同。
--user<用户名称>:此选项的效果和指定"-U"选项相同。
--User<用户识别码>:此选项的效果和指定"-U"选项相同。
--version:此选项的效果和指定"-V"选项相同。
--widty<每列字符数>:此选项的效果和指定"-cols"选项相同。

linux压缩解压缩

发表于 2019-01-25 | 分类于 服务器
字数统计: 1.2k 字 | 阅读时长 ≈ 4 分钟

在Linux的环境中,压缩档案的副档名大多是:『 .tar, .tar.gz, .tgz, .gz, .Z, .bz2 』,以下是常见的压缩档案副档名:

1
2
3
4
5
6
*.Z compress程式压缩的档案; 
*.gz gzip程式压缩的档案;
*.bz2 bzip2程式压缩的档案;
*.tar tar程式打包的资料,并没有压缩过;
*.tar.gz tar程式打包的档案,其中并且经过gzip 的压缩
*.tar.bz2 tar 程式打包的档案,其中并且经过bzip2 的压缩

tar命令可以为linux的文件和目录创建档案。利用tar,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。tar最初被用来在磁带上创建档案,现在,用户可以在任何设备上创建档案。利用tar命令,可以把一大堆的文件和目录全部打包成一个文件,这对于备份文件或将几个文件组合成为一个文件以便于网络传输是非常有用的。

首先要弄清两个概念:打包和压缩。打包是指将一大堆文件或目录变成一个总的文件;压缩则是将一个大的文件通过一些压缩算法变成一个小文件。

为什么要区分这两个概念呢?这源于Linux中很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你得先将这一大堆文件先打成一个包(tar命令),然后再用压缩程序进行压缩(gzip bzip2命令)。

最简单的使用 tar

1
2
3
压 缩:tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称
查 询:tar -jtv -f filename.tar.bz2
解压缩:tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录

语法

1
tar(选项)(参数)

选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
-A或--catenate:新增文件到以存在的备份文件;
-B:设置区块大小;
-c或--create:建立新的备份文件;
-C <目录>:这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项。
-d:记录文件的差别;
-x或--extract或--get:从备份文件中还原文件;
-t或--list:列出备份文件的内容;
-z或--gzip或--ungzip:通过gzip指令处理备份文件;
-Z或--compress或--uncompress:通过compress指令处理备份文件;
-f<备份文件>或--file=<备份文件>:指定备份文件;
-v或--verbose:显示指令执行过程;
-r:添加文件到已经压缩的文件;
-u:添加改变了和现有的文件到已经存在的压缩文件;
-j:支持bzip2解压文件;
-v:显示操作过程;
-l:文件系统边界设置;
-k:保留原有文件不覆盖;
-m:保留文件不被覆盖;
-w:确认压缩文件的正确性;
-p或--same-permissions:用原来的文件权限还原文件;
-P或--absolute-names:文件名使用绝对名称,不移除文件名称前的“/”号;
-N <日期格式> 或 --newer=<日期时间>:只将较指定日期更新的文件保存到备份文件里;
--exclude=<范本样式>:排除符合范本样式的文件。

参数

文件或目录:指定要打包的文件或目录列表。

实例

将文件全部打包成tar包:

1
2
3
tar -cvf log.tar log2012.log    仅打包,不压缩! 
tar -zcvf log.tar.gz log2012.log 打包后,以 gzip 压缩
tar -jcvf log.tar.bz2 log2012.log 打包后,以 bzip2 压缩

在选项f之后的文件档名是自己取的,我们习惯上都用 .tar 来作为辨识。 如果加z选项,则以.tar.gz或.tgz来代表gzip压缩过的tar包;如果加j选项,则以.tar.bz2来作为tar包名。

查阅上述tar包内有哪些文件:

1
tar -ztvf log.tar.gz

由于我们使用 gzip 压缩的log.tar.gz,所以要查阅log.tar.gz包内的文件时,就得要加上z这个选项了。

将tar包解压缩:

1
tar -zxvf /opt/soft/test/log.tar.gz

在预设的情况下,我们可以将压缩档在任何地方解开的

只将tar内的部分文件解压出来:

1
tar -zxvf /opt/soft/test/log30.tar.gz log2013.log

我可以透过tar -ztvf来查阅 tar 包内的文件名称,如果单只要一个文件,就可以透过这个方式来解压部分文件。

文件备份下来,并且保存其权限:

1
tar -zcvpf log31.tar.gz log2014.log log2015.log log2016.log

这个-p的属性是很重要的,尤其是当您要保留原本文件的属性时。

在文件夹当中,比某个日期新的文件才备份:

1
tar -N "2012/11/13" -zcvf log17.tar.gz test

备份文件夹内容是排除部分文件:

1
tar --exclude scf/service -zcvf scf.tar.gz scf/*

df命令

发表于 2019-01-25 | 分类于 服务器
字数统计: 805 字 | 阅读时长 ≈ 4 分钟

df命令用于显示磁盘分区上的可使用的磁盘空间。默认显示单位为KB。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。

语法

1
df(选项)(参数)

选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-a或--all:包含全部的文件系统;
--block-size=<区块大小>:以指定的区块大小来显示区块数目;
-h或--human-readable:以可读性较高的方式来显示信息;
-H或--si:与-h参数相同,但在计算时是以1000 Bytes为换算单位而非1024 Bytes;
-i或--inodes:显示inode的信息;
-k或--kilobytes:指定区块大小为1024字节;
-l或--local:仅显示本地端的文件系统;
-m或--megabytes:指定区块大小为1048576字节;
--no-sync:在取得磁盘使用信息前,不要执行sync指令,此为预设值;
-P或--portability:使用POSIX的输出格式;
--sync:在取得磁盘使用信息前,先执行sync指令;
-t<文件系统类型>或--type=<文件系统类型>:仅显示指定文件系统类型的磁盘信息;
-T或--print-type:显示文件系统的类型;
-x<文件系统类型>或--exclude-type=<文件系统类型>:不要显示指定文件系统类型的磁盘信息;
--help:显示帮助;
--version:显示版本信息。

参数

文件:指定文件系统上的文件。

实例

查看系统磁盘设备,默认是KB为单位:

1
2
3
4
5
6
7
8
9
10
snjl@VM-0-2-ubuntu:~$ df
Filesystem 1K-blocks Used Available Use% Mounted on
udev 938580 0 938580 0% /dev
tmpfs 191716 19944 171772 11% /run
/dev/vda1 51474044 12273468 36562808 26% /
tmpfs 958576 24 958552 1% /dev/shm
tmpfs 5120 0 5120 0% /run/lock
tmpfs 958576 0 958576 0% /sys/fs/cgroup
tmpfs 191716 0 191716 0% /run/user/500
tmpfs 191716 0 191716 0% /run/user/1001

以MB为单位:

1
2
3
4
5
6
7
8
9
10
snjl@VM-0-2-ubuntu:~$ df -m
Filesystem 1M-blocks Used Available Use% Mounted on
udev 917 0 917 0% /dev
tmpfs 188 20 168 11% /run
/dev/vda1 50268 11986 35706 26% /
tmpfs 937 1 937 1% /dev/shm
tmpfs 5 0 5 0% /run/lock
tmpfs 937 0 937 0% /sys/fs/cgroup
tmpfs 188 0 188 0% /run/user/500
tmpfs 188 0 188 0% /run/user/1001

使用-h选项以KB以上的单位来显示,可读性高:

1
2
3
4
5
6
7
8
9
10
snjl@VM-0-2-ubuntu:~$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 917M 0 917M 0% /dev
tmpfs 188M 20M 168M 11% /run
/dev/vda1 50G 12G 35G 26% /
tmpfs 937M 24K 937M 1% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 937M 0 937M 0% /sys/fs/cgroup
tmpfs 188M 0 188M 0% /run/user/500
tmpfs 188M 0 188M 0% /run/user/1001

查看全部文件系统:

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
snjl@VM-0-2-ubuntu:~$ df -a
Filesystem 1K-blocks Used Available Use% Mounted on
sysfs 0 0 0 - /sys
proc 0 0 0 - /proc
udev 938580 0 938580 0% /dev
devpts 0 0 0 - /dev/pts
tmpfs 191716 19944 171772 11% /run
/dev/vda1 51474044 12273496 36562780 26% /
securityfs 0 0 0 - /sys/kernel/security
tmpfs 958576 24 958552 1% /dev/shm
tmpfs 5120 0 5120 0% /run/lock
tmpfs 958576 0 958576 0% /sys/fs/cgroup
cgroup 0 0 0 - /sys/fs/cgroup/systemd
pstore 0 0 0 - /sys/fs/pstore
cgroup 0 0 0 - /sys/fs/cgroup/perf_event
cgroup 0 0 0 - /sys/fs/cgroup/hugetlb
cgroup 0 0 0 - /sys/fs/cgroup/freezer
cgroup 0 0 0 - /sys/fs/cgroup/memory
cgroup 0 0 0 - /sys/fs/cgroup/devices
cgroup 0 0 0 - /sys/fs/cgroup/net_cls,net_prio
cgroup 0 0 0 - /sys/fs/cgroup/cpu,cpuacct
cgroup 0 0 0 - /sys/fs/cgroup/pids
cgroup 0 0 0 - /sys/fs/cgroup/cpuset
cgroup 0 0 0 - /sys/fs/cgroup/blkio
systemd-1 - - - - /proc/sys/fs/binfmt_misc
mqueue 0 0 0 - /dev/mqueue
debugfs 0 0 0 - /sys/kernel/debug
hugetlbfs 0 0 0 - /dev/hugepages
fusectl 0 0 0 - /sys/fs/fuse/connections
tmpfs 191716 0 191716 0% /run/user/500
binfmt_misc 0 0 0 - /proc/sys/fs/binfmt_misc
tmpfs 191716 0 191716 0% /run/user/1001

1…567…21
snjl

snjl

越过山丘,才发现无人等候。

203 日志
44 分类
107 标签
RSS
GitHub E-Mail Weibo
© 2019 snjl
总访问量次 | 总访客人 |
由 Hexo 强力驱动
|
主题 — NexT.Mist v5.1.4