鸟哥的linux私房菜_文件与目录管理

28 篇文章 0 订阅

7.linux文件与目录管理


7.1目录与路径


7.1.1相对路径与绝对路径


7.1.2目录的相关操作


特殊目录:
. : 此层目录
.. : 上一层目录
- : 前一个工作目录
~:目前用户身份所在的主文件夹。
~account:account 用户的主文件(account是账户名称)


几个常见的处理目录命令


cd:切换目录 change directory 


是什么


change directory,  变换目录


语法


  [root@study ~]#  cd [相对路径或绝对路径]
# 最重要的就是目录的绝对路径与相对路径,还有一些特殊目录的符号啰!


范例


[root@study ~]#  cd ~dmtsai
# 代表去到 dmtsai 这个用户的家目录,亦即 /home/dmtsai
[root@study dmtsai]#  cd ~
# 表示回到自己的家目录,亦即是 /root 这个目录
[root@study ~]#  cd
# 没有加上任何路径,也还是代表回到自己家目录的意思喔!
[root@study ~]#  cd ..
# 表示去到目前的上层目录,亦即是 /root 的上层目录的意思;
[root@study /]#  cd -
# 表示回到刚刚的那个目录,也就是 /root 啰~


pwd:


是什么


显示当前目录(print working directory)


语法


[root@study ~]#  pwd [-P]
选项与参数:
-P :显示出确实的路径,而非使用链接 (link) 路径。


范例


范例:单纯显示出目前的工作目录:
[root@study ~]#  pwd
/root <== 显示出目录啦~
范例:显示出实际的工作目录,而非链接文件本身的目录名而已
[root@study ~]#  cd /var/mail <==注意,/var/mail 是一个连结档
[root@study mail]#  pwd
/var/mail <==列出目前的工作目录
[root@study mail]#  pwd -P
/var/spool/mail <==怎么回事?有没有加 -P 差很多~
[root@study mail]#  ls -ld /var/mail
lrwxrwxrwx. 1 root root 10 May 4 17:51 /var/mail -> spool/mail
# 看到这里应该知道为啥了吧?因为 /var/mail 是连结档,连结到 /var/spool/mail
# 所以,加上 pwd -P 的选项后,会不以连结文件的数据显示,而是显示正确的完整路径啊!


mkdir: 


是什么


新建一个新的目录


语法


[root@study ~]#  mkdir [-mp]  目录名称
选项与参数:
-m :配置文件案的权限喔!直接设定,不需要看预设权限 (umask) 的脸色~
-p :帮助你直接将所需要的目录(包含上层目录)递归建立起来!


范例


范例:请到/tmp 底下尝试建立数个新目录看看:
[root@study ~]#  cd /tmp
[root@study tmp]#  mkdir test <==建立一名为 test 的新目录
[root@study tmp]#  mkdir test1/test2/test3/test4
mkdir: cannot create directory ‘test1/test2/test3/test4’: No such file or directory
# 话说,系统告诉我们,没可能建立这个目录啊!就是没有目录才要建立的!见鬼嘛?
[root@study tmp]#  mkdir -p  test1/test2/test3/test4
# 原来是要建 test4 上层没先建 test3 之故!加了这个 -p 的选项,可以自行帮你建立多层目录!


范例:建立权限为 rwx--x--x 的目录
[root@study tmp]#  mkdir -m 711 test2
[root@study tmp]#  ls -ld test*
drwxr-xr-x. 2 root root 6 Jun 4 19:03 test
drwxr-xr-x. 3 root root 18 Jun 4 19:04 test1
drwx--x--x. 2 root root 6 Jun 4 19:05 test2
# 仔细看上面的权限部分,如果没有加上 -m 来强制设定属性,系统会使用默认属性。
# 那么你的默认属性为何?这要透过底下介绍的 umask 才能了解喔! ^_^


rmdir:


是什么


( 删除『空』的目录)


语法


[root@study ~]#  rmdir [-p]  目录名称
选项与参数:
-p :连同『上层』『空的』目录也一起删除


范例


