一天一个Linux命令,axel命令

axel命令

axel是Linux下一个不错的HTTP/ftp高速下载工具。支持多线程下载、断点续传,且可以从多个地址或者从一个地址的多个连接来下载同一个文件。适合网速不给力时多线程下载提高下载速度。比如在国内VPS或服务器上下载lnmp一键安装包用Axel就比wget快。

默认Linux上是没有安装这个命令的,需要自己手动安装。

基于我的Centos64位系统,使用下面的命令即可:

wget -c http://mirrors.sohu.com/dag/redhat/el6/en/x86_64/rpmforge/RPMS/axel-2.4-1.el6.rf.x86_64.rpm
rpm -ivh axel-2.4-1.el6.rf.x86_64.rpm

语法

axel [options] url1 [url2] [url...]

参数

1
2
3
4
5
6
7
8
9
10
11
12
--max-speed=x , -s x         最高速度x
--num-connections=x , -n x 连接数x
--output=f , -o f 下载为本地文件f
--search[=x] , -S [x] 搜索镜像
--header=x , -H x 添加头文件字符串x(指定 HTTP header)
--user-agent=x , -U x 设置用户代理(指定 HTTP user agent)
--no-proxy , -N 不使用代理服务器
--quiet , -q 静默模式
--verbose ,-v 更多状态信息
--alternate , -a Alternate progress indicator
--help ,-h 帮助
--version ,-V 版本信息

实例

执行命令 [root@localhost fenglangjuxu]# axel -n 10 -o /tmp http://soft.vpser.net/lnmp/lnmp1.5-full.tar.gz

指定为 指定为10个连接线程,-o /tmp :下载到本地tmp文件夹, 安装lnmp包。

可以看到下面的命令显示很快,第二张图,可以清楚的看到每个连接线程的下载情况

1562678393520

1562678715538

如果下载过程中下载中断可以再执行下载命令即可恢复上次的下载进度。

一天一个Linux命令,file命令

file命令

file命令用来探测给定文件的类型。file命令对文件的检查分为文件系统、魔法幻数检查和语言检查3个过程。

语法

file(选项)(参数)

选项

1
2
3
4
5
6
7
-b:列出辨识结果时,不显示文件名称;
-c:详细显示指令执行过程,便于排错或分析程序执行的情形;
-f<名称文件>:指定名称文件,其内容有一个或多个文件名称时,让file依序辨识这些文件,格式为每列一个文件名称;
-L:直接显示符号连接所指向的文件类别;
-m<魔法数字文件>:指定魔法数字文件;
-v:显示版本信息;
-z:尝试去解读压缩文件的内容。

参数

文件:要确定类型的文件列表,多个文件之间使用空格分开,可以使用shell通配符匹配多个文件。

实例

file zhengzhou.txt 查看此文件的类型

1562598149984

file - b zhengzhou.txt 查看此文件的类型,但不显示文件名

1562598265293

file -i zhengzhou.txt 显示mime类别

1562598334035

file /var/ 或 file /var/lock 显示符号链接的类型

1562598430763

1562598490820

一天一个Linux命令,useradd命令

useradd命令

useradd命令用于Linux中创建的新的系统用户。useradd可用来建立用户帐号。帐号建好之后,再用passwd设定帐号的密码.而可用userdel删除帐号。使用useradd指令所建立的帐号,实际上是保存在/etc/passwd文本文件中。

在Slackware中,adduser指令是个script程序,利用交谈的方式取得输入的用户帐号资料,然后再交由真正建立帐号的useradd命令建立新用户,如此可方便管理员建立用户帐号。在Red Hat Linux中,adduser命令则是useradd命令的符号连接,两者实际上是同一个指令。

语法

useradd [-mMnr][-c <备注>][-d <登入目录>][-e <有效期限>][-f <缓冲天数>][-g <群组>][-G <群组>][-s <shell>][-u <uid>][用户帐号]

选项

1
2
3
4
5
6
7
8
9
10
11
12
13
-c<备注>:加上备注文字。备注文字会保存在passwd的备注栏位中;
-d<登入目录>:指定用户登入时的启始目录;
-D:变更预设值;
-e<有效期限>:指定帐号的有效期限;
-f<缓冲天数>:指定在密码过期后多少天即关闭该帐号;
-g<群组>:指定用户所属的群组;
-G<群组>:指定用户所属的附加群组;
-m:自动建立用户的登入目录;
-M:不要自动建立用户的登入目录;
-n:取消建立以用户名称为名的群组;
-r:建立系统帐号;
-s<shell>:指定用户登入后所使用的shell;
-u<uid>:指定用户id。

参数

实例

useradd lanzhou 创建了一个普通用户

useradd -g root yuzhong 创建一个用户,并指定用户组root

useradd -r donggang 创建一个系统账号

1562432184148

执行 cat /etc/passwd 命令可以查看本机有那些用户

1562432408380

1562432463287

一天一个Linux命令,chmod命令

chmod命令

Linux/Unix 的文件调用权限分为三级 : 文件拥有者、群组、其他。利用 chmod 可以藉以控制文件如何被他人所调用。

语法

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

参数

mode : 权限设定字串,格式如下 :

