Linux里面du命令作用是什么?

先说一个shell,啥是shell,shell其实就是操作系统的人机接口。人类通过shell和机算计沟通,告诉计算机想干什么。计算通过shell告诉人类结果是什么。

使用命令查看我们安装了哪些shell

查看当前使用的shell

修改登陆shell可以使用命令

这样就登陆shell换成了zsh。Chsh -s的原理是修改了/etc/passwd文件中我们所登陆的用户对应那行最后一的shell配置。

Shell变量可以分为环境变量和自定义变量,区别是环境变量可以在其进程的子进程中继续有效。

变量在定义的时候不用加$,引用的时候要加$

使用export会把自定义变量导出为环境变量。

env和export命令显示的是环境变量。

set和declare命令显示是环境变量和自定义变量。

把路径加到PATH中:

LANG 定义了本机语言字符集和排序规则(LANG=en可发切换为英文) PS1 提示符字符串1

先说一下shell的通配符和常用字符集

* 匹配任意多个字符(包括0个) ? 匹配任意单个字符(不包括1个) [characters] 匹配任意一个属于字符范围中的字符 [!characters] 匹配任意一个不属于字符范围中的字符 [[:class:]] 匹配任意一个属于指定字符集中的字符
[:alnum:] 匹配任意一个字母或数字
b*.txt 以b开头,中间任意多个字符,并以.txt结尾 Da??? 以Da开头,后面跟3个任意字符的 [abc]* 以a、b、c其中的任意一个开头的 [!abc]* 不以a、b、c其中的任意一个开头的

xargs是excute argument的缩写,它的作用是从标准输入中读取内容,并将此内容重新格式化,然后传递给它要协助的命令,作为那个命令的参数执行。

说xargs之前,我们要先说一下管道的问题。

管道的作用就是把前面的标准输出作为后面命令的标准输入,比如:

通过管道传递,我们看到cat命令只是显示了ABC.txt这几个字符,而并不是显示的ABC.txt这个文件的内容。

这就引出了程序的编程方式的问题。很多的命令行程序,他们有的只能接受命令行参数,有的只能接受标准输入(比如echo),有的即能接受标准输入,也能接受命令行参数。但是从不同的渠道接受到的输入怎么处理就因程序而异了。完全取决于程序的编程方式。

标准输入就是编程语言中诸如scanf或者readline这种命令;而参数是指程序的main函数传入的args字符数组。管道符|和重定向符<>是将数据作为程序的标准输入,而$(cmd)是读取cmd命令输出的数据作为参数。反引号内的命令结果也做为参数。

输入重定向就是说,程序想读取数据的时候就会去 files[0] 读取,所以我们只要把 files[0] 指向一个文件,那么程序就会从这个文件中读取数据,而不是从键盘。同理,输出重定向就是把files[1]指向一个文件,那么程序的输出就不会写入到显示器,而是写入到这个文件中。管道符其实就是把一个进程的输出流和另一个进程的输入流接起一条“管道”,数据就在其中传递。

这样我们就理解了上图中cat命令的结果,cat如果带参数,那它会把参数代表的文件内的内容显示。如果cat是从标准输入中得到显示的内容,那cat会把标准输入中的内容直接显示出来。

说回xargs,xargs就是把前面命令的标准输出转换为后面命令的参数,而不是做为后面命令的标准输入。比如

上图中可以看到,xargs接收到标准输入,转换成cat的参数了。

在格式化方面,xargs默认会把收到的输入中的换行符、连续空格、制表符替换成单空格做为分隔符。

xargs的-0选项可以将分隔符从默认的空格变成NULL(也就是\0),还会将单引号、双引号、反斜线等都当做是普通字符。当然我们可以使用-d选项指定其它的符号为分隔符,但是要格外慎重一些,避免与目标中含有的符号一样,造成误分隔。

xargs的-n选项,比如-n 3 选项会把格式化好的参数每次3个传递给后面的命令来执行,这个过程中xargs会调用后面的命令多次。

xargs的-I选项,一图胜千言

-I 选项也会执行命令多次,并且把参数插到对应的位置。{}就是占位符,每次占一个位置,对比-n选项,后面的cat可以带选项。

