目录

第六章:Linux文件与目录管理

6.1 目录与路径

1.相对目录与绝对路径

2.目录的相关操作

3.关于执行文件路径的变量:$PATH

6.2 文件与目录管理

1.文件与目录的查看:ls

2.复制、删除与移动:cp、rm、mv

3.获取路径的文件名与目录名称

6.3 文件内容查看

1.直接查看文件内容

2.可翻页查看

3.数据截取

4.非纯文本文件:od

5.修改文件时间或创建新文件:touch

6.4 文件与目录的默认权限与隐藏权限

1.文件默认权限:umask

2.文件隐藏属性

3.文件特殊权限:SUID、SGID、SBIT

4.观察文件类型:file

6.5 命令与文件的查找

1.脚本文件的查找

2.文件的查找

6.6 极重要的复习,权限与命令间的关系


第六章:Linux文件与目录管理

6.1 目录与路径

1.相对目录与绝对路径

Linux 系统中所有的文件(目录)都被组织成以根目录“/”开始的倒置的树状结构

绝对路径一定是由根目录 / 开始写起。例如,使用绝对路径的表示方式指明 bin 文件所在的位置,该路径应写为 ../bin

可以看到,如果仅传递给 Linux 系统一个文件名,它无法找到指定文件;而当将 bin 文件的绝对路径传递 Linux 系统时,它就可以成功找到。
和绝对路径不同,相对路径不是从根目录 / 开始写起,而是从当前所在的工作目录开始写起。使用相对路径表明某文件的存储位置时,经常会用到前面讲到的 2 个特殊目录,即当前目录(用 . 表示)和父目录(用 .. 表示)。
举个例子,当我们使用 root 身份登录 Linux 系统时,当前工作目录默认为 /root,如果此时需要将当前工作目录调整到 root 的子目录 Desktop 中,当然可以使用绝对路径。

对于文件名的正确性来说,绝对路径的正确度要比较好

2.目录的相关操作

常用的特殊目录

.    当前目录
..    上一层目录
-    前一个工作目录
~    当前【用户】所在的家目录

注意:在根目录下查询目录结构,可以发现存在 ... 两个目录,但可以发现两个目录的属性权限完全一致,代表根目录的上级目录与自身是同一个目录。

常见的处理目录的命令:

  • cd:切换目录
  • pwd:显示当前目录
  • mkdir:建立一个新目录
  • rmdir:删除一个空目录

cd(change directory,切换目录)

cd- 表示切换到刚才的目录。

pwd(显示目前所在的目录)

pwd单独使用时显示出实际的工作目录,而非链接文本本身的目录名而已;

pwd -P 时,不会显示链接文件的路径,而是显示正确的完整路径。

mkdir(建立新目录)

命令格式: mkdir [-mp] 目录名称

选项与参数:

-m:设置文件的权限,直接设置,不使用默认权限(umask)

-p:帮助你直接将所需要的目录(包含上层目录)递归创建

范例1:利用-p递归建立目录(没有加 -p 时会报告路径错误)

范例2:设置新建目录权限

若没有加上 -m 强制设置属性,系统会使用默认属性。

rmdir(删除“空”的目录)

有内容的文件夹无法直接删除,如果需要全部删除目录下文件必须使用【rm -r test】

3.关于执行文件路径的变量:$PATH

执行【echo $PATH】可以看到哪些

PATH这个变量的内容是由一堆目录所组成,每个目录中间用冒号(:)来隔开,每个目录有顺序之分。

  • 不同身份用户默认的PATH不同,默认能够随意执行的命令也不同(如root与neos);
  • PATH 是可以修改的;
  • 使用绝对路径或相对路径直接指定某个命令的文件名来执行,会比查找PATH来的正确;
  • 命令应该要放置到正确的目录下,执行才会比较方便;
  • 本目录(.)最好不要放到PATH当中。

6.2 文件与目录管理

1.文件与目录的查看:ls

选项 功能
-a 显示全部的文件,包括隐藏文件(开头为 . 的文件)也一起罗列出来,这是最常用的选项之一。
-A 显示全部的文件,连同隐藏文件,但不包括 . 与 .. 这两个目录。
-d 仅列出目录本身,而不是列出目录内的文件数据。
-f ls 默认会以文件名排序,使用 -f 选项会直接列出结果,而不进行排序。
-F 在文件或目录名后加上文件类型的指示符号,例如,* 代表可运行文件,/ 代表目录,= 代表 socket 文件,| 代表 FIFO 文件。
-h 以人们易读的方式显示文件或目录大小,如 1KB、234MB、2GB 等。
-i 显示 inode 节点信息。
-l 使用长格式列出文件和目录信息。
-n 以 UID 和 GID 分别代替文件用户名和群组名显示出来。
-r 将排序结果反向输出,比如,若原本文件名由小到大,反向则为由大到小。
-R 连同子目录内容一起列出来,等於将该目录下的所有文件都显示出来。
-S 以文件容量大小排序,而不是以文件名排序。
-t 以时间排序,而不是以文件名排序。
--color=never
--color=always
--color=auto
never 表示不依据文件特性给予颜色显示。
always 表示显示颜色,ls 默认采用这种方式。
auto 表示让系统自行依据配置来判断是否给予颜色。
--full-time 以完整时间模式 (包含年、月、日、时、分)输出
--time={atime,ctime} 输出 access 时间或改变权限属性时间(ctime),而不是内容变更时间。