1
[ugoa...][[+-=][rwxX]...][,...]

###

其中:

  • u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。
  • + 表示增加权限、- 表示取消权限、= 表示唯一设定权限。
  • r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行。

其他参数说明:

  • -c : 若该文件权限确实已经更改,才显示其更改动作
  • -f : 若该文件权限无法被更改也不要显示错误讯息
  • -v : 显示权限变更的详细资料
  • -R : 对目前目录下的所有文件与子目录进行相同的权限变更(即以递回的方式逐个变更)
  • –help : 显示辅助说明
  • –version : 显示版本

实例

文件dong.txt当前的权限是文件拥有者可以读写权限,群组的人也具有读写的权限,其他人具有读的权限,

执行如下命令后,给所有人都赋予执行的权限。 chmod ugo+x dong.txt

1562331024159

执行 chmod o+w dong.txt 给其他人赋予写的权限。

1562331237253

执行 chmod -R a+w * 将当前目录下的所有文件及文件夹设置为可以执行的权限

1562331543618

创建两个文件 zhengzhou.txt 和 lanzhou.txt, 文件所有者具有读写的权限, 群组的人具有读的权限,其他人具有读的权限。

执行 chmod ug+w,o-r zhengzhou.txt lanzhou.txt 命令,赋予文件所有者和群组的人写的权限,其他人剥夺读的权限。

1562331931276

1562331952298

使用数字

r=4,w=2,x=1

  • 若要rwx属性则4+2+1=7;

  • 若要rw-属性则4+2=6;

  • 若要r-x属性则4+1=5。

执行chmod 777 gansu.txt 可以赋予所有人所有的权限。

可以利用数字的增减来达到控制权限的目的。

1562332298685

1562332310601

整数集合-压缩列表

压缩列表

压缩列表(ziplist)是列表键和哈希键的底层实现之一。

当一个列表键只包含少量列表项, 并且每个列表项要么就是小整数值, 要么就是长度比较短的字符串, 那么 Redis 就会使用压缩列表来做列表键的底层实现。

比如说, 执行以下命令将创建一个压缩列表实现的列表键:

1
2
3
4
5
redis> RPUSH lst 1 3 5 10086 "hello" "world"
(integer) 6

redis> OBJECT ENCODING lst
"ziplist"

因为列表键里面包含的都是 1 、 3 、 5 、 10086 这样的小整数值, 以及 “hello” 、 “world” 这样的短字符串。

另外, 当一个哈希键只包含少量键值对, 并且每个键值对的键和值要么就是小整数值, 要么就是长度比较短的字符串, 那么 Redis 就会使用压缩列表来做哈希键的底层实现。

举个例子, 执行以下命令将创建一个压缩列表实现的哈希键:

1
2
3
4
5
redis> HMSET profile "name" "Jack" "age" 28 "job" "Programmer"
OK

redis> OBJECT ENCODING profile
"ziplist"

因为哈希键里面包含的所有键和值都是小整数值或者短字符串。

本章将对压缩列表的定义以及相关操作进行详细的介绍。

压缩列表的构成

压缩列表是 Redis 为了节约内存而开发的, 由一系列特殊编码的连续内存块组成的顺序型(sequential)数据结构。

一个压缩列表可以包含任意多个节点(entry), 每个节点可以保存一个字节数组或者一个整数值。

图 7-1 展示了压缩列表的各个组成部分, 表 7-1 则记录了各个组成部分的类型、长度、以及用途。

img

表 7-1 压缩列表各个组成部分的详细说明

属性 类型 长度 用途
zlbytes uint32_t 4 字节 记录整个压缩列表占用的内存字节数:在对压缩列表进行内存重分配, 或者计算 zlend 的位置时使用。
zltail uint32_t 4 字节 记录压缩列表表尾节点距离压缩列表的起始地址有多少字节: 通过这个偏移量,程序无须遍历整个压缩列表就可以确定表尾节点的地址。
zllen uint16_t 2 字节 记录了压缩列表包含的节点数量: 当这个属性的值小于 UINT16_MAX (65535)时, 这个属性的值就是压缩列表包含节点的数量; 当这个值等于 UINT16_MAX 时, 节点的真实数量需要遍历整个压缩列表才能计算得出。
entryX 列表节点 不定 压缩列表包含的各个节点,节点的长度由节点保存的内容决定。
zlend uint8_t 1 字节 特殊值 0xFF (十进制 255 ),用于标记压缩列表的末端。

图 7-2 展示了一个压缩列表示例:

  • 列表 zlbytes 属性的值为 0x50 (十进制 80), 表示压缩列表的总长为 80 字节。
  • 列表 zltail 属性的值为 0x3c (十进制 60), 这表示如果我们有一个指向压缩列表起始地址的指针 p , 那么只要用指针 p 加上偏移量 60 , 就可以计算出表尾节点 entry3 的地址。
  • 列表 zllen 属性的值为 0x3 (十进制 3), 表示压缩列表包含三个节点。

img