范例:将于 mkdir 范例中建立的目录(/tmp 底下)删除掉!
[root@study tmp]#  ls -ld test* <==看看有多少目录存在?
drwxr-xr-x. 2 root root 6 Jun 4 19:03 test
drwxr-xr-x. 3 root root 18 Jun 4 19:04 test1
drwx--x--x. 2 root root 6 Jun 4 19:05 test2
[root@study tmp]#  rmdir test <==可直接删除掉,没问题
[root@study tmp]#  rmdir test1 <==因为尚有内容,所以无法删除!
rmdir: failed to remove ‘test1’: Directory not empty
[root@study tmp]#  rmdir -p test1/test2/test3/test4
[root@study tmp]#  ls -ld test* <==您看看,底下的输出中 test 与 test1 不见了!
drwx--x--x. 2 root root 6 Jun 4 19:05 test2
# 瞧!利用 -p 这个选项,立刻就可以将 test1/test2/test3/test4 一次删除~
# 不过要注意的是,这个 rmdir 仅能『删除空的目录』喔!


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


是什么


环境变量PATH ,当我们在执行一个指令的时候,举例来说『ls』好了,系统会依照 PATH 的设定去每个 PATH 定义的目录下搜寻文件名为 ls 的可执行文件, 如果在PATH 定义的目录中含有多个文件名为 ls 的可执行文件,那么先搜寻到的同名指令先被执行!


范例


范例:先用 root 的身份列出搜寻的路径为何?
[root@study ~]#  echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
范例:用 dmtsai 的身份列出搜寻的路径为何?
[root@study ~]#  exit # 由之前的 su - 离开,变回原本的账号!或再取得一个终端机皆可!
[dmtsai@study ~]$  echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin
# 记不记得我们前一章说过,目前 /bin 是连结到 /usr/bin 当中的喔!


如果想要让 root 在任何目录均可执行/root 底下的 ls,那么就将/root 加入 PATH 当中即可。 加入的方法很简单,就像底下这样:
[root@study ~]#  PATH="${PATH}:/root"


tips


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


7.2文件与目录管理


7.2.1 查看文件与目录:ls


语法


[root@study ~]#  ls [-aAdfFhilnrRSt]  文件名或目 录 名 称 ..
[root@study ~]#  ls [ --color={never,auto,always}]  文件名或目录名称 ..
[root@study ~]#  ls [ --full-time]  文件名或目 录 名 称 ..
选项与参数:
-a :全部的文件,连同隐藏档( 开头为 . 的文件) 一起列出来(常用)
-A :全部的文件,连同隐藏档,但不包括 . 与 .. 这两个目录
-d :仅列出目录本身,而不是列出目录内的文件数据(常用)
-f :直接列出结果,而不进行排序 (ls 预设会以档名排序!)
-F :根据文件、目录等信息,给予附加数据结构,例如:
*:代表可执行文件; /:代表目录; =:代表 socket 文件; |:代表 FIFO 文件;
-h :将文件容量以人类较易读的方式(例如 GB, KB 等等)列出来;
-i :列出 inode 号码,inode 的意义下一章将会介绍;
-l :长数据串行出,包含文件的属性与权限等等数据;(常用)
-n :列出 UID 与 GID 而非使用者与群组的名称 (UID 与 GID 会在账号管理提到!)
-r :将排序结果反向输出,例如:原本档名由小到大,反向则为由大到小;
-R :连同子目录内容一起列出来,等于该目录下的所有文件都会显示出来;
-S :以文件容量大小排序,而不是用档名排序;
-t :依时间排序,而不是用档名。
--color=never :不要依据文件特性给予颜色显示;
--color=always :显示颜色
--color=auto :让系统自行依据设定来判断是否给予颜色
--full-time :以完整时间模式 (包含年、月、日、时、分) 输出
--time={atime,ctime} :输出 access 时间或改变权限属性时间 (ctime)
而非内容变更时间 (modification time)


7.2.1复制、 删除与移动 cp rm mv


cp :复制 copy


语法