2.复制、删除与移动:cp、rm、mv

cp(复制文件或目录)

命令格式:cp [-adfilprsu] 源文件(source) 目标文件(destination)
cp [option] source1 source2 source3 … directory
参数说明:

  • -a:是指archive的意思,也说是指复制所有的目录
  • -d:若源文件为连接文件(link file),则复制连接文件属性而非文件本身
  • -f:强制(force),若有重复或其它疑问时,不会询问用户,而强制复制
  • -i:若目标文件(destination)已存在,在覆盖时会先询问是否真的操作
  • -l:建立硬连接(hard link)的连接文件,而非复制文件本身
  • -p:与文件的属性一起复制,而非使用默认属性
  • -r:递归复制,用于目录的复制操作
  • -s:复制成符号连接文件(symbolic link),即“快捷方式”文件
  • -u:若目标文件比源文件旧,更新目标文件

如将/test1目录下的file1复制到/test3目录,并将文件名改为file2,可输入以下命令:
cp /test1/file1 /test3/file2

 在默认的条件中,cp的源文件与目标文件的权限是不同的,目标文件的拥有者通常会是命令操作者本身。

注:使用 -l 及 -s 都会建立所谓的链接文件(link file),但是这两种链接文件却有不一样的情况。

-l 是硬链接(hard link),-s 是符号链接(symbolic link),简单来说,bashrc_link 是一个快捷方式,这个快捷方式会链接到bashrc;

而 bashrc_slink 的文件与 bashrc 的属性与权限完全一模一样。

例:用neos的身份将/var/log/wtmp 文件复制到 /tmp 下面,并更名为 neos_wtmp

可以看到neos的身份不能随意修改文件的拥有者与用户组,虽然能复制wtmp的相关权限与时间等属性,但是与拥有者、用户组相关,即使加上-a 也无法完成完整权限的复制。

rm(删除文件或目录)

用户可以用rm命令删除不需要的文件。该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除。对于链接文件,只是断开了链接,原文件保持不变。

rm命令的一般形式为:rm [选项]... 目录... 删除指定的<文件>(即解除链接)。

  • -d      --directory    删除可能仍有数据的目录 (只限超级用户)
  • -f      --force          略过不存在的文件,不显示任何信息,强制删除
  • -i      --interactive 进行任何删除操作前必须先确认
  • -r/R --recursive    同时删除该目录下的所有目录层
  • -v      --verbose     详细显示进行的步骤

mv(移动文件与目录,或重命名)

  • -b: 当目标文件或目录存在时,在执行覆盖前,会为其创建一个备份。
  • -i: 如果指定移动的源目录或文件与目标的目录或文件同名,则会先询问是否覆盖旧文件,输入 y 表示直接覆盖,输入 n 表示取消该操作。
  • -f: 如果指定移动的源目录或文件与目标的目录或文件同名,不会询问,直接覆盖旧文件。
  • -n: 不要覆盖任何已存在的文件或目录。
  • -u:当源文件比目标文件新或者目标文件不存在时,才执行移动操作。

将多个文件移动到一个目录下,则最后一个参数为指定目录。

3.获取路径的文件名与目录名称

前者获取最后的文件名;后者取得目录名。

6.3 文件内容查看

  • cat由第一行开始显示文件内容
  • tac 从最后一行开始开始显示,可以看出 tac 是 cat 的倒着写
  • nl 显示的时候,同时输出行号
  • more 一页一页地显示文件内容
  • less 与 more 类似,但是比 more 更好的是,它可以往前翻页
  • head 只看前面几行
  • tail 只看后面几行
  • od 以二进制的方式读取文件内容

1.直接查看文件内容

直接查看文件内容可以使用 cat/tac/nl 几个命令。

cat(concatenate)

命令格式:cat [-AbeEnstTuv] [--help] [--version] fileName

cat也可以用于创建文件、合并文件。

  • -n 或 --number:由 1 开始对所有输出的行数编号。
  • -b 或 --number-nonblank:和 -n 相似,只不过对于空白行不编号。
  • -s 或 --squeeze-blank:当遇到有连续两行以上的空白行,就代换为一行的空白行。
  • -v 或 --show-nonprinting:使用 ^ 和 M- 符号,除了 LFD 和 TAB 之外。
  • -E 或 --show-ends : 在每行结束处显示 $。
  • -T 或 --show-tabs: 将 TAB 字符显示为 ^I。
  • -A, --show-all:等价于 -vET。
  • -e:等价于"-vE"选项;
  • -t:等价于"-vT"选项;