-E 选项,遇到指定的参数时会截断。-E ‘aaa’会截掉aaa之后的参数。

time命令是用来测量Linux程序的执行时间的。

real:从ls执行到退出消耗的总时间(包括内核态代码执行时间+用户态代码执行时间+ls进程阻塞时间+中间其它进程的时间)。

  • user:ls用户态代码所消耗的时间。
  • sys:ls内核态代码一所消耗的时间。

这个time命令是bash的内置命令。还有一个time命令是独立软件。不要混了。

file命令可以识别出文件的类型和编码格式

  • -i 选项可以附加输出文件的MIME类型
  • -F 选项可以指定输出字段的分隔符号

file命令查看软链接文件时输出的是软链接本身的信息,加-L选项后可以查看实际文件的信息。

  • -f 选项可以从清单中读取大量的文件名批量工作
  • -z 选项可以查看gzip压缩的文件内部的文件信息

要说ln命令先得讲一下软件链接和硬链接

软件链接:类似于快捷方式,删除了软链接不会删出除源文件。
硬链接:拥有自己的inode节点,指向源文件的数据块。每新一建个硬链接源文件的数据块的引用计数会加1。删除硬链接时会对源文件数据块的引用计数减1,当引用计数减为0时系统才会真正清除此文件的数据。硬链接不能跨分区,也不能跨文件系统来建立。

ln默认是建立硬链接。使用-s选项可以建立软链接。

使用命令ln -s 源文件或目录 链接名称 来建立软链接

对于硬链接,不允许普通用户对目录建立硬链接。因为目录内可能会有别的硬链接,万一这个链中出现环的话遍历目录的时候就可能陷入无限循环。我们用ls -l命令可以看到目录的的链接数至少是2,说明系统中存在很多目录的硬链接,并且ln的-d选项就是root专门用来对目录建立硬链接。这个主要是因为我们说的不能建立目录的硬链接主要是操作系统的一个硬性规定,不是技术上不能实现。能建立是能建立,不能瞎见。万一出现循环,处理起来很头大。软链接不会出现循环,因为系统能够区分软链接,它有自己的inode节点。

ls的-i选项可以显示软链接的指向,便于查看。

最后再说一下ln命令的一个小问题

ln命令有个-n选项,官方解释是:把一个目录的软链接文件当成一个普通文件。意思就是对于源目录A,它有一个软链接P,P本来指向目录A的,现在我想让P指向另一个目录B,如我用ln -s P B命令对P进行重新指向是不能成功的。也就是说直接改指向是不行的,改不了,这个命令的结果是会在目录A里新建了一个指向的B的软链接。我们要想改P的指向必须使用ln -snf P B命令。f的意思是强制。

find命令来源于findutils软件包,这个软件包里还有其它三个有名的命令

  • xargs:由于来源于同一软件包,它和find的配合非常对口。
  • locate:用于根据文件名数据库快速定位文件。
  • updatedb:用于更新文件名数据库。

这里主要讲find命令,命令格式:find 路径 -选项(路径可以是多个,由空格分隔,选项可也是多个代表多个条件,文件名支持正则表达式)。

find a b c -name|regex|perm|mmin|size 命令会从abc三个文件夹和它们的子文件夹中递归搜索满足后面指定条件的文件。如果没有b目录,它会报错说明b目录不存在,然后继续搜索往后搜索c目录。

find默认是递归查找的,它会一级一级的子目录去搜索,可以使用-maxdepth选项指定查找深度,例如-maxdepth 1会只搜索当前文件夹内的内容,不会深入到子目录中,约等于关闭了递归查找。

在linux中,一切皆文件。所以你可以搜索任何东西,像普通文件、目录、链接、管道、设备等等都可以。

-type选项用来指定要搜索的文件类型

  • -name选项用来指定文件名称,可以使用shell能配符,例如-name “*.txt”
  • -user和-group用来筛选文件所属的用户和组

最后我们说一下按时间来搜索文件的方法,这个稍微复杂一些