[root@study ~]#  cp [-adfilprsu]  来源文件 (source)  目标文件 (destination)
[root@study ~]#  cp [options] source1 source2 source3 .... directory
选项与参数:
-a :相当于 -dr --preserve=all 的意思,至于 dr 请参考下列说明;(常用)
-d :若来源文件为链接文件的属性(link file),则复制链接文件属性而非文件本身;
-f :为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次;
-i :若目标文件(destination)已经存在时,在覆盖时会先询问动作的进行(常用)
-l :进行硬式连结(hard link)的连结档建立,而非复制文件本身;
-p :连同文件的属性(权限、用户、时间)一起复制过去,而非使用默认属性(备份常用);
-r :递归持续复制,用于目录的复制行为;(常用)
-s :复制成为符号链接文件 (symbolic link),亦即『快捷方式』文件;
-u :destination 比 source 旧才更新 destination,或 destination 不存在的情况下才复制。
--preserve=all :除了 -p 的权限相关参数外,还加入 SELinux 的属性, links, xattr 等也复制了。
最后需要注意的,如果来源档有两个以上,则最后一个目的文件一定要是『目录』才行!


tips


由于 cp 有种种的文件属性与权限的特性,所以,在复制时,你必须要清楚的了解到:
1 是否需要完整的保留来源文件的信息?
2 来源文件是否为连结档 (symbolic link file)?
3 来源档是否为特殊的文件,例如 FIFO, socket 等?
4 来源文件是否为目录


rm 移除文件或者目录


语法


[root@study ~]#  rm [-fir]  文件或目录
选项与参数:
-f :就是 force 的意思,忽略不存在的文件,不会出现警告讯息;
-i :互动模式,在删除前会询问使用者是否动作
-r :递归删除啊!最常用在目录的删除了!这是非常危险的选项!!!


mv 移动目录或者文件或者更名


语法


[root@study ~]#  mv [-fiu] source destination
[root@study ~]#  mv [options] source1  source2 source3 .... directory
选项与参数:
-f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;
-i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!
-u :若目标文件已经存在,且 source 比较新,才会更新 (update)


7.2.3取得路径的文件名与路径名;


是什么


而每个档名的长度都可以到达 255 个字符耶! 那么你怎么知道那个是档名?那个是目录名?


basename


范例


[root@study ~]#  basename /etc/sysconfig/network
network <== 很简单!就取得最后的档名~


dirname


范例


[root@study ~]#  dirname /etc/sysconfig/network
/etc/sysconfig <== 取得的变成目录名了!


7.3文件内容查询


常用命令:
cat:由第一行开始显示文件 。 
tac:从最后一行开始显示; 
nl:显示的时候顺便输出行号;
more:一页一页的显示文件; 
less:与more类似,但是比more更好的是可以往前显示; head: 只显示投几行 ; 
tail:只看结尾几行 
od:以二级制的方式读取文件;


7,3.1直接查看文件内容 


cat (concatenate)


语法


[root@study ~]#  cat [-AbEnTv]
选项与参数:
-A :相当于 -vET 的整合选项,可列出一些特殊字符而不是空白而已;
-b :列出行号,仅针对非空白行做行号显示,空白行不标行号!
-E :将结尾的断行字符 $ 显示出来;
-n :打印出行号,连同空白行也会有行号,与 -b 的选项不同;
-T :将 [tab] 按键以 ^I 显示出来;
-v :列出一些看不出来的特殊字符


tac:反向列示


和cat相反,由最后一行向第一行方向展示出来;


nl :添加行号打印


语法


[root@study ~]#  nl [-bnw]  文件
选项与参数:
-b :指定行号指定的方式,主要有两种:
-b a :表示不论是否为空行,也同样列出行号(类似 cat -n);
-b t :如果有空行,空的那一行不要列出行号(默认值);
-n :列出行号表示的方法,主要有三种:
-n ln :行号在屏幕的最左方显示;
-n rn :行号在自己字段的最右方显示,且不加 0 ;
-n rz :行号在自己字段的最右方显示,且加 0 ;
-w :行号字段的占用的字符数。


tips


nl 可以将输出的文件内容自动的加上行号!其预设的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等等的功能呢。


7.3.2可翻页查看


more (一页一页翻动)


范例


[root@study ~]#  more /etc/man_db.conf
#
#
# This file is used by the man-db package to configure the man and cat paths.
# It is also used to provide a manpath for those without one by examining
# their PATH environment variable. For details see the manpath(5) man page.
#
.....(中间省略).....
--More--(28%) <== 重点在这一行喔!你的光标也会在这里等待你的指令