tac 

tac 与 cat 相反,相当于将命令反写打印出来。

nl(添加行号打印)

选项与参数:
-b  :指定行号指定的方式,主要有两种:-b a :表示不论是否为空行,也同样列出行号(类似 cat -n);-b t :如果有空行,空的那一行不要列出行号(默认值);
-n  :列出行号表示的方法,主要有三种:-n ln :行号在萤幕的最左方显示;-n rn :行号在自己栏位的最右方显示,且不加 0 ;-n rz :行号在自己栏位的最右方显示,且加 0 ;
-w  :行号栏位的占用的位数。

2.可翻页查看

more(一页一页翻动)

空白键 (space):代表向下翻一页;
Enter :代表向下翻『一行』;
/字串 :代表在这个显示的内容当中,向下搜寻『字串』这个关键字;
:f :立刻显示出档名以及目前显示的行数;
q :代表立刻离开 more ,不再显示该文件内容。
b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用,对管线无用。

less

less的用法比起more更有弹性,在more的时候,我们并没有办法向前面翻,只能往后面看,但若使用了less时,就可以使用 [pageup]、[pagedown] 等按键的功能来往前往后翻看文件。

less里面可以拥有更多的查找功能。不止可以向下查找,也可以向上查找,基本命令有:

空白键 :向下翻动一页;
[pagedown]:向下翻动一页;
[pageup] :向上翻动一页;
/字串 :向下搜寻『字串』的功能;
?字串 :向上搜寻『字串』的功能;
n :重复前一个搜寻 (与 / 或 ? 有关!)
N :反向的重复前一个搜寻 (与 / 或 ? 有关!)
q :离开 less 这个程序;

3.数据截取

我们可以将输出的数据作一个简单的截取,那就是取出文件前面几行(head)或取出后面几行(tail)文字的功能。不过要注意的是head与tail都是以“行”为单位来进行数据截取的。

head

[root@www ~]# head [-n number] 文件
选项与参数:
-n  :后面接数字,代表显示几行的意思[root@www ~]# head /etc/man.config
# 默认的情况中,显示前面十行!若要显示前 20 行,就得要这样:
[root@www ~]# head -n 20 /etc/man.config范例:如果后面100行的数据都不列印,只列印/etc/man.config的前面几行,该如何是好?

tail

[root@www ~]# tail [-n number] 文件
选项与参数:
-n  :后面接数字,代表显示几行的意思
-f  :表示持续侦测后面所接的档名,要等到按下[ctrl]-c才会结束tail的侦测[root@www ~]# tail /etc/man.config
# 默认的情况中,显示最后的十行!若要显示最后的 20 行,就得要这样:
[root@www ~]# tail -n 20 /etc/man.config范例一:如果不知道/etc/man.config有几行,却只想列出100行以后的数据时?
[root@www ~]# tail -n +100 /etc/man.config范例二:持续侦测/var/log/messages的内容<==要等到输入[crtl]-c之后才会离开tail这个命令的侦测!

4.非纯文本文件:od

上面的都是查看纯文本文件的内容。如果想要查看非文本文件,举例   说/user/bin/passwd 这个执行文件的内容时,又该如何读出信息呢?

事实上由于执行文件通常都是二进制文件(binary file),使用以上命令读取内容时会产生类似乱码的数据。所以我们可以利用od这个命令来读取。

选项或参数:
-t  :后面可以接各种『类型 (TYPE)』的输出,例如:a       :利用默认的字节来输出;c       :使用 ASCII 字节来输出d[size] :利用十进位(decimal)来输出数据,每个整数占用 size bytes ;f[size] :利用浮点数值(floating)来输出数据,每个数占用 size bytes ;o[size] :利用八进位(octal)来输出数据,每个整数占用 size bytes ;x[size] :利用十六进位(hexadecimal)来输出数据,每个整数占用 size bytes ;
将/etc/issue这个文件的内容以8进位列出储存值与ASCII的对照表

5.修改文件时间或创建新文件:touch

选项与参数:
-a  :仅修订 access time;
-c  :仅修改文件的时间,若该文件不存在则不创建新文件;
-d  :后面可以接欲修订的日期而不用目前的日期,也可以使用 --date="日期或时间"
-m  :仅修改 mtime ;
-t  :后面可以接欲修订的时间而不用目前的时间,格式为[YYMMDDhhmm]

修改时间 modification time (mtime):
当该文件的『内容数据』变更时,就会升级这个时间!内容数据指的是文件的内容,而不是文件的属性或权限喔!

状态时间 status time (ctime):
当该文件的『状态 (status)』改变时,就会升级这个时间,举例来说,像是权限与属性被更改了,都会升级这个时间啊。