-mmin:限制文件被修改的时间范围。+5代表5分钟以前被修改过。-5代表5分钟内初修改。
-cmin:限制文件状态改变的时间范围。+5和-5同上所述。
-amin:限制文件被访问的时间范围。
-mtime:同mmin,时间单位由分钟变成天。
-ctime:同cmin,时间单位由分钟变成天。
-atime:同amin,时间单位由分钟变成天。
 
B:诞生时间(只有BSD系统有)
-newermt :筛选修改时间比新的文件。指定的时间格式可以精确到秒,比如” 22:50:22”。

在find的查找条件中,他们默认是与的关系,各个条件是用and连接的。find的逻辑运算符有三个:

!:非,这个是单目运算符,把一个表达式取反。例如-type f -o !-name “*.txt” 将筛选是普通文件或者名字不是.txt结尾的文件。

最后说一个find命令的后处理选项-exec

-exec选项实际上是一个类似xargs的处理管道。例如下面的命令:

-exec选项会把搜索到的每个符合条件的文件传递给后面的ls命令。填充到{}占位符的位置。

在-exec用法中,分号(;)代表要传递的结果的目标命令(ls)结束,它是-exec选项的一部分,不是find命令的部分,为了防止分号在传给find之前被shell解析了,我们在分号前加个\转义一下。

du全称是disk usage,它会显示磁盘的使用情况。du与df是兄弟,du显示文件夹和文件的占用空间大小,df显示磁盘分区的使用大小。ls显示的是文件的实际大小(和占用空间大小不一样)。

du默认只输出文件夹的空间使用量,不会关注单个文件,要想包括单个文件的大小信息可以指定文件名或者使用-a选项:

-a 会把隐藏文件也显示出来。可以加上—exclude=”*/.*”来排除隐藏文件。
-h 选项用来以友好方式(带合适单位)显示大小,-c选项用来统计总量,如下所示

关于du有一点要注意,使用ls查看稀疏文件(sparse file)时文件的大小会显示很大,但是使用du去查看文件的占用空间时会发现文件实际占用的空间很小。

gzip是用来压缩文件的命令,它只能压缩普通文件,不支持压缩文件夹、符号链接等类型的文件。所以gzip一次只能压缩一个文件。

gzip -1 aa.txt:以级别1压缩aa.txt文件,一共1-9个级别,级别越高压缩强度越大,速度越慢。默认级别是6。

bzip2命令也是压缩文件的命令,相比于gzip,bzip2的稳定性和效果要好。

由于压缩命令一次只能压缩一个文件,且在不能压缩文件夹,所以我们需要一个打包工具,把要压缩的所有文件打包好后再压缩,这个命令就是tar。它可以一次性完成打包和压缩。

#-c:打包;-z:用gzip压缩;-v:显示过程的详细信息;-f:指定在打包的文件(放最后) tar -tzvf aa.tar.gz:把x选项换成t是指不解包,只是看看包里有什么文件。 我们可以不加任何解压参数,tat会自动识别压缩方式,直接用tar -xvf即可

zip命令可以压缩文件夹,而且压缩完后不会删除源文件。对应的解压命令是unzip

-r 选项用来递归压缩文件夹里有文件
-v 选项可以用来不解压只查看压缩文件里的文件
-t 选项可以用来测试压缩文件的完整性

dd命令用于读取标准输入、设备或文件中的内容,原封不去的写到别的地方。

bs用来指定单次读入和单次写出的数据块(block)大小,可是C(字节1B)、W(2B)、K、M、G默认512字节。也可以使用ibs和obs来分别指定单次读入和写出的大小。
count用来指定读写的次数。它和bs一起决定了要读出和写入的数据大小,比如上例中就代表每次读写1440K数据,只读写一次即可。

不加if=的话是从标准输入读取,不加of=的话是输出到标准输出。

grep命令用来进行文本搜索,grep默认只支持基本的正则表达式,加-E后支持扩展的正则表达式。加-F后是fast模式,不支持任何正则表达式,可以屏蔽掉正则表达式元字符。

grep查找是以行为单位,结果显示也是以行为单位输出。grep支持多文件查找。

-n选项会在结果中显示行号,-c选项会只显示统计有多少满足条件的行,不显示行内容。