图 7-3 展示了另一个压缩列表示例:

  • 列表 zlbytes 属性的值为 0xd2 (十进制 210), 表示压缩列表的总长为 210 字节。
  • 列表 zltail 属性的值为 0xb3 (十进制 179), 这表示如果我们有一个指向压缩列表起始地址的指针 p , 那么只要用指针 p 加上偏移量 179 , 就可以计算出表尾节点 entry5 的地址。
  • 列表 zllen 属性的值为 0x5 (十进制 5), 表示压缩列表包含五个节点。

img

连锁更新

前面说过, 每个节点的 previous_entry_length 属性都记录了前一个节点的长度:

如果前一节点的长度小于 254 字节, 那么 previous_entry_length 属性需要用 1 字节长的空间来保存这个长度值。
如果前一节点的长度大于等于 254 字节, 那么 previous_entry_length 属性需要用 5 字节长的空间来保存这个长度值。
现在, 考虑这样一种情况: 在一个压缩列表中, 有多个连续的、长度介于 250 字节到 253 字节之间的节点 e1 至 eN , 如图 7-11 所示。

img

因为 e1 至 eN 的所有节点的长度都小于 254 字节, 所以记录这些节点的长度只需要 1 字节长的 previous_entry_length 属性, 换句话说, e1 至 eN 的所有节点的 previous_entry_length 属性都是 1 字节长的。

这时, 如果我们将一个长度大于等于 254 字节的新节点 new 设置为压缩列表的表头节点, 那么 new 将成为 e1 的前置节点, 如图 7-12 所示。

img

因为 e1 的 previous_entry_length 属性仅长 1 字节, 它没办法保存新节点 new 的长度, 所以程序将对压缩列表执行空间重分配操作, 并将 e1 节点的 previous_entry_length 属性从原来的 1 字节长扩展为 5 字节长。

现在, 麻烦的事情来了 —— e1 原本的长度介于 250 字节至 253 字节之间, 在为 previous_entry_length 属性新增四个字节的空间之后, e1 的长度就变成了介于 254 字节至 257 字节之间, 而这种长度使用 1 字节长的 previous_entry_length 属性是没办法保存的。

因此, 为了让 e2 的 previous_entry_length 属性可以记录下 e1 的长度, 程序需要再次对压缩列表执行空间重分配操作, 并将 e2 节点的 previous_entry_length 属性从原来的 1 字节长扩展为 5 字节长。

正如扩展 e1 引发了对 e2 的扩展一样, 扩展 e2 也会引发对 e3 的扩展, 而扩展 e3 又会引发对 e4 的扩展……为了让每个节点的 previous_entry_length 属性都符合压缩列表对节点的要求, 程序需要不断地对压缩列表执行空间重分配操作, 直到 eN 为止。

Redis 将这种在特殊情况下产生的连续多次空间扩展操作称之为“连锁更新”(cascade update), 图 7-13 展示了这一过程。

img

img

img

img

img

除了添加新节点可能会引发连锁更新之外, 删除节点也可能会引发连锁更新。

考虑图 7-14 所示的压缩列表, 如果 e1 至 eN 都是大小介于 250 字节至 253 字节的节点, big 节点的长度大于等于 254 字节(需要 5 字节的 previous_entry_length 来保存), 而 small 节点的长度小于 254 字节(只需要 1 字节的 previous_entry_length 来保存), 那么当我们将 small 节点从压缩列表中删除之后, 为了让 e1 的 previous_entry_length 属性可以记录 big 节点的长度, 程序将扩展 e1 的空间, 并由此引发之后的连锁更新。

img

因为连锁更新在最坏情况下需要对压缩列表执行 N 次空间重分配操作, 而每次空间重分配的最坏复杂度为 O(N) , 所以连锁更新的最坏复杂度为 O(N^2) 。

要注意的是, 尽管连锁更新的复杂度较高, 但它真正造成性能问题的几率是很低的:

  • 首先, 压缩列表里要恰好有多个连续的、长度介于 250 字节至 253 字节之间的节点, 连锁更新才有可能被引发, 在实际中, 这种情况并不多见;
  • 其次, 即使出现连锁更新, 但只要被更新的节点数量不多, 就不会对性能造成任何影响: 比如说, 对三五个节点进行连锁更新是绝对不会影响性能的;

因为以上原因, ziplistPush 等命令的平均复杂度仅为 O(N) , 在实际中, 我们可以放心地使用这些函数, 而不必担心连锁更新会影响压缩列表的性能。

压缩列表 API

表 7-4 列出了所有用于操作压缩列表的 API 。


表 7-4 压缩列表 API

函数 作用 算法复杂度
ziplistNew 创建一个新的压缩列表。 O(1)
ziplistPush 创建一个包含给定值的新节点, 并将这个新节点添加到压缩列表的表头或者表尾。 平均 O(N) ,最坏 O(N^2) 。
ziplistInsert 将包含给定值的新节点插入到给定节点之后。 平均 O(N) ,最坏 O(N^2) 。
ziplistIndex 返回压缩列表给定索引上的节点。 O(N)
ziplistFind 在压缩列表中查找并返回包含了给定值的节点。 因为节点的值可能是一个字节数组, 所以检查节点值和给定值是否相同的复杂度为 O(N) , 而查找整个列表的复杂度则为 O(N^2) 。
ziplistNext 返回给定节点的下一个节点。 O(1)
ziplistPrev 返回给定节点的前一个节点。 O(1)
ziplistGet 获取给定节点所保存的值。 O(1)
ziplistDelete 从压缩列表中删除给定的节点。 平均 O(N) ,最坏 O(N^2) 。
ziplistDeleteRange 删除压缩列表在给定索引上的连续多个节点。 平均 O(N) ,最坏 O(N^2) 。
ziplistBlobLen 返回压缩列表目前占用的内存字节数。 O(1)
ziplistLen 返回压缩列表目前包含的节点数量。 节点数量小于 65535 时 O(1) , 大于 65535 时 O(N) 。