读取时间 access time (atime):
当『该文件的内容被取用』时,就会升级这个读取时间 (access)。举例来说,我们使用 cat 去读取 /etc/man.config , 就会升级该文件的 atime 了。

默认情况下,ls 显示出来的是文件的mtime,也就是该文件的内容上次被修改的时间。

例1:新建一个空白文件观察时间;

例2:将~/.bashrc 复制成为bashrc,假设复制完整的属性,检查其日期。

可以观察例2的输出:

1.当前时间

2.mtime

3.atime

4.ctime

例3:修改例2的 bashrc 文件时间,将其调整为两天前。

可以看到日期从11月16日变为了11月14日。

例4:将上个例子的bashrc日期改为 2014/06/15 2:02。

6.4 文件与目录的默认权限与隐藏权限

前面已经了解了文件有若干个属性,包括读写执行(r、w、x)等基本权限以及是否为目录(d)与文件(-)或者链接文件(l)等属性。

除了基本权限外,在Linux传统的额ext2、ext3、ext4文件系统下,我们还可以设置其他的系统隐藏属性,这部分可以使用 chattr 来设置,而以 lsattr 来查看,最重要的属性就是可以设置其不可修改的特性,让文件的拥有者都不可以进行修改。这在安全功能上非常重要。

例:你的系统中有一个一般用户 neos,他的用户组属于 neos,他的根目录在 /home/neos,你是root,你想将你的~/.bashrc 复制给它,可以怎么做?

如下:

例:我想在/tmp下面建立一个目录,这个目录名称为诶chapter6_1,并且这个目录拥有者为neos,用户组为 neos,此外,任何人都可以进入该目录浏览文件,不过除了neos之外,其他人都不能修改该目录下的文件。

1.文件默认权限:umask

现在我们已经知道如何建立或是改变一个目录或文件的属性了,但当你建立一个新的文件或目录时,它的默认权限就和umask有关了。umask就是制定目前用户在建立文件或目录时候的权限默认值,它的指定条件以下面的方式来指定:

直接输入umask可以看到数字类型的权限设置值;加入-S(Symbolic)这个选项,就会以符号类型的方式来显示出权限。

其中四组数字中,第一组是特殊权限使用的。

在默认权限的属性上,目录与文件是不一样的。

  • 若用户建立为文件则默认没有可执行(x)权限,即只有rw这两个项目,也就是最大为666,默认权限如下:

-rw-rw-rw-

  • 若用户建立为目录,则由于x与是否可以进入此目录油管,因此默认为所有权限均开放,即777,默认权限如下:

drwxrwxrwx

要注意的是,umask 的数字指的是该默认值需要减掉的权限

因为umask的默认值为022,所以user并没有被拿掉任何权限,但group与others的权限被拿掉了2(也就是w这个权限),那么当游湖:

  • 建立文件时:(-rw-rw-rw)-(-----w--w-)==> -rw-r--r--
  • 建立目录时:(drwxrwxrwx)-(d----w--w-)==> drwxr-xr-x

但如果要使创建的额文件能够让同组用户共同编辑,那么umask的用户组就不能拿掉2这个w的权限,所以usmask应该设置为002才可以。要改变umask的值,只需直接在umask后面输入002就好。

2.文件隐藏属性

文件隐藏属性在系统安全上非常重要。但是下面的chattr命令只能在ext2、ext3、ext4的Linux传统文件系统上面完整生效,其他的文件系统可能就无法完整地支持这个命令了。

  • chattr(配置文件隐藏属性)

chattr命令的用法:chattr [ -RVf ] [ -v version ] [ mode ] files…
最关键的是在[mode]部分,[mode]部分是由+-=和[ASacDdIijsTtu]这些字符组合的,这部分是用来控制文件的
属性。

  • + :在原有参数设定基础上,追加参数。
  • - :在原有参数设定基础上,移除参数。
  • = :更新为指定参数设定。
  • A:文件或目录的 atime (access time)不可被修改(modified), 可以有效预防例如手提电脑磁盘I/O错误的发生。
  • S(同步):硬盘I/O同步选项,功能类似sync。
  • a:即append,设定该参数后,只能向文件中添加数据,而不能删除,多用于服务器日志文件安全,只有root才能设定这个属性。
  • c:即compresse,设定文件是否经压缩后再存储。读取时需要经过自动解压操作。
  • d:即no dump,设定文件不能成为dump程序的备份目标。
  • i:设定文件不能被删除、改名、设定链接关系,同时不能写入或新增内容。i参数对于文件 系统的安全设置有很大帮助。
  • j:即journal,设定此参数使得当通过mount参数:data=ordered 或者 data=writeback 挂 载的文件系统,文件在写入时会先被记录(在journal中)。如果filesystem被设定参数为 data=journal,则该参数自动失效。
  • s(secret):保密性地删除文件或目录,即硬盘空间被全部收回。
  • u:与s相反,当设定为u时,数据内容其实还存在磁盘中,可以用于undeletion。

