linux安装的新命令在哪个文件夹下面?

我最近正好在写XFS系列的文章,里面就包括XFS如何定位一个文件的位置,参考下面这个链接的

  • 文件系统On-disk构造(未完待续):
  1. (回答:一个盘片一个分区能否实现)

不同文件系统定位文件的方式有细节的不同,以XFS为例,这种使用inode结构的文件系统在定位文件的时候可以直接通过inode number来定位inode的位置,主要参考上述链接中的XFS的on-disk组织结构(6)这篇文章。

inode号由下面的格式组成

一个inode号描述了一个inode在一个XFS文件系统的哪个AG的哪个block的哪个inode块里,由此直接定位一个inode,像这样:

但是如何得到一个文件的inode号呢?答案是通过目录的内容,在创建文件的时候就会根据创建的文件的inode所在的物理位置计算出其对应的inode号并存储在目录里,关于目录的结构参考上面XFS的on-disk组织结构(8)(9)(10)三篇文章。

在找到文件inode后,定位和组织文件内容又是另一个概念,关于XFS的文件如何组织数据,参考XFS的on-disk组织结构(7)这篇文章。

因我已经用更多的篇幅介绍了所有的逻辑,所以就不再用多余的篇幅在这里再介绍一遍了。而且除了on-disk结构以外,通过路径名访问到一个文件还需要很多VFS方面的内容,比如挂载关系。

  1. 首先找到"/"这个挂载点上挂载的文件系统实例,根据具体的文件系统(A)类型获取其root inode。
  2. root inode一般来说肯定是一个目录类型的inode,然后在这个root inode的数据里查找home这个目录,找到后获取其inode号。
  3. 根据"home"的inode号可以定位到home这个目录inode在文件系统A上的位置,读取内容,找到test。但是假设/home上还挂载着一个文件系统(B),那么此时就不是获取文件系统A的root inode里的home了,而是通过挂载关系找到挂载在/home的文件系统(B)实例,获取文件系统B的root inode,并在这个root inode里找一个名为"test"的目录条目,找到后获取其inode 号。
  4. 假设第3步我们是在另一个文件系统B上获取到了test的inode号,下面根据这个inode号在文件系统B上定位test目录对应的inode的位置,获取其内容,找到名为"testfile"的一个目录条目,获取其inode号。
  5. 根据上面获取到的inode号定位到testfile在文件系统B上的inode的位置,再读取这个inode的信息获得此文件数据块等的结构和位置以获取其内容。

总之这不是一个简单的问题,而我已经在我的很多文章里介绍过了。如果真的想了解这方面的知识,还是更细致的去了解为好。如果只是想了解个大概,那么通过目录得到inode号,再通过inode号定位具体的inode,就够了。

下面我手动演示一下获取一个文件的过程:

我的"/"目录上挂载着一个文件系统A(是一个XFS文件系统),我在/mnt/test/上也挂载一个文件系统B(是另一个XFS文件系统),然后我在/mnt/test上创建目录dir,接着创建文件dir/testfile,并写入一些数据,如下:

按照上面我说的过程,首先我们尝试从挂载在"/"上的文件系统上获取“mnt”这个条目并找到其inode号:

我们在“mnt”所在的inode里找到了“test”,但是通过挂载关系我们发现test上挂载着另一个文件系统,那么下面我们就不是在当前的文件系统的"test"目录里去找下一个"dir"了,而是到挂载在/mnt/test上的文件系统的root inode里去找"dir"(注意下面是另一个文件系统了):

可以看到testfile的inode块在当前文件系统的第67584字节处,长512个字节。

当然,不知道这个问题是要定位文件的位置还是文件数据的位置,如果要定位文件数据的物理位置,则可以进一步通过inode找到数据的组织结构,比如:

bmap是指一个文件的数据的逻辑偏移地址和物理地址的映射关系,比如上面展示的:

通过下面的命令可以展示的更详细:

FILE-OFFSET表示文件的逻辑偏移地址,BLOCK-RANGE表示前面的逻辑地址对应的物理地址。