因为 ziplistPush 、 ziplistInsert 、 ziplistDelete 和 ziplistDeleteRange 四个函数都有可能会引发连锁更新, 所以它们的最坏复杂度都是 O(N^2) 。

整数集合

整数集合(intset)是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现。

  它可以保存类型为int16_t、int32_t或者int64_t的整数值,并且保证集合中不会出现重复元素。

复制代码

1
2
3
4
5
6
7
8
1 typedef struct intset {
2 // 编码方式
3 uint32_t encoding;
4 // 集合包含的元素数量
5 uint32_t length;
6 // 保存元素的数组
7 int8_t contents[];
8 } intset;

复制代码

img

  contents数组是整数集合的底层实现:整数集合的每个元素都是contents数组的一个数组项,各个项在数组中按值的大小从小到大有序地排列,并且数组中不包含任何重复项

升级:

每当我们要将一个新元素添加到整数集合里面,并且新元素的类型比整数集合现有所有元素的的类型都要长时,整数集合需要先进行升级,然后才能将新元素添加到整数集合里面。

  根据新元素的类型,扩展整数集合底层数组的空间大小,并为新元素分配空间。

  将底层数组现有的所有元素都转换成与新元素相同的类型,并将类型转换后的元素放置到正确的位上(从后往前),而且在放置元素的过程中,需要继续位置底层数组的有序性质不变。

  将新元素添加到底层数组里面。

  将encoding属性更改。

  整数集合添加新元素的时间复杂度为O(N)。

  因为引发升级的元素要么最大要么最小,所有它的位置要么是0要么是length-1。

升级的好处:

  提升整数集合的灵活性,可以随意将int16,int32,int64的值放入集合。

  尽可能地节约内存

降级:

  整数集合不支持降级操作

一天一个Linux命令,screen命令

screen命令

Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。

会话恢复

只要Screen本身没有终止,在其内部运行的会话都可以恢复。这一点对于远程登录的用户特别有用——即使网络连接中断,用户也不会失去对已经打开的命令行会话的控制。只要再次登录到主机上执行screen -r就可以恢复会话的运行。同样在暂时离开的时候,也可以执行分离命令detach,在保证里面的程序正常运行的情况下让Screen挂起(切换到后台)。这一点和图形界面下的VNC很相似。

多窗口

在Screen环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存。用户可以通过快捷键在不同的窗口下切换,并可以自由的重定向各个窗口的输入和输出。Screen实现了基本的文本操作,如复制粘贴等;还提供了类似滚动条的功能,可以查看窗口状况的历史记录。窗口还可以被分区和命名,还可以监视后台窗口的活动。 会话共享 Screen可以让一个或多个用户从不同终端多次登录一个会话,并共享会话的所有特性(比如可以看到完全相同的输出)。它同时提供了窗口访问权限的机制,可以对窗口进行密码保护。

语法

# screen [-AmRvx -ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s ][-S <作业名称>]

选项

1
2
3
4
5
6
7
8
9
10
11
12
-A  将所有的视窗都调整为目前终端机的大小。
-d <作业名称>  将指定的screen作业离线。
-h <行数>  指定视窗的缓冲区行数。
-m  即使目前已在作业中的screen作业,仍强制建立新的screen作业。
-r <作业名称>  恢复离线的screen作业。
-R  先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
-s  指定建立新视窗时,所要执行的shell。
-S <作业名称>  指定screen作业的名称。
-v  显示版本信息。
-x  恢复之前离线的screen作业。
-ls或--list  显示目前所有的screen作业。
-wipe  检查目前所有的screen作业,并删除已经无法使用的screen作业。

参数

实例

直接敲命令screen就可以启动它。但是这样启动的screen会话没有名字,实践上推荐为每个screen会话取一个名字,方便分辨:

1562246277049

回车后,实际上进入另一个屏幕:

1562246393689

screen启动后,会创建第一个窗口,也就是窗口No. 0,并在其中打开一个系统默认的shell,一般都会是bash。所以你敲入命令screen之后,会立刻又返回到命令提示符,仿佛什么也没有发生似的,其实你已经进入Screen的世界了。当然,也可以在screen命令之后加入你喜欢的参数,使之直接打开你指定的程序,例如:

执行 screen -S dong.txt

1562246510949

1562246477731

screen创建一个执行vi david.txt的单窗口会话,退出vi 将退出该窗口/会话。

Ctrl+a键可以切换窗口,我刚才创建了2个窗口,就可以看到屏幕在切换。