各参数选项中常用到的是a和i。a选项强制只可添加不可删除,多用于日志系统的安全设定。而i是更为严格的安全设定,只有superuser (root) 或具有CAP_LINUX_IMMUTABLE处理能力(标识)的进程能够施加该选项。

以下示例为建立一个空文件给它加上隐藏属性->无法被删除,可以看到即使是root也无法将其删除,需要先将这个隐藏属性去除才能执行。

这些隐藏属性中,最重要的当属+i+a。+i可以让一个文件无法被修改,对系统安全十分重要;+a可以针对logfile这样的日志文件设置可以增加但不能修改旧数据与删除的属性。

  • lsattr(显示文件隐藏属性)

lsattr命令的用法:lsattr [-adlRvV][文件或目录...]

  • -a  显示所有文件和目录,包括以"."为名称开头字符的额外内建,现行目录"."与上层目录".."。
  • -d  显示,目录名称,而非其内容。
  • -l  此参数目前没有任何作用。
  • -R  递归处理,将指定目录下的所有文件及子目录一并处理。
  • -v  显示文件或目录版本。
  • -V  显示版本信息。

3.文件特殊权限:SUID、SGID、SBIT

当我们查看/tmp、bin/passwd目录的权限时可以发现,除了通常的三大权限rwx以外,居然还有别的特殊权限(s、t)存在。

s与t这两个权限的意义与系统的账号及系统的进程管理较为相关。

s在之中称为SUID与SGID。

  • Set UID

当s这个标志出现在文件拥有者的x权限上时,例如刚刚的/bin/passwd文件的权限状态【-rwsr-xr-x】,此时就被称为Set UID,简称为SUID的特殊权限。基本上SUID有这样的限制与功能:

  • SUID权限仅对二进制程序有效;
  • 执行者对于该程序需要具有x的可执行权限;
  • 本权限仅在执行程序的过程中有效(run-time);
  • 执行者将具有该程序拥有者(owner)的权限。

打个比方,系统中所有账号的密码都记录在/etc/shadow这个文件当中,这个文件的权限为【----------1 root root】,表示这个文件仅有root可读且有root可以强制写入而已。但一般用户虽然没有读写权限,却依然可以更改自己的密码。因为这是SUID的功能。由此可知:

  1. neos(一般用户)对于/bin/passwd这个程序来说是拥有x的权限,表示neos可以执行【passwd】;
  2. passwd的拥有者是root这个账号;
  3. neos执行passwd的过程中,会【暂时】获得root的权限;
  4. /etc/shadow就可以被neos所执行的passwd所修改。

注:这个SUID只能运行在二进制的程序上(系统中的一些命令),不能用在shell脚本上(script),因为脚本还是把很多的程序集合到一起来执行,而不是脚本自身在执行。同样,这个SUID也不能放到目录上,放上也是无效的。

  • Set GID

当s标志在文件拥有者的x项为SUID,那s在用户组的x时则称为Set GID(SGID),举例来说,可以用下面的命令来观察到具有SGID权限的文件:

与SUID不同的是,SGID可以针对文件或目录来设置。如果是文件,SGID有如下功能:

  • SGID对二进制程序有用;
  • 程序执行者对于该程序来说,需具备x的权限;
  • 执行者在执行的过程中将会获得该程序用户组的支持。

举例说上面的/bin/locate这个程序可以去查找/var/lib/mlocate/mlocate.db这个文件的内容,mlocate.db的权限如下:

与SUID类似,如果使用用户neos这个账号执行locate时,那neos将会祛痘的slocate用户组的支持,因此就能读取mlocate.db

除了二进制程序外,SGID也能够用在目录中,这也是非常常见的用途。当一个目录设置了SGID的权限后,将具有如下的功能:

  • 用户若对于此目录具有r与x的权限时,该用户能够进入此用户;
  • 用户在此目录下的有效用户组(effective group)将会变成该目录的用户组;
  • 用途:若用户在此目录下具有w的权限(可以新建文件),则该用户建立的新文件,该新文件的用户组与此目录的用户组相同。
  • Sticky Bit

这个Sticky Bit(SBIT)目前只针对目录有效,对于文件已经没有效果了。作用是:

  • 当用户对于此目录具有w、x权限,即具有写入的权限;
  • 当用户在该目录下建立文件或目录时,仅有自己与root才有权利删除该文件。

使只有文件或者目录的所有者才能删除文件或者目录。

可以用如下的范例解释:

本身/tmp具有的权限是【drwxrwxrwt】,这样任何人都可以在/tmp内新增、修改文件,但仅有该文件/目录建立者与root能够删除自己的目录或文件。

  • SUID/SGID/SBIT权限设置

可以用数字或字母方法:

  • 4 为 SUID = u+s

  • 2 为 SGID = g+s

  • 1 为 SBIT = o+t