当然以上的命令都是适用于XFS的专业工具,不同的文件系统因为有不同的组织方式,想解析不同的文件系统则需要对不同的文件系统有专业性了解,以及使用不同的工具。即使有一款工具可以支持多种文件系统的某些方面的分析,那也必须有针对不同文件系统的区别处理,否则也只能作出有限的分析,比如filefrag这个来自e2fsprogs的面向extN的工具也可以兼容性的帮助查看其它一些文件系统的文件的逻辑地址和物理地址的映射:

但是功能也非常有限。专业的分析必然先需要专业的理解,有专业的理解即使是直接以二进制(十六进制)读取文件系统所在的存储设备,也能进行分析。

}

linux的text模式下,想知道系统下安装了哪些软件包,以及软件包安装在哪个目录下,可以用以下命令,当然,可能还不止,我所知道的目前就是下面的这些。如果你还有新的,可以留言告诉我。

1. which命令查找出相关命令是否已经在搜索路径中,例子如下:

注意:如果which没有找到要找的命令,可以试试whereis,该命令搜索更大的范围的系统目录。有些系统上的which命令不显示用户没有执行权限的文件。例如

locate命令用于查找文件,它比find命令的搜索速度快,它需要一个数据库,这个数据库由每天的例行工作(crontab)程序来建立。当我们建立好这个数据库后,就可以方便地来搜寻所需文件了。

如果用户知道自己要查找到软件包的名字,可以直接使用下面的命令。这个命令只在支持rpm的linux版本上有效,如redhat,centos,fedora和suse等。

yum的参数很多,以下是用于查找软件包的命令。但是也只支持特定的发型版本,centos下最常用的命令

whereis是查找文件或者命令的所在目录

这个命令可用来查找系统是否安装了指定的软件包,更重要的是也可以查找自己对软件包名称记忆不是很清晰的软件包。而且我想是这是所有linux和unix都支持的。find的查找范围很广,功能强大,再搭配用正则表达,效果很好,不过建议尽量缩小搜索范围,减少系统压力,毕竟,当系统文件多了,搜索耗费时间和资源的。

}

我们先了解一下Linux中用户是如何组织的,然后再来学习如何变身为超级用户。

在Linux中,理论上说来,我们可以创建无数个用户。但是这些用户是被划分到不同的群组里面的。

有一个用户,名叫root,是一个很特殊的用户。字大管家,号超级用户。因为在Linux系统中,它可以做任何事情。

sudo命令:以root身份运行命令

sudo是英语Substitute User DO的缩写,substitute是“替换,代替,替身”的意思,user是“用户”的意思,do就是“做”的意思。所以连在一起就是“替换用户来执行...”的意思。

因此,如果我们要运行只有root才可以运行的命令,那么可以在此命令前面加上sudo命令,如下:

sudo su命令:一直成为root,当我们身为root时,只要运行exit命令,就随时可以回到个人用户。

在Ubuntu以外的其他Linux发行版,也许切换到root账户,不是用sudo su,而是只需要su就可以了。当然我们比较建议再加一个横线,用

这样不仅能切换为root,还可以直接定位到root的家目录。而且可以直接使用root才能用的那些命令。

我们就可以来学习一些只有root用户才能运行的命令了。

adduser命令:添加新用户
passwd命令:修改密码

如果之后你对设定的密码不满意,那么可以用passwd命令来修改当前密码。

用法也类似adduser,只要在其后加上需要修改密码的那个用户名,例如:

运行deluser thomas这个命令,终端不会提示你确认是否删除,而是直接删除了用户thomas。

所以,deluser这个命令还是要谨慎使用。单单用deluser命令,不加参数的话,只会删除用户,但是不会删除在/home目录中的用户家目录。如果你想要连此用户的家目录也一并删除,可以加上--remove-home 这个参数,如下:

这样,不仅删除了thomas这个用户,连/home/thomas这个目录也会删除。其他的LInux发行版,一般来说,添加用户和删除用户是用useradduserdel命令。

把用户分在不同的群组,到底有何意义呢?