可以输入的指令有:


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


less 比More更有弹性


范例


[root@study ~]#  less /etc/man_db.conf
#
#
# This file is used by the man-db package to configure the man and cat paths.
# It is also used to provide a manpath for those without one by examining
# their PATH environment variable. For details see the manpath(5) man page.
#
.....(中间省略).....
: <== 这里可以等待你输入指令!


可以输入的指令有:


  空格键 :向下翻动一页;
  [pagedown]:向下翻动一页;
  [pageup] :向上翻动一页;
  /字符串 :向下搜寻『字符串』的功能;
  ?字符串 :向上搜寻『字符串』的功能;
  n :重复前一个搜寻 (与 / 或 ? 有关!)
  N :反向的重复前一个搜寻 (与 / 或 ? 有关!)
  g :前进到这个资料的第一行去;
  G :前进到这个数据的最后一行去 (注意大小写);
  q :离开 less 这个程序;


tips


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


7.3.3数据选取


head (取出前面几行)


语法


[root@study ~]#  head [-n number]  文件
选项与参数:
-n :后面接数字,代表显示几行的意思


范例


[root@study ~]#  head /etc/man_db.conf
# 默认的情况中,显示前面十行!若要显示前 20 行,就得要这样:


范例:如果后面 100 行的数据都不打印,只打印/etc/man_db.conf 的前面几行,该如何是好?
[root@study ~]#  head -n -100 /etc/man_db.conf


tips


-n 选项后面的参数较有趣,如果接的是负数,例如上面范例的-n -100 时,代表列前的所有行数, 但不包括后面 100 行。


tail (取出后面几行)


语法


[root@study ~]#  tail [-n number]  文件
选项与参数:
-n :后面接数字,代表显示几行的意思
-f :表示持续侦测后面所接的档名,要等到按下[ctrl]-c 才会结束 tail 的侦测


7.3.4非纯文本文件


od


语法


[root@study ~]#  od [-t TYPE]  文件
选项或参数:
-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 ;


7.3.5修改文件时间或者创建文件


文件的主要三个时间属性


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


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


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


touch [-acdmt] 文件


语法


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


tips


 touch 这个指令最常被使用的情况是:
1 建立一个空的文件;
2 将某个文件日期修订为目前 (mtime 与 atime)


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


7.4.1文件的默认权限umask:


是什么


umask 就是指定 『目前用户在建立文件或目录时候的权限默认值』


查看默认值


[root@study ~]#  umask
0022 <==与一般权限有关的是后面三个数字!
[root@study ~]#  umask -S
u=rwx,g=rx,o=rx
-S (Symbolic) 这个选项,就会以符号类型的方式来显示出权限了


设置默认值


设置默认权限:后直接跟权限数字即可
>umask 002;


7.4.2 文件隐藏属性 chattr 、lsattr


chattr


语法


[root@study ~]#  chattr [+-=][ASacdistu]  文件 或目 录 名 称
选项与参数:
+ :增加某一个特殊参数,其他原本存在参数则不动。
- :移除某一个特殊参数,其他原本存在参数则不动。
= :设定一定,且仅有后面接的参数
A :当设定了 A 这个属性时,若你有存取此文件(或目录)时,他的访问时间 atime 将不会被修改,可避免 I/O 较慢的机器过度的存取磁盘。(目前建议使用文件系统挂载参数处理这个项目)
S :一般文件是异步写入磁盘的(原理请参考前一章 sync 的说明),如果加上 S 这个属性时,当你进行任何文件的修改,该更动会『同步』写入磁盘中。
a :当设定 a 之后,这个文件将只能增加数据,而不能删除也不能修改数据,只有 root 才能设定这属性
c :这个属性设定之后,将会自动的将此文件『压缩』,在读取的时候将会自动解压缩,但是在储存的时候,将会先进行压缩后再储存(看来对于大文件似乎蛮有用的!)
d :当 dump 程序被执行的时候,设定 d 属性将可使该文件(或目录)不会被 dump 备份
i :这个 i 可就很厉害了!他可以让一个文件『不能被删除、改名、设定连结也无法写入或新增数据!』对于系统安全性有相当大的帮助!只有 root 能设定此属性
s :当文件设定了 s 属性时,如果这个文件被删除,他将会被完全的移除出这个硬盘空间,所以如果误删了,完全无法救回来了喔!
u :与 s 相反的,当使用 u 来配置文件案时,如果该文件被删除了,则数据内容其实还存在磁盘中,
可以使用来救援该文件喔!
注意 1:属性设定常见的是 a 与 i 的设定值,而且很多设定值必须要身为 root 才能设定
注意 2:xfs 文件系统仅支援 AadiS 而已