假设要将一个文件权限改为【-rwsr-xr-x】时,由于s在用户权限中,所以是SUID,因此,在原先的755之前还要加上4,也就是【chmod 4755 filename】。

范例:

  1. 建立一个空文件test
  2. 加入具有SUID的权限
  3. 加入具有SUID/SGID的权限
  4. 加入具有SBIT的功能
  5. 具有空的SUID/SGID权限

最后一个例子出现的大写S和T,代表的是空权限。因为SUID是表示该文件在执行的时候具有文件拥有者的权限,但是文件的拥有者都无法执行了,权限就变成空的了。)

注:必须了解SUID不是用在目录上,SBIT不是用在文件上。

4.观察文件类型:file

如果想要知道某个文件的基本信息,例如是属于ASCII或是数据文件或是二进制文件,且其中有没有使用到动态链接库(share library)等信息,就可以使用file来查看:

6.5 命令与文件的查找

1.脚本文件的查找

在命令行模式中,连续输入两次【tab】按键就能知道用户有多少命令可以执行。这些命令的完整文件名存放的位置可以通过which或者type来查找。

  • which(查找【执行文件】)

语法:which [文件...]

  • -n<文件名长度>  指定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名。

  • -p<文件名长度>  与-n参数相同,但此处的<文件名长度>包括了文件的路径。

  • -w  指定输出时栏位的宽度。

  • -V  显示版本信息。

这里看到居然找不到history命令的路径。其实这个命令是根据【PATH】这个环境变量所规范的路径,去查找执行文件的文件名。因为history是bash内置的命令。但是which默认是找PATH内所设置的目录。所以我们可以使用type这个命令。

2.文件的查找

通常find不很常用(速度慢,影响硬盘性能)。

一般都是先使用whereis或是locate来检查,最后如果没有结果再使用find。

  • whereis:只找系统中某些特定目录下的文件而已(主要是针对/bin /sbin下面的执行文件,以及 /user/share/man 下面的 man page 文件);
  • locate:利用数据库来查找文件名。
  • find:直接查找硬盘。
  • whereis

语法:whereis [-bfmsu][-B <目录>...][-M <目录>...][-S <目录>...][文件...]

  • -b  只查找二进制文件。
  • -B<目录>  只在设置的目录下查找二进制文件。
  • -f  不显示文件名前的路径名称。
  • -m  只查找说明文件。
  • -M<目录>  只在设置的目录下查找说明文件。
  • -s  只查找原始代码文件。
  • -S<目录>  只在设置的目录下查找原始代码文件。
  • -u  查找不包含指定类型的文件。

例1:找出ifconfig这个文件名。

例2:只找出跟passwd有关的【说明文件】文件名(man page)

全部列出:

只有在man里面的文件名才显示:

  • locate/updatedb
语法:locate [-d ][--help][--version][范本样式...]
  • -b, --basename -- 仅匹配路径名的基本名称
  • -c, --count -- 只输出找到的数量
  • -d, --database DBPATH -- 使用 DBPATH 指定的数据库,而不是默认数据库 /var/lib/mlocate/mlocate.db
  • -e, --existing -- 仅打印当前现有文件的条目
  • -1 -- 如果 是 1.则启动安全模式。在安全模式下,使用者不会看到权限无法看到 的档案。这会始速度减慢,因为 locate 必须至实际的档案系统中取得档案的 权限资料。
  • -0, --null -- 在输出上带有NUL的单独条目
  • -S, --statistics -- 不搜索条目,打印有关每个数据库的统计信息
  • -q -- 安静模式,不会显示任何错误讯息。
  • -P, --nofollow, -H -- 检查文件存在时不要遵循尾随的符号链接
  • -l, --limit, -n LIMIT -- 将输出(或计数)限制为LIMIT个条目
  • -n -- 至多显示 n个输出。
  • -m, --mmap -- 被忽略,为了向后兼容
  • -r, --regexp REGEXP -- 使用基本正则表达式
  • --regex -- 使用扩展正则表达式
  • -q, --quiet -- 安静模式,不会显示任何错误讯息
  • -s, --stdio -- 被忽略,为了向后兼容
  • -o -- 指定资料库存的名称。
  • -h, --help -- 显示帮助
  • -i, --ignore-case -- 忽略大小写
  • -V, --version -- 显示版本信息

例1:找出系统中所有与passwd相关的文件名,且只列出5个。

例2:列出locate查询所使用的数据库文件之文件名与各数据的数量。

locate直接在后面输入文件的部分名称后就能得到结果。

但是locate有使用上的限制,因为locate寻找的数据是由已建立的数据库 /var/lib/mlocate/ 里面的数据查找到的。但正因为它是由数据库来查找的,而数据库的建立默认是在每天执行一次(CentOS 7.x是每天更新一次数据库)。

要手动更新数据库直接输入【updatedb】。

  • find

语法:find path -option [ -print ] [ -exec -ok command ] {} \;