在用户不多的时候,我们会觉得一个用户属于一个群组(比如默认是与用户名相同的群组名)是挺不错的。但是一旦用户一多,你可能就想要创建群组了。

usermod命令:修改用户账户

usermod命令有好多参数,可以实现不同的功能。不过我们暂时只需要记得它的两个参数:

  • -l:对用户重命名,但是/home目录中的用户家目录名不会改变,需要手动修改。

  • -g:修改用户所在群组

用法很简单,假如我要将thomas这个用户放到我刚创建的friends这个群组里,可以这样写:

我们怎么知道用户thomas的群组已经改变为friends了呢?

我们可以用groups命令,这个命令可以获知一个用户属于哪个(些)群组。

用法很简单,后接用户名就可以了,当然用户要存在才行。

当然我们也可以一次将一个用户添加到多个群组,就用 -G 参数(大写的G)。用法如下:

以上命令把thomas添加到friends,happy和funny三个群组。记得群组名之间要用逗号分隔,而且没有空格。

注意:使用usermod时要小心,因为配合-g或-G参数时,它会把用户从原先的群组里剔除,加入到新的群组。如果你不想离开原先的群组,又想加入新的群组,可以在-G参数的基础上加上-a参数,a是英语append的缩写,表示“追加”。例如:

注意:groups命令如果单独用,不加任何参数,会显示当前用户所在群组。
记得,追加群组的时候,一定要用大写的G这个参数,不能用小写的g这个参数,即使只追加一个群组。

其他的LInux发行版,一般来说,添加用户和删除用户是用groupaddgroupdel命令。

修改文件的所有者和群组

只有root用户可以修改一个文件的所有者和群组。

chown命令:改变文件的所有者

用法也很简单,后接新的所有者的用户名,再接文件名。例如:

第一个参数 /ubuntu 是法国Ubuntu官方软件仓库的服务器。

第二个参数trusty,是我们所使用的Ubuntu的版本号,trusty是Ubuntu /ubuntu 这个服务器地址替换为其他软件仓库的服务器地址即可。

那么问题来了:我怎么知道其他软件仓库的服务器地址呢?

你可以用搜索引擎来寻找,比如可以搜“Ubuntu repository”。

当然也可以用图形界面来更改。

package:包。这是软件的二进制安装包。类似Windows中软件的安装程序(大多以.exe结尾)。

dependency:依赖。一个软件包可能需要其他的软件包作为运行的基础。这是依赖关系。

repository:仓库。软件的仓库,就是存放软件的服务器,我们从这些服务器上下载软件。

我们上面演示了如何切换其他软件仓库,但也不一定要切换,用默认的软件仓库也是可以的。

当然了,我们也可以使用终端来管理软件包,终端的软件包管理命令一般用两个:

  • apt-get:最常用的,一般小编用这个比较多。

  • aptitude:这个命令在卸载软件时可以卸载不用的依赖。

man命令,显示使用手册

man是manual的缩写,就是英语“使用手册”的意思。

man命令用法很简单,后接你想要显示使用手册的命令,函数或者其他。

此命令用于查看系统中自带的各种参考手册,但是手册分为好几个类别,如下所示:

1 可执行程序或shell命令
2 系统调用(Linux内核提供的函数)
3 库调用(程序库中的函数)
4 特殊文件(通常在/dev下)
8 系统管理命令(通常只能被root用户使用)

即可以查到相关的命令和函数。若不加数字,那man命令默认从数字较小的手册中寻找相关命令和函数。

例如,本来是想寻找C语言标准库中的rand()函数,直接使用man rand得到的是一个rand命令的手册,直接用来产生一个随机数,这个内容在手册第1部分中。

比如,我们举个例子,用man命令来显示ls命令的使用手册:

正如我们在上图中所看到的,手册页分为不同的区域。这些区域的名字是用大写和粗体表示,且靠左对齐:

  • NAME:英语“名字”的意思。手册页对应的命令或函数名字,后接简单描述。

  • SYNOPSIS: 英语“概要,大意,摘要”的意思。使用此命令的所有方法。下面我们会详述这个区域,因为此区域的内容极为关键。

  • DESCRIPTION: 英语“描述”的意思。命令的更深入的描述。这个区域也会包括所有参数及其用法。一般来说这个区域是文字最多的。

  • AUTHOR: 英语“作者”的意思。命令的作者。有时候不止一个作者。

  • REPORTING BUGS: 英语“报告故障”的意思。如果使用时遇到bug(程序的缺陷),有汇报问题的联系方式,通常是邮件。

  • COPYRIGHT: 英语“版权”的意思。版权。也就是用了什么许可证(Licence)。大多数命令都是在GPL许可证之下的开源代码。

  • SEE ALSO: 英语“另见”的意思。与此命令有关的其他命令。扩展阅读。

SYNOPSIS这个区域是手册页中很重要的一个区域,但也是最难理解的区域之一。

SYNOPSIS这个区域的作用就是列出使用命令的所有可能方法。简单地说,SYNOPSIS这个区域显示了所有可能的参数组合。

有些命令的SYNOPSIS区域比较简单,但有些就很复杂了,会是一长串,看得人头大。

我们下面就用一些实际的例子来学习。

我们一点点解析此SYNOPSIS区域:

  • mkdir:使用mkdir命令,我们当然需要先输入mkdir,这是很好理解的。

  • [OPTION]:option是英语“选项”的意思。表示在mkdir之后,我们可以加选项参数(就是 -v,-h之类)。在SYNOPSIS区域中,中括号中的内容表示可选,所以我们并不一定要添加选项参数。

  • DIRECTORY:directory是英语“目录”的意思。就是需要用mkdir命令创建的目录。这个参数是必须的,因为并没有用中括号括起来。这也不难理解,因为mkdir命令就是用于创建目录的,那最少也要输入一个目录的名字吧。

  • ... :省略号表示可以有多个此类内容。在[OPTION]和DIRECTORY后都有省略号,分别表示可以有多个选项和多个目录名。也即是说可以同时指定多个选项参数,也可以用mkdir同时创建多个目录。

SYNOPSIS区域中,粗体的文字表示要原封不动地输入,下划线的文字表示要用实际的内容替换。

这也不难理解:mkdir命令肯定要原封不动地输入,而DIRECTORY就要替换成实际要创建的目录名称。

  • 粗体:原封不动地输入。

  • 下划线的部分:用实际的内容替换。

  • [-hvc]:-h,-v和-c选项都是可选的,非强制性的。

  • a|b:你可以输入a或者b选项,但是不能够同时输入a和b。

  • option...:省略号表示前面的内容可以输入任意多个。

在使用man命令时,我们需要先知道我们要显示使用手册的那个命令的名字。那如果不知道那个命令叫什么怎么办呢?

这时候我们就需要请apropos命令上场了,apropos是英语“关于”的意思。

apropos命令的用法很简单,只要后接一个关键字,apropos命令就会为你在所有手册页中查找相关的命令。

我们用实际例子来学习:你想要知道如何用终端的命令来控制音量。

为什么用sound这个关键字呢?因为sound是英语“声音,音量”的意思。

如上图所见,运行apropos sound之后,就列出了所有使用手册中有sound这个关键字的命令。

可以看到,左侧是命令的名字,后边是命令的手册中出现关键字的句子。

我们就知道了要调节音量可以用的命令是:

虽说man命令和apropos命令是最常用的两个有关手册的命令,但是还有其他查阅手册的方式。

那么哪些是man的替代品呢?

虽然并不一定,但是大多数命令都接受-h这个参数(有时候它等价的参数--help也可以)。

-h参数中的h是help的首字母,help是英语“帮助”的意思。所以-h或--help参数的作用是显示帮助文档。

虽说一般帮助文档没有man命令显示的使用手册那么详细,但是也很有用,且往往比man显示的手册易于阅读。

比如我们要查看apt-get命令的帮助文档,可以这样:

what是英语“什么”的意思,is是英语“是”的第三人称单数形式。所以连起来what is就是“是什么”的意思。