范例


例:请尝试到/tmp 底下建立文件,并加入 i 的参数,尝试删除看看。
[root@study ~]#  cd /tmp
[root@study tmp]#  touch attrtest <==建立一个空文件
[root@study tmp]#  chattr +i attrtest <==给予 i 的属性
[root@study tmp]#  rm attrtest <==尝试删除看看
rm: remove regular empty file `attrtest'? y y
rm: cannot remove `attrtest': Operation not permitted
# 看到了吗?呼呼!连 root 也没有办法将这个文件删除呢!赶紧解除设定!


tips


注意 1:属性设定常见的是 a 与 i 的设定值,而且很多设定值必须要身为 root 才能设定
注意 2:xfs 文件系统仅支援 AadiS 而已


lsattr


语法


[root@study ~]#  lsattr [-adR]  文件 或目 录
选项与参数:
-a :将隐藏文件的属性也秀出来;
-d :如果接的是目录,仅列出目录本身的属性而非目录内的文件名;
-R :连同子目录的数据也一并列出来!


范例


[root@study tmp]#  chattr +aiS attrtest
[root@study tmp]#  lsattr attrtest
--S-ia---------- attrtest


tips


 这两个指令在使用上必须要特别小心,否则会造成很大的困扰。例如:某天你心情好,突然将 /etc/shadow 这个重要的密码记录文件给他设定成为具有 i 的属性,那么过了若干天之后, 你突然要新增使用者,却一直无法新增!


7.4.3文件特殊权限SUID、SGID、SBIT


7.4.4查看文件类型 file


是什么


如果你想要知道文件的基本数据,例如是属于ASCII或者是data文件,或者是binary 且有没有用到动态库等等信息, 可以使用file查看


范例


[root@study ~]#  file ~/.bashrc
/root/.bashrc: ASCII text <==告诉我们是 ASCII 的纯文本档啊!
[root@study ~]#  file /usr/bin/passwd
/usr/bin/passwd: setuid ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically
linked (uses shared libs), for GNU/Linux 2.6.32,
BuildID[sha1]=0xbf35571e607e317bf107b9bcf65199988d0ed5ab, stripped
# 执行文件的数据可就多的不得了!包括这个文件的 suid 权限、兼容于 Intel x86-64 等级的硬件平台
# 使用的是 Linux 核心 2.6.32 的动态函式库链接等等。


7.5命令与文件的查询


7.5.1脚本文件名的查询


which(寻找执行文件)


语法


[root@study ~]#  which [-a] command
选项或参数:
-a :将所有由 PATH 目录中可以找到的指令均列出,而不止第一个被找到的指令名称


范例


范例一:搜寻 ifconfig 这个指令的完整文件名
[root@study ~]#  which ifconfig
/sbin/ifconfig


范例二:用 which 去找出 which 的档名为何?
[root@study ~]#  which which
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
/bin/alias
/usr/bin/which
# 竟然会有两个 which ,其中一个是 alias 这玩意儿呢!那是啥?
# 那就是所谓的『命令别名』,意思是输入 which 会等于后面接的那串指令啦!
# 更多的数据我们会在 bash 章节中再来谈的!


tips


这个指令是根据『PATH』这个环境变量所规范的路径,去搜寻『执行档』的档名~ 所以,重点是找出『执行档』而已!且 which 后面接的是『完整档名』喔!若加上 -a 选项,则可以列出所有的可以找到的同名执行文件,而非仅显示第一个而已!


7.5.2文件名查找


whereis


语法


[root@study ~]#  whereis [-bmsu]  文件 或目 录 名
选项与参数:
-l :可以列出 whereis 会去查询的几个主要目录而已
-b :只找 binary 格式的文件
-m :只找在说明文件 manual 路径下的文件
-s :只找 source 来源文件
-u :搜寻不在上述三个项目当中的其他特殊文件