1.与时间有关的选项:共有-atime、-ctime、-mtime。

  • -mtime n:n为数字,意义为在n天之前的【一天之内】被修改过内容的文件;
  • -mtime +n
  • -mtime -n
  • -newer file:file为一个存在的文件,列出比file还要新的文件。

例1:将过去系统上面24小时内有修改过内容(mtime)的文件列出:

#0代表目前的时间。所以从现在开始到24小时前有变动过内容的额文件都会被显示。

#如果是三天前那一天的24小时内,就用 find / -mtime 3

例2:寻找 /etc 下面的文件,如果文件日期比 /etc/passwd 新就列出

例1中列出了按时间参数来查找文件的范例。如果要找出4天内被修改过的文件,那可以使用【find /var -mtime -4】,如果是4天前的那一天就使用【find /var -mtime 4】。

  • +4代表大于等于5天前的文件:ex> find /var -mtime +4
  • -4代表小于等于4天内的文件:ex> find /var -mtime -4
  • 4则是代表4-5那一天的文件:ex> find /var -mtime 4

2.与使用者或用户组名称有关的参数:

  • -uid n:n为数字,这个数字是使用者的账号ID,即UID,这个UID是记录在 /etc/passwd 里面与账号名称对应的数字
  • -user name:name为使用者账号名称,例如neos
  • -group name:name为用户组名称,例如users
  • -nouser:查找文件的拥有者不在 /etc/passwd 中
  • -nogroup:查找文件的拥有用户组不存在于 /etc/group 中

例3:查找home下面属于neos的文件

例4:查找系统中不属于任何人的文件

可以找出不正常的文件,或是曾经以源代码自行编译软件时的文件。

3.与文件权限及名称有关的参数:

  • -name filename:查找文件名称为filename的文件
  • -size [+ -] SIZE:查找比SIZE还要大(+)或小(-)的文件,这个SIZE的规格有:c代表Bytes,k代表1024Bytes
  • -type TYPE:查找文件的类型为TYPE的,类型主要有:一般正规文件(f),设备文件(b,c),目录(d),链接文件(l),socket(s),及FIFO(p)等属性。
  • -perm mode:精确匹配mode所表示的条件;
  • -perm /mode:任何一类用户(ugo)的权限中的任何一位(rwx)符合mode所表示的条件即可,9位权限之间存在“或”关系;
  • -perm -mode:任何一类用户(ugo)的权限中的每一位(rwx)都要同时符合mode所表示的条件,9位权限之间存在“与”关系;

例5:查找文件名,关键字可用*处理

例5-1:找出文件名包含了passwd这个关键字的文件

例6:找出/run目录下,文件类型为socket的文件名有哪些?

例7:查找文件当中含有SGID,SUID或SBIT的属性。

find的特殊功能:

  • -exec command:command为其他命令,-exec后面可再接额外的命令来处理查找到的结果。
  • -print:将结果打印到屏幕上,这是默认操作

例8:将例7中找到的文件使用ls -l列出来。

# -exec后面的ls -l就是额外的命令,命令不支持命令别名

#所以仅能使用ls -l不可以使用ll

  • {}代表的是由find找到的内容,如例8所示,find的结果会被放置到{}位置中;
  • -exec一直到 \;是关键词,代表find额外操作的开始(-exec)到结束(\;),在这中间的就是find命令内的额外操作。在本例中就是【ls -l {}】;
  • 因为【;】在bash环境下是有特殊意义的,因此利用反斜杠来转义。

例9:找出系统中大于8MB的文件。

fnd还可以用通配符来查找文件名。

6.6 极重要的复习,权限与命令间的关系

一、让用户能进入某目录成为可工作目录的基本权限是什么?

  • 可使用的命令:例如cd等变换工作目录的命令;
  • 目录所需权限:用户对这个目录至少需要具有x的权限;
  • 额外需求:如果用户想要在目录内利用ls查看文件名,则用户对此目录还需要r的权限;

二、用户在某个目录内读取一个文件的基本权限是什么?

  • 可使用的命令:例如本章谈到的cat,more,less等;
  • 目录所需权限:用户对这个目录至少需要x权限;
  • 文件所需权限:用户对文件至少需要具有r的权限才行。

三、让用户可以修改一个文件的基本权限是什么?

  • 可使用的命令:例如nano或未来要介绍的vi编辑器等;
  • 目录所需权限:用户在该文件所在的目录至少要有x权限;
  • 文件所需权限:用户对该文件至少要有r、w权限。

四、让一个用户可以建立一个文件的基本权限是什么?

  • 目录所需权限:用户在该目录要具有w、x的权限,重点在w;

五、让用户进入某目录并执行该目录下的某个命令之基本权限是什么?

  • 目录所需权限:用户在该目录至少要有x的权限;
  • 文件所需权限:用户在该文件至少需要有x的权限。