whatis命令可以说是man命令的精简版,它只会列出man命令显示的手册的开头部分,就是概述命令的作用。

例如用whatis命令来查看ls命令的作用。

locate命令,快速查找

第一种查找文件的方法可以说是很简单的。用到的命令是locate。

locate是英语“定位”的意思。这个命令用于定位要查找的文件,而且此命令很快。

locate命令的用法也很直观,后接需要查找的文件名(当然也可以用正则表达式)。

例如我们来查找一个叫做 renamed_file的文件:



我们运行locate france后,终端列出了所有包含france的文件和目录。


所以locate命令是搜索包含关键字的所有文件和目录。

在使用locate命令查找文件时,大家可能会遇到这样的问题:我刚创建的文件,为什么用locate命令查找不到呢?

这正好是locate命令的缺陷,我正要说到:locate命令不会对你实际的整个硬盘进行查找,而是在文件的数据库里查找记录。

locate命令的原理如下图所示:


对于刚创建不久的文件,因为它们还没被收录进文件数据库,因此locate命令就找不到其索引,自然就不会返回任何结果。

Linux系统一般每天会更新一次文件数据库。因此,只要你隔24小时再用locate查找,应该就能找到你刚创建的文件了。

我们可以用updatedb命令强制系统立即更新文件数据库。但是updatedb命令只能由root用户执行。

这个命令执行需要一点时间,小编执行的时候等了几分钟才完毕。

一旦执行成功,你再用locate查找你刚才创建的文件,就可以找到了。

总结一下:locate命令方便快捷,易于使用。但缺点也很明显:

  • locate命令会列出所有在文件数据库中找到的内容,有时候结果太多了,太繁杂。

  • locate命令不能找到一天之内刚创建的文件,除非你先用root身份运行updatedb命令来更新文件数据库。

当locate命令不够用时,我们需要一个更强大的命令,它就是find命令。

find命令,深入查找

find命令是查找文件的利器,而且它可以让我们对每个找到的文件做后续的操作。find命令非常强大,可以做很多事情,因此也比较复杂。

find命令可以说是Linux中最常用的命令之一了。所以,一起来探秘吧。

与locate命令不同,find命令不会在文件数据库中查找文件的记录,而是遍历你的实际硬盘。

所以,如果你的硬盘容量很大的话,那find命令会查找比较久。

find命令的这种“耿直”的查找方式保证了我们不会遗漏一天之内创建的文件。但这绝对不是find的唯一强大之处,远远不是。

find命令的用法是这样的:

find 《何处》《何物》《做什么》

这几个参数中,只有《何物》是必须指定的,也就是要查找什么。

  • 何处:指定在哪个目录中查找。此目录的所有子目录也会被查找。与locate命令的查找所有文件数据库的所有记录不同,find命令可以限定查找目录,比如我们可以只让find查找/home目录。默认地,假如我们没有给出《何处》这个参数,那么find命令会在当前目录及其子目录中查找。

  • 何物:也就是要查找什么。我们可以根据文件的名字来查找,也可以根据其大小来查找,也可以根据其最近访问时间来查找,等等。这个参数是必须的。

  • 做什么:用find命令找到我们要的文件后,可以对每个文件做一定的操作,称为“后续处理”。默认地,假如不指定这个参数,那么find命令只会显示找到的文件,不会做其他事情。

find命令的基础用法

我们首先来学习最基本的查找:用文件名来查找。

首先,我们定位到用户的家目录中(对于小编来说是/home/oscar),然后我要在当前目录及其子目录中查找france1.jpg这个文件。

这里,我们用-name参数指定了文件名字,是france1.jpg,用双引号括起来。不加双引号或者用单引号也是可以的。

经过了一点时间,查找才停止,因为find命令会遍历指定的所有目录。

如果find命令没有结果显示,那么表示此文件不存在。

因为我们没有指定《何处》这个参数,所以find命令就会在当前目录(~,也就是用户的家目录中,/home/oscar)及其子目录中查找。

假如,现在我位于我的家目录中,我却想在其他目录中进行查找,怎么办呢?

那就须要指定《何处》这个参数了。