范例


范例一:请找出 ifconfig 这个档名
[root@study ~]#  whereis ifconfig
ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.g


范例二:只找出跟 passwd 有关的『说明文件』档名(man page)
[root@study ~]#  whereis passwd # 全部的档名通通列出来!
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz
/usr/share/man/man5/passwd.5.gz


[root@study ~]#  whereis - - m passwd # 只有在 man 里面的档名才抓出来!
passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz


tips


find 是很强大的搜寻指令,但时间花用的很大!(因为 find是直接搜寻硬盘,为如果你的硬盘比较老旧的话,嘿嘿!有的等!) 这个时候 whereis 就相当的好用了!另外, whereis 可以加入选项来找寻相关的数据,例如,如果你是要找可执行文件 (binary) 那
么加上 -b 就可以啦! 如果不加任何选项的话,那么就将所有的数据列出来!
那么为何搜寻的速度会比 find 快这么多? 只是因为 whereis 只找几个特定的目录而已~并没有全系统去查询之故。所以说,whereis 主要是针对 /bin /sbin 底下的执行档, 以及 /usr/share/man 底下的 man page 文件,跟几个比较特定的目录来处理而已。所以速度当然快的多!不过,就有某些文件是你找不到的啦! 想要知道 whereis 到底查了多少目录?可以使用 whereis -l 来确认一下即可!


locate / updatedb


语法


[root@study ~]#  locate [-ir] keyword
选项与参数:
-i :忽略大小写的差异;
-c :不输出档名,仅计算找到的文件数量
-l :仅输出几行的意思,例如输出五行则是 -l 5
-S :输出 locate 所使用的数据库文件的相关信息,包括该数据库纪录的文件/目录数量等
-r :后面可接正规表示法的显示方式


范例


范例一:找出系统中所有与 passwd 相关的档名,且只列出 5 个
[root@study ~]#  locate -l 5 passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
/usr/bin/gpasswd


范例二:列出 locate 查询所使用的数据库文件之文件名与各数据数量
[root@study ~]#  locate -S
Database /var/lib/mlocate/mlocate.db:
8,086 directories # 总纪录目录数
109,605 files # 总纪录文件数
5,190,295 bytes in file names
2,349,150 bytes used to store database


tips


这个东西还是有使用上的限制呦!为什么呢?你会发现使用 locate 来寻找数据的时候特别的快, 这是因为 locate 寻找的数据是由『已建立的数据库 /var/lib/mlocate/』 里面的数据所搜寻到的,所以不用直接在去硬盘当中存取数据,当然是很快速啰!


那么有什么限制呢?就是因为他是经由数据库来搜寻的,而数据库的建立默认是在每天执行一次 (每个 distribution 都不同,CentOS 7.x 是每天更新数据库一次!),所以当你新建立起来的文件, 却还在数据库更新之前搜寻该文件,那么 locate 会告诉你『找不到!』呵呵!因为必须要更新数据库呀!那能否手动更新数据库哪?当然可以啊!更新 locate 数据库的方法非常简单,直接输入『 updatedb 』就可以了! updatedb 指令会去读取 /etc/updatedb.conf 这个配置文件的设定,然后再去硬盘里面进行搜寻文件名的动作, 最后就更新整个数据库文件啰!因为 updatedb 会去搜寻硬盘,所以当你执行updatedb 时,可能会等待数分钟的时间喔!


find


语法


[root@study ~]#  find [PATH] [option] [action]


1. 与时间有关的选项:共有 -atime, -ctime 与 -mtime ,以 -mtime 说明
-mtime n :n 为数字,意义为在 n 天之前的『一天之内』被更动过内容的文件;
-mtime +n :列出在 n 天之前(不含 n 天本身)被更动过内容的文件档名;
-mtime -n :列出在 n 天之内(含 n 天本身)被更动过内容的文件档名。
-newer file :file 为一个存在的文件,列出比 file 还要新的文件档名