会话分离与恢复

你可以不中断screen窗口中程序的运行而暂时断开(detach)screen会话,并在随后时间重新连接(attach)该会话,重新控制各窗口中运行的程序。例如,我们打开一个screen窗口编辑/tmp/dong.txt文件:

1562246862893

之后我们想暂时退出做点别的事情,比如出去散散步,那么在screen窗口键入Ctrl + a + d,Screen会给出detached提示:

暂时中断会话

1562247014536

半个小时之后回来了,找到该screen会话:

1562247061834

输入命令 screen -r 10940 重新连接会话:

1562247157854

一天一个Linux命令,alias命令

alias命令

alias命令用来设置指令的别名。我们可以使用该命令可以将一些较长的命令进行简化。使用alias时,用户必须使用单引号''将原来的命令引起来,防止特殊字符导致错误。

alias命令的作用只局限于该次登入的操作。若要每次登入都能够使用这些命令别名,则可将相应的alias命令存放到bash的初始化文件/etc/bashrc中。

语法

alias(选项)(参数)

选项

1
-p:打印已经设置的命令别名。

参数

命令别名设置:定义命令别名,格式为“命令别名=‘实际命令’”。

实例

alias可以列出所有被设置的命令别名,比如 vi

1562165293722

alias l=’ls -lsh’ 把ls命令设置别名为l, 接下来就可以使用l来查看当前目录下的文件

1562165436971

unalias l 删除刚才创建的别名,再使用l命令,就会提示命令找不到。

1562165524913

一天一个Linux命令,mv命令

mv命令

mv命令用来对文件或目录重新命名,或者将文件从一个目录移到另一个目录中。source表示源文件或目录,target表示目标文件或目录。如果将一个文件移到一个已经存在的目标文件中,则目标文件的内容将被覆盖。

mv命令可以用来将源文件移至一个目标文件中,或将一组文件移至一个目标目录中。源文件被移至目标文件有两种不同的结果:

  1. 如果目标文件是到某一目录文件的路径,源文件会被移到此目录下,且文件名不变。
  2. 如果目标文件不是目录文件,则源文件名(只能有一个)会变为此目标文件名,并覆盖己存在的同名文件。如果源文件和目标文件在同一个目录下,mv的作用就是改文件名。当目标文件是目录文件时,源文件或目录参数可以有多个,则所有的源文件都会被移至目标文件中。所有移到该目录下的文件都将保留以前的文件名。

注意事项:mv与cp的结果不同,mv好像文件“搬家”,文件个数并未增加。而cp对文件进行复制,文件个数增加了。

语法

mv(选项)(参数)

选项

1
2
3
4
5
6
7
8
--backup=<备份模式>:若需覆盖文件,则覆盖前先行备份;
-b:当文件存在时,覆盖前,为其创建一个备份;
-f:若目标文件或目录与现有的文件或目录重复,则直接覆盖现有的文件或目录;
-i:交互式操作,覆盖前先行询问用户,如果源文件与目标文件或目标目录中的文件同名,则询问用户是否覆盖目标文件。用户输入”y”,表示将覆盖目标文件;输入”n”,表示取消对源文件的移动。这样可以避免误将文件覆盖。
--strip-trailing-slashes:删除源文件中的斜杠“/”;
-S<后缀>:为备份文件指定后缀,而不使用默认的后缀;
--target-directory=<目录>:指定源文件要移动到目标目录;
-u:当源文件比目标文件新或者目标文件不存在时,才执行移动操作。

参数

  • 源文件:源文件列表。
  • 目标文件:如果“目标文件”是文件名则在移动文件的同时,将其改名为“目标文件”;如果“目标文件”是目录名则将源文件移动到“目标文件”下。

实例

将新创建的文件dong改为wang