例如,我要在/var/log目录下查找名为syslog的文件,我应该这么输入:

我们注意到了:与locate命令不同的是,find命令只会查找完全符合《何物》的字符串表示的文件。locate会查找所有包含关键字的文件。比如,如果要用find来找thing这个文件,那么只会找到名字就是thing的文件;而locate命令会查找到比如thing,thing1,onething,twothings这样的文件。

因此,我们用find查找syslog文件时,就不会查找到syslog2这样的文件。

不过我们可以用我们之前学过的通配符:*(星号)来实现匹配多个名称。

例如,我要查找所有以syslog这个关键字开头的文件,可以这样来实现:

如果你不知道你要找的文件的名称,那怎么办呢?

不要担心,还有其他方式来查找文件的。

我们先来看如何根据文件大小查找。

例如,我们可以查找/var中大小超过10M的文件(当然你要以root身份):

这次,我们使用了-size参数,来指定查找文件的大小。size是英语“尺寸,大小”的意思。

后面紧跟的+10M表示大于10兆字节。

M是兆,也就是10的6次方;平时我们所说的Ko,Mo,Go其实分别是千字节,兆字节,千兆字节的意思。

如果我们要查找小于指定大小的文件,可以用减号。例如:

# 表示查找小于50Ko的文件。
# 表示查找大于20Go的文件。

如果没有加减号,则查找大小等于指定数值的文件。

根据文件的最近访问时间查找

如果你记得你近7天里在家目录中访问过JPG格式的图片,但是你忘记它们的名字了,如何查找呢?

-atime参数后面紧跟的-7表示7天之内,减号的作用是表示小于。

我们可以指定查找的文件类型,我们知道Linux中文件的类型大致分为两种:目录和文件。

因此,我们可以用-type参数来指定查找的文件类型。type是英语“类型”的意思。

  • -type d:只查找目录类型。d是directory的首字母,表示“目录”。

  • -type f:只查找文件类型。f是file的首字母,表示“文件”。

如果不用-type参数指定类型,那么find命令默认是查找目录和文件的。比如说,有syslog这个文件,和syslog这个目录,那么find会把他们都查找出来。

可以看到只查找到了mysql这个目录。

find命令的高级用法:操作查找结果

到目前为止,我们只是使用了find的基本功能。我们并没有指定《做什么》这个参数,也就是还没对查找到的结果做任何操作。

当然了,默认地,find命令会显示每个查找到的文件。

-print参数用于打印结果。

默认地,find命令只列出查找到的文件,但是我们可以将其用格式化的方式打印出来。

我们可以使用-printf参数。是不是想起了C语言中的printf函数?是的,printf是print formatted的缩写,表示“格式化打印”。

例如,我们可以这样打印查找到的内容:

我们在-printf参数后面写了"%p - %u\n",这个格式字符串的意思如下:

  • %u:文件的所有者,这里是小编的用户名,所以是oscar。

可以看到,用法和C语言的printf函数很类似。

假如我要删除查找到的文件,我可以用-delete参数。用法很简单:

将会删除当前目录及其子目录下所有以.jpg为后缀的文件。而且不会有确认提示。所以慎用-delete参数。

使用-exec参数,可以后接一个命令,对每个查找到的文件进行操作。

假设我想要将当前目录下所有查找到的JPG文件的访问权限都改为600,那么我们可以这样做:

就是说对于每个找到的.jpg结尾的文件,都进行-exec参数指定的操作:

这个操作不必用双引号括起来。

  • {} 会用查找到的每个文件来替换。

虽然-exec参数一开始有点看不懂其用法,但是慢慢地你会发现,这个参数太强大了,你可以对查找到的文件做任何你想要的操作。

如果你对于没有确认提示不太放心,你可以将-exec参数换成-ok参数,用法一样,只不过-ok参数会对每一个查找到的文件都做确认提示,输入y加回车表示对此文件进行此操作;输入n加回车表示对此文件不进行此操作。

}

我要回帖

更多关于 linux查看文件大小命令 的文章

更多推荐

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

点击添加站长微信