选项与参数:
2. 与使用者或组名有关的参数:
-uid n :n 为数字,这个数字是用户的账号 ID,亦即 UID ,这个 UID 是记录在
/etc/passwd 里面与账号名称对应的数字。这方面我们会在第四篇介绍。
-gid n :n 为数字,这个数字是组名的 ID,亦即 GID,这个 GID 记录在
/etc/group,相关的介绍我们会第四篇说明~
-user name :name 为使用者账号名称喔!例如 dmtsai
-group name:name 为组名喔,例如 users ;
-nouser :寻找文件的拥有者不存在 /etc/passwd 的人!
-nogroup :寻找文件的拥有群组不存在于 /etc/group 的文件!
当你自行安装软件时,很可能该软件的属性当中并没有文件拥有者,
这是可能的!在这个时候,就可以使用 -nouser 与 -nogroup 搜寻。


选项与参数:
3. 与文件权限及名称有关的参数:
-name filename:搜寻文件名为 filename 的文件;
-size [+-]SIZE:搜寻比 SIZE 还要大(+)或小(-)的文件。这个 SIZE 的规格有:
c: 代表 byte, k: 代表 1024bytes。所以,要找比 50KB 还要大的文件,就是『 -size +50k 』
-type TYPE :搜寻文件的类型为 TYPE 的,类型主要有:一般正规文件 (f), 装置文件 (b, c), 目录 (d), 连结档 (l), socket (s), 及 FIFO (p) 等属性。
-perm mode :搜寻文件权限『刚好等于』 mode 的文件,这个 mode 为类似 chmod的属性值时,举例来说, -rwsr-xr-x 的属性为 4755 !
-perm -mode :搜寻文件权限『必须要全部囊括 mode 的权限』的文件,举例来说,


find 的特殊功能就是能够进行额外的动作(action)。
[root@study ~]#  find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} \;
# 注意到,那个 -exec 后面的 ls -l 就是额外的指令,指令不支持命令别名,


1 {} :代表的是『由 find 找到的内容』,如上所示,find 的结果会被放置到 {} 位置中;
2 -exec :一直到 \; 是关键词,代表 find 额外动作的开始 (-exec) 到结束 (\;) ,在这中间的就是 find 指令内的额外动作。 在本例中就是『 ls -l {} 』啰!
3 因为『 ; 』在 bash 环境下是有特殊意义的,因此利用反斜杠来跳脱。


范例


范例一:将过去系统上面 24 小时内有更动过内容 (mtime) 的文件列出
[root@study ~]#  find / -mtime 0
# 那个 0 是重点!0 代表目前的时间,所以,从现在开始到 24 小时前,
# 有变动过内容的文件都会被列出来!那如果是三天前的 24 小时内?
# find / -mtime 3 有变动过的文件都被列出的意思!


范例三:搜寻 /home 底下属于 dmtsai 的文件
[root@study ~]#  find /home -user dmtsai
# 这个东西也很有用的~当我们要找出任何一个用户在系统当中的所有文件时,
# 就可以利用这个指令将属于某个使用者的所有文件都找出来喔!
范例四:搜寻系统中不属于任何人的文件
[root@study ~]#  find / -nouser
# 透过这个指令,可以轻易的就找出那些不太正常的文件。如果有找到不属于系统任何人的文件时,
# 不要太紧张,那有时候是正常的~尤其是你曾经以原始码自行编译软件时。


范例八:将上个范例找到的文件使用 ls -l 列出来~
[root@study ~]#  find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} \; 
# 注意到,那个 -exec 后面的 ls -l 就是额外的指令,指令不支持命令别名,
# 所以仅能使用 ls -l 不可以使用 ll 喔!注意注意


权限与命令间的关系(极重要)


用户进入某个目录成为可工作目录的基本权限
1 可以使用的命令 :cd
2.目录所需的权限:至少需要有x权限
3.额外需求,如果想要ls命令查阅文件名,则至少还要有r权限


用户在某个目录读取一个文件的基本权限:
1.可以使用的命令:cat more less等
2.目录所需权限:用户对这个目录至少要有x权限
3.文件所需权限:用户对这个文件至少有r权限


用户修改一个文件的基本权限:
1:可以使用的命令,vim nano等
2. 目录所需权限:至少要有x
3. 文件所需权限:至少需要 r 和w


用户创建一个文件所需基本权限:
目录所需权限:具有w和x。重点在w

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值