Linux从零学习记录(四)相关推荐

  1. Linux从零学习记录(三)

    目录 第五章:Linux的文件权限与目录配置 5.1 用户与用户组 5.2 Linux文件权限概念 1.Linux文件属性 2.如何修改文件属性与权限 3.目录与文件的权限意义 4.Linux文件种类 ...

  2. 基于全志A33开发板linux系统移植学习记录(Boot0)

    基于全志A33开发板linux系统移植学习记录 第一章 Boot0基于ARMGCC的编译与修改 文章目录 基于全志A33开发板linux系统移植学习记录 前言 一.全志A33简介以及上电引导流程 二. ...

  3. leveldb 学习记录(四)Log文件

    前文记录 leveldb 学习记录(一) skiplist leveldb 学习记录(二) Slice leveldb 学习记录(三) MemTable 与 Immutable Memtable le ...

  4. MySQL学习记录 (四) ----- SQL数据管理语句(DML)

    相关文章: <MySQL学习记录 (一) ----- 有关数据库的基本概念和MySQL常用命令> <MySQL学习记录 (二) ----- SQL数据查询语句(DQL)> &l ...

  5. linux文件权限记录,linux文件权限学习记录

    linux文件权限学习记录 1.Linux 的安全性 1.1/etc/passwd 文件 存放用户的登录名以及相关信息#cat  / etc / passwd root: x: 0 : 0 : roo ...

  6. Kafka学习记录(四)——消费者

    Kafka学习记录(四)--消费者 目录 Kafka学习记录(四)--消费者 对应课程 Kafka消费者工作流程 消费方式和流程 消费者组原理 消费者组初始化流程 消费者组详细消费流程 重要参数 ka ...

  7. Linux的基本学习(四)——磁盘与文件系统管理

    前言: 承接Linux的基本学习(三)我们接着往下走 认识Linux文件系统: 整块磁盘的组成主要有: 圆形的碟片(主要记录数据) 机械手臂,与在机械手臂上的磁头(擦写碟片上的数据) 主轴马达,可以转 ...

  8. linux账户密码 群组放在,linux基础命令学习(四)用户与群组

    一.linux用户账号的管理 linux用户账号的管理主要包括用户添加.用户删除.用户修改. 添加用户账号就是在系统创建一个新账号,然后为新账号分为用户号.用户组.主目录和登录Shell等资源. 刚添 ...

  9. Linux 学习记录 四(Bash 和 Shell scirpt).

    一.什么是 Shell? 狭义的shell指的是指令列方面的软件,包括基本的Linux操作窗口Bash等,广义的shell则包括 图形接口的软件,因为图形接口其实也可以操作各种驱动程序来呼叫核心进行工 ...

最新文章

  1. 智能驾驶L2发展策略
  2. 求一个简单的java线程代码,Java线程代码的实现方法
  3. 今天,我们来详细的聊一聊SpringBoot自动配置原理,学了这么久,你学废了吗?
  4. MySQL学习笔记06【多表查询、子查询、多表查询练习】
  5. PHP页面编码声明与用header或meta实现PHP页面编码的区别
  6. linux怎么用jconsole_jconsole监控上Linux上的JVM
  7. 17. 框架标签及其应用实例
  8. 数字逻辑基础与verilog设计_数字电路学习笔记(五):逻辑设计基础
  9. C# Obsolete
  10. autoreconnect mysql true_连接数据库超时设置autoReconnect=true
  11. 西安交大计算机网络 笔记,计算机网络笔记整理
  12. python能做底层开发吗_python底层是什么语言
  13. [原创]桓泽学音频编解码(14):AC3 时频转换模块算法分析
  14. 【java】照片查看器:开发一个简易照片查看器,自行设计功能和界面。
  15. 3389、1433、3306抓鸡原理和工具教程(原理篇)
  16. 游戏十五大基本游戏类型介绍
  17. 读取任意编码的文件(转)
  18. 巧用Python爬取QQ空间好友信息,生成词云
  19. 来自尼古拉斯的编码风格
  20. 苹果拼图软件测试,趣图制作测试——拼图+水印+表情

热门文章

  1. html将字符串按逗号分隔,js如何截取以逗号隔开的字符串
  2. STEP7主站与远程I/O组网_过路老熊_新浪博客
  3. outlook邮箱邮件大小限制_Office Outlook 2010、2013附件大小超过了允许的范围限制三种解决方法图解...
  4. 反欺诈之路——黑卡、养卡的识别
  5. 我们需要有创业精神,但不是每个人都要去创业
  6. win7防火墙规则设置
  7. 畜牧兽医职称需要考英语和计算机,畜牧兽医专业技术职称考试试题
  8. 周期训练理论与方法pdf_周期_PDF图书下载_(美) 图德·邦帕 (Tudor O.Bompa) (美)_免费PDF电子书下载_第一图书网...
  9. python爬取歌曲教程_歌曲网站,教你爬取 mp3 和 lyric
  10. [rosrun] Couldn‘t find executable named xxx