grep默认会对搜索的内容区分大小写,使用-i选项可以不区分大小写。

-A,-B,-C三个选项用来显示除了符合条件的行以外,额外显示此行前面、后面、前后各多少行。比如-A 2是指额外显示符合条件的行和它前面2行。

在做多文件查找时,有时只想显示哪些文件包含要搜索的字符串而不需要知道具体的内容和行是多少,此时我们可以使用-l选项。取反的话可以用-lv或者直接用-L。

grep支持正则表达式,这是grep的主要用途,关于正则表达式因为内容太多,不做细说了,这里只说一下基本正则表达式和扩展正则表达式的区别。

这两者的区别主要是元字符的区别:

基本正则表达式(BRE)中,只承认^ $ . [ ] *这六个元字符。
扩展正则表达式(ERE)除了承认BRE的六个元字符外又增加了? + |等多个元字符。

要想把元字符当成普通字符需要在元字符前面加反斜杠\转义。

但是在ERE中,(){}这四个本来是普通字符,如果在()和{}前面加了反斜杠,那么()和{}会变成元字符。

sed用来进行文本的编辑替换,它也是以行为单位进行处理,流式作业,它会把文档的第一行调入缓冲区,然后处理(不需要处理的行不代表是没处理,它也要流过缓冲区,也会输出),处理完了输出,再调入下一行再处理,直到处理完成所有行。可以把sed看成一个染色器,根据条件对文档进行染色修饰,修饰完后输出,只不过是修饰一行输出一行。默认情况下sed是在缓存中处理文件,处理结果不会影响源文件。

sed的用法:sed option command file。对于option,一般用-n屏蔽输出没有处理的行(sed默认会修饰一行输出一行,除非你是删除了这行),-e来设置多个command。-f用来从文件中读取command部分。command指明了如何处理,file指要处理的文件。

command部分是重点,包括两大块:一块用来限定范围,一块是处理动作。

先说范围限定这部分,有两种方式:

指定行数,比如“3,5”代表从第三行到第五行,也就是345这三行。
指定条件,使用正则表达式限定行的模式,比如/^a/代表以a开头的行。

指定范围并不是说只有这个范围内的行会流过sed,其它的行也会流过sed。指定范围只是指定了后面的命令要作用的范围。不在这个范围内的行只是原样流过sed,不做命令指定的处理。

再说动作部分,这个很多,说几个常用的:

p:打印显示该行。一般和-n选项一起使用。
r:读取指定文件的内容。
a:在下面插入新行新内容。
s:替换文本整体,支持正则表达式和&附加符号。
y:对位替换,不支持正则和&符号,比如'y/ab/AB/',是指把a替换为A,把b替换为B,不 管ab是不是连续。
bb对调了。这里用了sed的预存储技术,也就是用()括起来的部分会先被存储起来,根据()出现的顺序用\1,\2,\3这样的形式引用。

关于-e选项,-e选项会在顺序执行多个command时使用,注意多个command之间传递的不仅仅是要处理的行,每一行都会依次通过每个command,不区分需不需要处理,前一个command的结果是后一个command的输入,就这样一行行的在缓冲区中流过。如下图所示:

每一行都会依次流过每个命令,如果有命令不处理这一行,那它会原样流到下一个命令。

还有一个技巧,sed '/am/{n;s/bb/cc/;}' aa.txt这个命令的意思就是把含有am的行的下一行中的bb字符换成cc。这里的{}里面有两个命令,n就是指一行。

awk用来处理文本,很复杂,很强大。和sed一样,awk处理文件也是以行为单位。awk其实更像一种编程语言。

BEGIN和END处理部分可以省略。

条件部分支持正则表达式,$1,$2,$3....代表第一列第二列第三列。$0代表整行。如果一二列是数字我们还可以输出它们的和。

大体说一下awk的工作过程:

第一步:awk读取一条记录(1行),并将这条记录赋值给$0。把当前文件名赋值给FILENAME,把当文件编号赋值给ARGIND(这里是处理的第几个文件编号就是几),把当前文件已经读出的行数赋值给FNR,把awk这次工作从开始到现在一共读出的总行数(多文件)赋值给NR。
第二步:把记录分隔成多个字段,把这行的字段总数赋值给NF,并把各个字段依次存储到$1,$2,$3.....中。(默认的分隔符是空格、制表符,可以用-F来指定其它的字段分隔符;更精细的话可以把输入的字段分隔符存在FS变量中,输出的字段分隔符在OFS变量中。输入的行分隔符存在RS中,把输出的行分隔符存在ORS中)。
第三步:按照条件开始匹配这条记录,符合条件就进行后面的处理,不符合的话就不执行处理。不指定操作的话(就是没有{})默认是print,不指定条件的话就全部处理。操作故意留空的话{}则不作任何处理,也不会print。

awk命令一般会比较长,可以写成脚本,比如下面的tt.awk文件内容如下:

输出奇数行。next的意思是直接跳去处理下一行,后面的命令不要执行了。这里有个重点,就是一个条件只能作用于相临的一个处理块每个处理块前面都可加条件,这是流式处理。

打印出偶数行号,最后输出奇数行第二列的和。next在这里很特殊,这个next会使得整个处理部分变成一个三目运算符。条件成立执行第一条处理,条件不成立执行第二条处理。因为如果没有next,后面的那个处理块一直会执行。再就是这个例子出现了变量T,在awk中,变量不用声明,起名即可用。

这里面出现一个getline,getline会读取当前行的下一行数据,默认赋值给$0,并同时更新NF、NR、FNR的值,因此下次awk再文件时便会隔去这行再读第二行。但是如果geline后面跟一个指定的变量,比如getline b,那么getline会读取当前行的下一行数据赋值给b,则当前的$0的值不会变,但NF、NR、FNR的值还是会被更新,awk再次读的时候还是会隔一行读。

awk还支持for、while循环,还支持sub删除字符串。

grep用来筛出行,cut用来剪出列。

cut可以按字节(-b),按字符(-c),按字段(-f)来剪出内容。

cut -b -3, 4- aa.txt剪出从行开始到第三个字符,以及从第4个字符到行尾。cut的定位都是闭区间。

wc命令用来计算文件中的字节数、字数、单词数、行数等。

-c 统计字节数,-m统计字符数,-l统计行数,-w统计词数
-L 选项可以显示一个文件中最长行的长度(字节数)。

split命令用来分隔文件。举例如下:

把av.mp4拆分为一个个400M的文件,文件名会自动命名为x.aa、x.ab、x.ac。。。。。。
-b选项,以字节分隔,可以是KMGT。
-l 10,以10行为一个文件分融。
-a 2,分割后的文件后辍长度指定为2,上面的aa、ab、ac即是长度为2。

拆分后的文件合并可以使用cat命令

不用于合并文件,paste是用来按列拼接文件。拼接连接符默认是Tab,也可以用-d选项指定。-s选项可以转置结果。如下图所示:

sort用来对各种文件进行排序。也是以行为单位。默认输出结果到标准输出,不改变源文件内容。

sort aa.txt 把aa.txt中的内容按行排序,依据是依次比较各行的字符ascii码,如果文件里是数字,可以使用-n选项来使用数字大小排序。
sort -t ":" -k 2 aa.txt,以:为分隔符分成各个字段,以第2个字段为依据排序。对于-k选项还有很多细节,如下:
sort -t ":" -k 1 -k 2nr aa.txt,以第一列排序为主要关键字,以第二列为次要关键字逆序数字排序。
-f 选项会忽略比较时的大小写。
-c 选项会检查文件是不是已排好序,如果是乱序将输也第一个乱序的行的信息。
-C 同-c,只是不会输出第一行,如果是乱序不会输出东西,命令返回值1
-b 忽略每一行前面的所有空白,从第一个可见字符开始比较。
}

du(disk usage)命令可以计算文件或目录所占的磁盘空间。没有指定任何选项时,它会测量当前工作目录与其所有子目录,分别显示各个目录所占的快数,最后才显示工作目录所占总快数。

磁盘空间被耗尽的时候,免不了要清理一下,比如说/home目录太大,就可以使用下面命令看看到底是谁:

}

我要回帖

更多关于 du -sh命令 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信