[root@localhost var]# 
[root@localhost var]# 
[root@localhost var]# 
[root@localhost var]# touch dong
[root@localhost var]# ll
总用量 16
drwxr-xr-x.  2 root root   19 6月  22 04:36 account
drwxr-xr-x.  2 root root    6 4月  11 2018 adm
drwxr-xr-x. 13 root root  159 6月  22 05:27 cache
drwxr-xr-x.  2 root root    6 11月  5 2018 crash
drwxr-xr-x.  3 root root   34 6月  22 04:36 db
-rw-r--r--.  1 root root    0 7月   3 06:19 dong
drwxr-xr-x.  3 root root   18 6月  22 04:35 empty
drwxr-xr-x.  2 root root    6 4月  11 2018 games
drwxr-xr-x.  2 root root    6 4月  11 2018 gopher
drwxr-xr-x.  3 root root   18 6月  22 04:08 kerberos
drwxr-xr-x. 61 root root 4096 6月  22 05:26 lib
drwxr-xr-x.  4 root root   44 6月  26 05:30 local
lrwxrwxrwx.  1 root root   11 6月  22 04:06 lock -> ../run/lock
drwxr-xr-x. 20 root root 4096 7月   3 06:16 log
lrwxrwxrwx.  1 root root   10 6月  22 04:07 mail -> spool/mail
drwxr-xr-x.  2 root root    6 4月  11 2018 nis
drwxr-xr-x.  2 root root    6 4月  11 2018 opt
drwxr-xr-x.  2 root root    6 4月  11 2018 preserve
lrwxrwxrwx.  1 root root    6 6月  22 04:06 run -> ../run
drwxr-xr-x. 12 root root  140 6月  22 04:36 spool
drwxr-xr-x.  4 root root   28 6月  22 04:14 target
drwxrwxrwt. 36 root root 4096 7月   3 06:19 tmp
drwxr-xr-x.  2 root root    6 4月  11 2018 yp
[root@localhost var]# mv dong wang
[root@localhost var]# ll
总用量 16
drwxr-xr-x.  2 root root   19 6月  22 04:36 account
drwxr-xr-x.  2 root root    6 4月  11 2018 adm
drwxr-xr-x. 13 root root  159 6月  22 05:27 cache
drwxr-xr-x.  2 root root    6 11月  5 2018 crash
drwxr-xr-x.  3 root root   34 6月  22 04:36 db
drwxr-xr-x.  3 root root   18 6月  22 04:35 empty
drwxr-xr-x.  2 root root    6 4月  11 2018 games
drwxr-xr-x.  2 root root    6 4月  11 2018 gopher
drwxr-xr-x.  3 root root   18 6月  22 04:08 kerberos
drwxr-xr-x. 61 root root 4096 6月  22 05:26 lib
drwxr-xr-x.  4 root root   44 6月  26 05:30 local
lrwxrwxrwx.  1 root root   11 6月  22 04:06 lock -> ../run/lock
drwxr-xr-x. 20 root root 4096 7月   3 06:16 log
lrwxrwxrwx.  1 root root   10 6月  22 04:07 mail -> spool/mail
drwxr-xr-x.  2 root root    6 4月  11 2018 nis
drwxr-xr-x.  2 root root    6 4月  11 2018 opt
drwxr-xr-x.  2 root root    6 4月  11 2018 preserve
lrwxrwxrwx.  1 root root    6 6月  22 04:06 run -> ../run
drwxr-xr-x. 12 root root  140 6月  22 04:36 spool
drwxr-xr-x.  4 root root   28 6月  22 04:14 target
drwxrwxrwt. 36 root root 4096 7月   3 06:19 tmp
-rw-r--r--.  1 root root    0 7月   3 06:19 wang
drwxr-xr-x.  2 root root    6 4月  11 2018 yp
[root@localhost var]#                                             

1562077313112

把/var/zhang/下的所有文件移到/var/zhao/目录下

[root@localhost var]# cd zhang/
[root@localhost zhang]# touch wang
[root@localhost zhang]# touch dong
[root@localhost zhang]# ll
总用量 0
-rw-r--r--. 1 root root 0 7月   3 06:23 dong
-rw-r--r--. 1 root root 0 7月   3 06:23 wang
[root@localhost zhang]# pwd
/var/zhang
[root@localhost zhang]# cd ../
[root@localhost var]# ll
总用量 16
drwxr-xr-x.  2 root root   19 6月  22 04:36 account
drwxr-xr-x.  2 root root    6 4月  11 2018 adm
drwxr-xr-x. 13 root root  159 6月  22 05:27 cache
drwxr-xr-x.  2 root root    6 11月  5 2018 crash
drwxr-xr-x.  3 root root   34 6月  22 04:36 db
drwxr-xr-x.  3 root root   18 6月  22 04:35 empty
drwxr-xr-x.  2 root root    6 4月  11 2018 games
drwxr-xr-x.  2 root root    6 4月  11 2018 gopher
drwxr-xr-x.  3 root root   18 6月  22 04:08 kerberos
drwxr-xr-x. 61 root root 4096 6月  22 05:26 lib
drwxr-xr-x.  4 root root   44 6月  26 05:30 local
lrwxrwxrwx.  1 root root   11 6月  22 04:06 lock -> ../run/lock
drwxr-xr-x. 20 root root 4096 7月   3 06:16 log
lrwxrwxrwx.  1 root root   10 6月  22 04:07 mail -> spool/mail
drwxr-xr-x.  2 root root    6 4月  11 2018 nis
drwxr-xr-x.  2 root root    6 4月  11 2018 opt
drwxr-xr-x.  2 root root    6 4月  11 2018 preserve
lrwxrwxrwx.  1 root root    6 6月  22 04:06 run -> ../run
drwxr-xr-x. 12 root root  140 6月  22 04:36 spool
drwxr-xr-x.  4 root root   28 6月  22 04:14 target
drwxrwxrwt. 34 root root 4096 7月   3 06:19 tmp
-rw-r--r--.  1 root root    0 7月   3 06:19 wang
drwxr-xr-x.  2 root root    6 4月  11 2018 yp
drwxr-xr-x.  2 root root   30 7月   3 06:23 zhang
[root@localhost var]# mkdir zhao
[root@localhost var]# ll
总用量 16
drwxr-xr-x.  2 root root   19 6月  22 04:36 account
drwxr-xr-x.  2 root root    6 4月  11 2018 adm
drwxr-xr-x. 13 root root  159 6月  22 05:27 cache
drwxr-xr-x.  2 root root    6 11月  5 2018 crash
drwxr-xr-x.  3 root root   34 6月  22 04:36 db
drwxr-xr-x.  3 root root   18 6月  22 04:35 empty
drwxr-xr-x.  2 root root    6 4月  11 2018 games
drwxr-xr-x.  2 root root    6 4月  11 2018 gopher
drwxr-xr-x.  3 root root   18 6月  22 04:08 kerberos
drwxr-xr-x. 61 root root 4096 6月  22 05:26 lib
drwxr-xr-x.  4 root root   44 6月  26 05:30 local
lrwxrwxrwx.  1 root root   11 6月  22 04:06 lock -> ../run/lock
drwxr-xr-x. 20 root root 4096 7月   3 06:16 log
lrwxrwxrwx.  1 root root   10 6月  22 04:07 mail -> spool/mail
drwxr-xr-x.  2 root root    6 4月  11 2018 nis
drwxr-xr-x.  2 root root    6 4月  11 2018 opt
drwxr-xr-x.  2 root root    6 4月  11 2018 preserve
lrwxrwxrwx.  1 root root    6 6月  22 04:06 run -> ../run
drwxr-xr-x. 12 root root  140 6月  22 04:36 spool
drwxr-xr-x.  4 root root   28 6月  22 04:14 target
drwxrwxrwt. 34 root root 4096 7月   3 06:19 tmp
-rw-r--r--.  1 root root    0 7月   3 06:19 wang
drwxr-xr-x.  2 root root    6 4月  11 2018 yp
drwxr-xr-x.  2 root root   30 7月   3 06:23 zhang
drwxr-xr-x.  2 root root    6 7月   3 06:24 zhao
[root@localhost var]# pwd
/var
[root@localhost var]# mv /var/zhang/ /var/zhao/
[root@localhost var]# 
[root@localhost var]# cd zhao/zhang/
[root@localhost zhang]# ll
总用量 0
-rw-r--r--. 1 root root 0 7月   3 06:23 dong
-rw-r--r--. 1 root root 0 7月   3 06:23 wang
[root@localhost zhang]# 

1562077613508

一天一个Linux命令,find命令

find命令

find命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。

语法

find(选项)(参数)

选项

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
-amin<分钟>:查找在指定时间曾被存取过的文件或目录,单位以分钟计算;
-anewer<参考文件或目录>:查找其存取时间较指定文件或目录的存取时间更接近现在的文件或目录;
-atime<24小时数>:查找在指定时间曾被存取过的文件或目录,单位以24小时计算;
-cmin<分钟>:查找在指定时间之时被更改过的文件或目录;
-cnewer<参考文件或目录>查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
-ctime<24小时数>:查找在指定时间之时被更改的文件或目录,单位以24小时计算;
-daystart:从本日开始计算时间;
-depth:从指定目录下最深层的子目录开始查找;
-expty:寻找文件大小为0 Byte的文件,或目录下没有任何子目录或文件的空目录;
-exec<执行指令>:假设find指令的回传值为True,就执行该指令;
-false:将find指令的回传值皆设为False;
-fls<列表文件>:此参数的效果和指定“-ls”参数类似,但会把结果保存为指定的列表文件;
-follow:排除符号连接;
-fprint<列表文件>:此参数的效果和指定“-print”参数类似,但会把结果保存成指定的列表文件;
-fprint0<列表文件>:此参数的效果和指定“-print0”参数类似,但会把结果保存成指定的列表文件;
-fprintf<列表文件><输出格式>:此参数的效果和指定“-printf”参数类似,但会把结果保存成指定的列表文件;
-fstype<文件系统类型>:只寻找该文件系统类型下的文件或目录;
-gid<群组识别码>:查找符合指定之群组识别码的文件或目录;
-group<群组名称>:查找符合指定之群组名称的文件或目录;
-help或——help:在线帮助;
-ilname<范本样式>:此参数的效果和指定“-lname”参数类似,但忽略字符大小写的差别;
-iname<范本样式>:此参数的效果和指定“-name”参数类似,但忽略字符大小写的差别;
-inum<inode编号>:查找符合指定的inode编号的文件或目录;
-ipath<范本样式>:此参数的效果和指定“-path”参数类似,但忽略字符大小写的差别;
-iregex<范本样式>:此参数的效果和指定“-regexe”参数类似,但忽略字符大小写的差别;
-links<连接数目>:查找符合指定的硬连接数目的文件或目录;
-iname<范本样式>:指定字符串作为寻找符号连接的范本样式;
-ls:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出;
-maxdepth<目录层级>:设置最大目录层级;
-mindepth<目录层级>:设置最小目录层级;
-mmin<分钟>:查找在指定时间曾被更改过的文件或目录,单位以分钟计算;
-mount:此参数的效果和指定“-xdev”相同;
-mtime<24小时数>:查找在指定时间曾被更改过的文件或目录,单位以24小时计算;
-name<范本样式>:指定字符串作为寻找文件或目录的范本样式;
-newer<参考文件或目录>:查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
-nogroup:找出不属于本地主机群组识别码的文件或目录;
-noleaf:不去考虑目录至少需拥有两个硬连接存在;
-nouser:找出不属于本地主机用户识别码的文件或目录;
-ok<执行指令>:此参数的效果和指定“-exec”类似,但在执行指令之前会先询问用户,若回答“y”或“Y”,则放弃执行命令;
-path<范本样式>:指定字符串作为寻找目录的范本样式;
-perm<权限数值>:查找符合指定的权限数值的文件或目录;
-print:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为每列一个名称,每个名称前皆有“./”字符串;
-print0:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为全部的名称皆在同一行;
-printf<输出格式>:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式可以自行指定;
-prune:不寻找字符串作为寻找文件或目录的范本样式;
-regex<范本样式>:指定字符串作为寻找文件或目录的范本样式;
-size<文件大小>:查找符合指定的文件大小的文件;
-true:将find指令的回传值皆设为True;
-typ<文件类型>:只寻找符合指定的文件类型的文件;
-uid<用户识别码>:查找符合指定的用户识别码的文件或目录;
-used<日数>:查找文件或目录被更改之后在指定时间曾被存取过的文件或目录,单位以日计算;
-user<拥有者名称>:查找符和指定的拥有者名称的文件或目录;
-version或——version:显示版本信息;
-xdev:将范围局限在先行的文件系统中;
-xtype<文件类型>:此参数的效果和指定“-type”参数类似,差别在于它针对符号连接检查。

参数

起始目录:查找文件的起始目录。

实例

列出当前目录及子目录下所有文件和文件夹:

1561993599386

/home目录下查找以.txt结尾的文件名:

1561993731683

/home目录下查找以.txt结尾的文件名(忽略大小写)

1561993833251

当前目录及子目录下查找所有以.txt和.pdf结尾的文件:

1561993969968

一天一个Linux命令,df命令

df命令

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

语法

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为单位:

1561733441216

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

1561733519472

df -a 查看全部文件系统:

[fenglangjuxu@localhost ~]$ 
[fenglangjuxu@localhost ~]$ df -h
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   13G  3.7G  8.9G   30% /
devtmpfs                 403M     0  403M    0% /dev
tmpfs                    420M     0  420M    0% /dev/shm
tmpfs                    420M  7.7M  412M    2% /run
tmpfs                    420M     0  420M    0% /sys/fs/cgroup
/dev/sda1               1014M  166M  849M   17% /boot
tmpfs                     84M   24K   84M    1% /run/user/1000
/dev/sr0                 4.3G  4.3G     0  100% /run/media/fenglangjuxu/CentOS 7 x86_64
[fenglangjuxu@localhost ~]$ 
[fenglangjuxu@localhost ~]$ df -a
文件系统                   1K-块    已用    可用 已用% 挂载点
rootfs                         -       -       -     - /
sysfs                          0       0       0     - /sys
proc                           0       0       0     - /proc
devtmpfs                  412268       0  412268    0% /dev
securityfs                     0       0       0     - /sys/kernel/security
tmpfs                     429340       0  429340    0% /dev/shm
devpts                         0       0       0     - /dev/pts
tmpfs                     429340    7808  421532    2% /run
tmpfs                     429340       0  429340    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/freezer
cgroup                         0       0       0     - /sys/fs/cgroup/cpuset
cgroup                         0       0       0     - /sys/fs/cgroup/net_cls,net_prio
cgroup                         0       0       0     - /sys/fs/cgroup/pids
cgroup                         0       0       0     - /sys/fs/cgroup/cpu,cpuacct
cgroup                         0       0       0     - /sys/fs/cgroup/devices
cgroup                         0       0       0     - /sys/fs/cgroup/hugetlb
cgroup                         0       0       0     - /sys/fs/cgroup/perf_event
cgroup                         0       0       0     - /sys/fs/cgroup/memory
cgroup                         0       0       0     - /sys/fs/cgroup/blkio
configfs                       0       0       0     - /sys/kernel/config
/dev/mapper/centos-root 13092864 3852376 9240488   30% /
selinuxfs                      0       0       0     - /sys/fs/selinux
systemd-1                      0       0       0     - /proc/sys/fs/binfmt_misc
debugfs                        0       0       0     - /sys/kernel/debug
hugetlbfs                      0       0       0     - /dev/hugepages
mqueue                         0       0       0     - /dev/mqueue
/dev/sda1                1038336  169500  868836   17% /boot
sunrpc                         0       0       0     - /var/lib/nfs/rpc_pipefs
tmpfs                      85868      24   85844    1% /run/user/1000
gvfsd-fuse                     0       0       0     - /run/user/1000/gvfs
fusectl                        0       0       0     - /sys/fs/fuse/connections
/dev/sr0                 4480476 4480476       0  100% /run/media/fenglangjuxu/CentOS 7 x86_64
[fenglangjuxu@localhost ~]$                                              

1561733719527

df -i 显示inode的信息:

补充下iNode inode包含文件的元信息,具体来说有以下内容:

  * 文件的字节数

  * 文件拥有者的User ID

  * 文件的Group ID

  * 文件的读、写、执行权限

  * 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime 指文件上一次打开的时间。

  * 链接数,即有多少文件名指向这个inode

  * 文件数据block的位置

1561733873139