【第六章】Linux文件与目录管理

目录与路径

目录的相关操作

一、比较特殊的目录:

.         代表此层目录
..        代表上一层目录
-         代表前一个工作目录
~         代表“目前使用者身份”所在的主文件夹
~account  代表account这个使用者的主文件夹(account是个帐号名称)

二、在Linux下面,根目录下有没有上层目录(..)存在?
答:使用ls -al /查询发现,根目录下确实存在...两个目录,且这两个目录的属性与权限完全一致,这代表根目录的上一层(..)与根目录自己(.)是同一个目录。
三、常见的处理目录的指令

cd:变换目录
pwd:显示目前的目录
mkdir:创建一个新的目录
rmdir:删除一个空的目录
  1. 假如dmtsai这个使用者的主文件夹是/home/dmtsai/,而root主文件夹则是/root/,假设我以root身份在Linux系统中:
[dmtsai@study ~]$ su -# 先切换身份成为 root 看看!
[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
[root@study ~]cd /var/spool/mail# 绝对路径的写法!直接指定要去的完整路径名称!
[root@study mail]cd ../postfix# 相对路径的写法,由/var/spool/mail去到/var/spool/postfix
  1. pwd(显示目前所在的目录)
[root@study ~]pwd [-P]
# -P:显示出实际路径,而非使用链接(link)路径。

# 范例:显示出实际的工作目录,而非链接文件本身的目录名而已
[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不以链接文件的数据显示,而是显示正确的完整路径啊!
  1. 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来强制设置属性,系统会使用默认属性。
  1. 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一次删除~

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

一、查阅文件属性的指令ls完整文件名为:/bin/ls(这是绝对路径),那你会不会觉得很奇怪:“为什么我可以在任何地方执行/bin/ls这个指令呢? ”“为什么我在任何目录下输入ls就一定可以显示出一些讯息而不会说找不到该/bin/ls指令呢?“这是因为环境变量PATH的帮助所致呀!
二、当我们执行一个指令时,举例来说ls好了,系统会依照PATH的设置去每个PATH定义的目录下搜寻文件名为ls的可执行文件,如果在PATH定义的目录中含有多个文件名为ls的可执行文件,那么先搜寻到的同名指令先被执行!
三、通过echo $PATH可查看到底有哪些目录被定义出来了,echo有“显示、印出”的意思,而PATH前面加的$表示后面接的是变量,所以会显示出目前的PATH!

# 范例:先用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当中的喔!

PATH(一定是大写)这个变量的内容是由一堆目录所组成的,每个目录中间用冒号(:)来隔开, 每个目录是有“顺序”之分的。仔细看一下上面的输出,你可以发现到无论是root还是dmtsai都有/bin/usr/bin这个目录在PATH变量内,所以当然就能够在任何地方执行ls来找到/bin/ls可执行文件啰!因为/bin在CentOS 7当中,就是链接到/usr/bin去的!所以这两个目录内容会一模一样!
四、假设你是root,如果你将ls/bin/ls移动成为/root/ls(可用mv /bin/ls /root指令达成),然后你自己本身也在/root目录下,请问(1)你能不能直接输入ls来执行?(2)若不能,你该如何执行ls这个指令?(3)若要直接输入ls即可执行,又该如何进行?
答:案例:

  1. 不论你在哪个目录下面输入任何与ls相关的指令,都没有办法顺利的执行ls了!也就是说,你不能直接输入ls来执行,因为/root这个目录并不在PATH指定的目录中, 所以,即使你在/root目录下,也不能够搜寻到ls这个指令!因为这个ls确实存在于/root下面,并不是被删除了! 所以我们可以通过使用绝对路径或者是相对路径直接指定这个可执行文件文件名, 下面的两个方法都能够执行ls这个指令:
[root@study ~]/root/ls# 直接用绝对路径指定该文件名
[root@study ~]./ls# 因为在/root目录下,就用./ls来指定

如果想要让root在任何目录均可执行/root下面的ls,那么就将/root加入PATH当中即可:[root@study ~]# PATH="${PATH}:/root"

  1. 如果我有两个ls指令在不同的目录中,例如/usr/local/bin/ls/bin/ls那么当我下达 ls的时候,哪个ls会被执行?
    答:找出${PATH}里面哪个目录先被查询,则那个目录下的指令就会被先执行了! 所以用dmtsai帐号为例,他最先搜寻的是/usr/local/bin,所以/usr/local/bin/ls会先被执行
  2. 为什么${PATH}搜寻的目录不加入本目录(.)?加入本目录的搜寻不是也不错?
    答:如果在PATH中加入本目录(.)后,确实我们就能够在指令所在目录进行指令的执行了。但是由于你的工作目录并非固定(常常会使用cd来切换到不同的目录),因此能够执行的指令会有变动(因为每个目录下面的可执行文件都不相同嘛!),这对使用者来说并非好事。另外,如果有个坏心使用者在/tmp下面做了一个指令,因为/tmp是大家都能够写入的环境,所以他当然可以这样做。假设该指令可能会窃取使用者的一些数据,如果你使用root的身份来执行这个指令,那不是很糟糕? 如果这个指令的名称又是经常会被用到的ls时,那“中标”的概率就更高了!所以,为了安全起见,不建议将.加入PATH的搜寻目录中。

文件与目录管理

文件与目录的检视: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号码
# -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)

二、当你只有下达ls时,默认显示的只有:非隐藏文件的文件名、 以文件名进行排序及文件名代表的颜色显示如此而已。 举例来说, 你下达ls /etc之后,只有经过排序的文件名以及以蓝色显示目录及白色显示一般文件
三、常用的范例:

# 范例一:将主文件夹下的所有文件列出来(含属性与隐藏文件)
[root@study ~]ls -al ~
total 56
dr-xr-x---.  5 root root 4096 Jun  4 19:49 .
dr-xr-xr-x. 17 root root 4096 May  4 17:56 ..
-rw-------.  1 root root 1816 May  4 17:57 anaconda-ks.cfg
-rw-------.  1 root root 6798 Jun  4 19:53 .bash_history
-rw-r--r--.  1 root root   18 Dec 29  2013 .bash_logout
-rw-r--r--.  1 root root  176 Dec 29  2013 .bash_profile
-rw-rw-rw-.  1 root root  176 Dec 29  2013 .bashrc
-rw-r--r--.  1 root root  176 Jun  3 00:04 .bashrc_test
drwx------.  4 root root   29 May  6 00:14 .cache
drwxr-xr-x.  3 root root   17 May  6 00:14 .config
# 这个时候你会看到以.开头的几个文件,以及目录档(.)(..).config等等,且目录档文件名都是以深蓝色显示

# 范例二:承上题,不显示颜色,但在文件名末显示出该文件名代表的类型(type)
[root@study ~]ls -alF --color=never  ~
total 56
dr-xr-x---.  5 root root 4096 Jun  4 19:49 ./
dr-xr-xr-x. 17 root root 4096 May  4 17:56 ../
-rw-------.  1 root root 1816 May  4 17:57 anaconda-ks.cfg
-rw-------.  1 root root 6798 Jun  4 19:53 .bash_history
-rw-r--r--.  1 root root   18 Dec 29  2013 .bash_logout
-rw-r--r--.  1 root root  176 Dec 29  2013 .bash_profile
-rw-rw-rw-.  1 root root  176 Dec 29  2013 .bashrc
-rw-r--r--.  1 root root  176 Jun  3 00:04 .bashrc_test
drwx------.  4 root root   29 May  6 00:14 .cache/
drwxr-xr-x.  3 root root   17 May  6 00:14 .config/
# 由显示结果的第一行可知,类似./command之类的指令中,./代表的是“目前目录下”,另外,.bashrc时间仅写2013,能否知道详细时间?

# 范例三:完整的呈现文件的修改时间 (modification time)
[root@study ~]ls -al --full-time  ~
total 56
dr-xr-x---.  5 root root 4096 2015-06-04 19:49:54.520684829 +0800 .
dr-xr-xr-x. 17 root root 4096 2015-05-04 17:56:38.888000000 +0800 ..
-rw-------.  1 root root 1816 2015-05-04 17:57:02.326000000 +0800 anaconda-ks.cfg
-rw-------.  1 root root 6798 2015-06-04 19:53:41.451684829 +0800 .bash_history
-rw-r--r--.  1 root root   18 2013-12-29 10:26:31.000000000 +0800 .bash_logout
-rw-r--r--.  1 root root  176 2013-12-29 10:26:31.000000000 +0800 .bash_profile
-rw-rw-rw-.  1 root root  176 2013-12-29 10:26:31.000000000 +0800 .bashrc
-rw-r--r--.  1 root root  176 2015-06-03 00:04:16.916684829 +0800 .bashrc_test
drwx------.  4 root root   29 2015-05-06 00:14:56.960764950 +0800 .cache
drwxr-xr-x.  3 root root   17 2015-05-06 00:14:56.975764950 +0800 .config
# 一般来说,ls -al仅列出目前短格式的时间,有时不会列出年份,借由--full-time可以查阅到比较正确的完整时间格式啊!

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

一、cp(复制文件或目录)

  1. 语法:
[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等也复制了。
# 注意:如果来源文件有两个以上,则最后一个目的文件一定要是“目录”才行!
  1. 案例:
    (1)用root身份,将主文件夹下的.bashrc复制到/tmp下,并更名为bashrc
[root@study ~]cp ~/.bashrc /tmp/bashrc
[root@study ~]cp -i ~/.bashrc /tmp/bashrc
cp: overwrite `/tmp/bashrc'? n  # n不覆盖,y为覆盖

重复作两次动作,由于/tmp下面已经存在bashrc了,加上-i选项后,则在覆盖前会询问使用者是否确定!可以按下n或者y来二次确认呢!
(2)变换目录到/tmp,并将/var/log/wtmp复制到/tmp且观察属性:

[root@study ~]cd /tmp
[root@study tmp]cp /var/log/wtmp . # 想要复制到目前的目录,最后的.不要忘
[root@study tmp]ls -l /var/log/wtmp wtmp
-rw-rw-r--. 1 root utmp 28416 Jun 11 18:56 /var/log/wtmp
-rw-r--r--. 1 root root 28416 Jun 11 19:01 wtmp

在不加任何选项的情况下,文件的某些属性/权限会改变;文件创建的时间也不一样了!那如果你想要将文件的所有特性都一起复制过来该怎么办?可以加上-a,如下所示:

[root@study tmp]cp -a /var/log/wtmp wtmp_2
[root@study tmp]ls -l /var/log/wtmp wtmp_2
-rw-rw-r--. 1 root utmp 28416 Jun 11 18:56 /var/log/wtmp
-rw-rw-r--. 1 root utmp 28416 Jun 11 18:56 wtmp_2
# 明白了吧!整个数据特性完全一模一样!这就是`-a`的特性!

在默认的条件中,cp的来源文件与目的文件的权限是不同的,目的文件的拥有者通常会是指令操作者本身。例如在上面的范例二中,由于我是root的身份,因此复制过来的文件拥有者与群组就改变成为root所有了!因此当我们在进行备份的时候,某些需要特别注意的特殊权限文件,例如密码档(/etc/shadow) 以及一些配置文件,就不能直接以cp来复制,而必须要加上-a或者是-p等等可以完整复制文件权限的选项才行!另外,如果你想要复制文件给其他的使用者,也必须要注意到文件的权限(包含读、写、执行以及文件拥有者等等),否则,其他人还是无法针对你给予的文件进行修订的动作喔!
(3)复制/etc/这个目录下的所有内容到/tmp下面

[root@study tmp]cp /etc/ /tmp
cp: omitting directory `/etc'# 如果是目录则不能直接复制,要加上-r的选项
[root@study tmp]cp -r /etc/ /tmp

-r是可以复制目录,但是,文件与目录的权限可能会被改变,所以,也可以利用cp -a /etc /tmp来下达指令喔!尤其是在备份的情况下!
(4)将范例一复制的bashrc创建一个链接文件(symbolic link)

[root@study tmp]ls -l bashrc
-rw-r--r--. 1 root root 176 Jun 11 19:01 bashrc  # 先观察一下文件情况
[root@study tmp]cp -s bashrc bashrc_slink
[root@study tmp]cp -l bashrc bashrc_hlink
[root@study tmp]ls -l bashrc*
-rw-r--r--. 2 root root 176 Jun 11 19:01 bashrc # 与原始文件不太一样了!
-rw-r--r--. 2 root root 176 Jun 11 19:01 bashrc_hlink
lrwxrwxrwx. 1 root root   6 Jun 11 19:06 bashrc_slink -> bashrc

使用-l-s都会创建所谓的链接文件(link file),其中,-l是实体链接(hard link),-s是符号链接(symbolic link),简单来说,bashrc_slink是一个“捷径”,这个捷径会链接到bashrc去! 所以你会看到文件名右侧会有个指向(->)的符号!
(5)若~/.bashrc/tmp/bashrc新才复制过来:[root@study tmp]# cp -u ~/.bashrc /tmp/bashrc,这个-u的特性,是在目标文件与来源文件有差异时,才会复制的。所以,比较常被用于“备份”的工作当中喔!
(6)将范例四造成的bashrc_slink复制成为bashrc_slink_1bashrc_slink_2

[root@study tmp]cp bashrc_slink bashrc_slink_1
[root@study tmp]cp -d bashrc_slink bashrc_slink_2
[root@study tmp]ls -l bashrc bashrc_slink*
-rw-r--r--. 2 root root 176 Jun 11 19:01 bashrc
lrwxrwxrwx. 1 root root   6 Jun 11 19:06 bashrc_slink -> bashrc
-rw-r--r--. 1 root root 176 Jun 11 19:09 bashrc_slink_1 # 与原始文件相同
lrwxrwxrwx. 1 root root   6 Jun 11 19:10 bashrc_slink_2 -> bashrc  # 是链接文件!

原本复制的是链接文件,但是却将链接文件的实际文件复制过来了。也就是说,如果没有加上任何选项时,cp复制的是原始文件,而非链接文件的属性!若要复制链接文件的属性,就得要使用-d的选项了!如bashrc_slink_2所示。
(7)将主文件夹的.bashrc.bash_history复制到/tmp下面:[root@study tmp]# cp ~/.bashrc ~/.bash_history /tmp,可以将多个数据一次复制到同一个目录去!最后面一定是目录!
(8)你能否使用dmtsai的身份,完整的复制/var/log/wtmp文件到/tmp下面,并更名为dmtsai_wtmp呢?

[dmtsai@study ~]$ cp -a /var/log/wtmp /tmp/dmtsai_wtmp
[dmtsai@study ~]$ ls -l /var/log/wtmp /tmp/dmtsai_wtmp
-rw-rw-r--. 1 dmtsai dmtsai 28416  611 18:56 /tmp/dmtsai_wtmp
-rw-rw-r--. 1 root   utmp   28416  611 18:56 /var/log/wtmp

由于dmtsai的身份并不能随意修改文件的拥有者与群组,因此虽然能够复制wtmp的相关权限与时间等属性,但是与拥有者、群组相关的,原本dmtsai身份无法进行的动作,即使加上-a选项,也是无法达成完整复制权限的!
二、rm(移除文件或目录)

  1. 语法:
[root@study ~]rm [-fir] 文件或目录
# 选项与参数:
# -f:就是force的意思,忽略不存在的文件,不会出现警告讯息;
# -i:互动模式,在删除前会询问使用者是否动作
# -r:递回删除啊!最常用在目录的删除了!这是非常危险的选项!!!
  1. 案例:
    (1)将刚刚在cp的范例中创建的bashrc删除掉!
[root@study ~]cd /tmp
[root@study tmp]rm -i bashrc
rm: remove regular file `bashrc'? y
# 如果加上-i的选项就会主动询问喔,避免你删除到错误的文件名!

(2)通过万用字符*的帮忙,将/tmp下面开头为bashrc的文件名通通删除:

[root@study tmp]rm -i bashrc*
# 注意那个星号,代表的是0到无穷多个任意字符喔!

(3)将cp范例中所创建的/tmp/etc/这个目录删除掉!

[root@study tmp]rmdir /tmp/etc
rmdir: failed to remove '/tmp/etc': Directory not empty# 删不掉啊!因为这不是空的目录!
[root@study tmp]rm -r /tmp/etc
rm: descend into directory `/tmp/etc'? y
rm: remove regular file `/tmp/etc/fstab'? y
rm: remove regular empty file `/tmp/etc/crypttab'? ^C  # 按下 [crtl]+c 中断
.....(中间省略).....
# 因为身份是root,默认已经加入了-i的选项,所以你要一直按y才会删除!如果不想要继续按y,可以按下“[ctrl]-c”来结束rm的工作。
# 这是一种保护的动作,如果确定要删除掉此目录而不要询问,可以这样做:
[root@study tmp]\rm -r /tmp/etc
# 在指令前加上反斜线,可以忽略掉alias的指定选项喔!注意不要删错了!删除/etc系统是会挂掉的!

(4)删除一个带有-开头的文件

[root@study tmp]touch ./-aaa-  #[touch](../Text/index.html#touch)这个指令可以创建空文件!
[root@study tmp]ls -l
-rw-r--r--. 1 root   root       0 Jun 11 19:22 -aaa-  #文件大小为0,所以是空文件
[root@study tmp]rm -aaa-
rm: invalid option -- 'a' # 因为 "-" 是选项嘛!所以系统误判了!
Try 'rm ./-aaa-' to remove the file `-aaa-'. # 新的 bash 有给建议的
Try 'rm --help' for more information.
[root@study tmp]rm ./-aaa-

三、mv(移动文件与目录,或更名)

  1. 语法:
[root@study ~]mv [-fiu] source destination
[root@study ~]mv [options] source1 source2 source3 .... directory
# 选项与参数:
# -f:force强制的意思,如果目标文件已经存在,不会询问而直接覆盖;
# -i:若目标文件(destination)已经存在时,就会询问是否覆盖!
# -u:若目标文件已经存在,且source比较新,才会更新(update)
  1. 案例
    (1)复制一文件,创建一目录,将文件移动到目录中
[root@study ~]cd /tmp
[root@study tmp]cp ~/.bashrc bashrc
[root@study tmp]mkdir mvtest
[root@study tmp]mv bashrc mvtest

(2)将刚刚的目录名称更名为mvtest2

[root@study tmp]mv mvtest mvtest2 # 这样就更名了!简单~
# rename:专职进行多个文件名的同时更名,并非针对单一文件名变更,与mv不同。

(3)再创建两个文件,再全部移动到/tmp/mvtest2当中

[root@study tmp]cp ~/.bashrc bashrc1
[root@study tmp]cp ~/.bashrc bashrc2
[root@study tmp]mv bashrc1 bashrc2 mvtest2
# 注意:如果有多个来源文件或目录,则最后一个目标文件一定是“目录!”,意思是说,将所有的数据移动到该目录的意思!

文件内容查阅

cat由第一行开始显示文件内容
tac从最后一行开始显示
nl显示的时候,顺道输出行号!
more一页一页的显示文件内容
lessmore类似,但是他可以往前翻页!
head只看头几行
tail只看尾巴几行
od以二进制的方式读取文件内容!

直接检视文件内容

一、cat(concatenate)

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

二、案例:

  1. 检阅/etc/issue这个文件的内容
[root@study ~]cat /etc/issue
\S
Kernel \r on an \m
  1. 承上题,如果还要加印行号呢?
[root@study ~]cat -n /etc/issue
     1  \S
     2  Kernel \r on an \m
     3

如果不想要编排空白行的行号,可以使用cat -b /etc/issue

  1. /etc/man_db.conf的内容完整的显示出来(包含特殊字符)
[root@study ~]cat -A /etc/man_db.conf
$
....(中间省略)....
MANPATH_MAP^I/bin^I^I^I/usr/share/man$
MANPATH_MAP^I/usr/bin^I^I/usr/share/man$
MANPATH_MAP^I/sbin^I^I^I/usr/share/man$
MANPATH_MAP^I/usr/sbin^I^I/usr/share/man$
.....(下面省略).....

在一般的环境中,使用tab与空白键的效果差不多,都是一堆空白啊!我们无法知道两者的差别。此时使用cat -A就能够发现那些空白的地方是啥鬼东西了!tab会以^I表示,断行字符则是以$表示,所以你可以发现每一行后面都是$啊!不过Windows的断行字符是^M$
二、tac(反向行示)

[root@study ~]tac /etc/issue

Kernel \r on an \m
\S
# 与刚刚上面的范例一比较,是由最后一行先显示喔!

三、nl(添加行号打印)

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

# 注意看,这个文件其实有三行,第三行为空白(没有任何字符),
# 因为他是空白行,所以nl不会加上行号喔!如果确定要加上行号,可以这样做:

[root@study ~]nl -b a /etc/issue
     1  \S
     2  Kernel \r on an \m
     3
# 如果要让行号前面自动补上0呢?可这样

[root@study ~]nl -b a -n rz /etc/issue
000001  \S
000002  Kernel \r on an \m
000003
# 默认字段是六位数,如果想要改成 3 位数?

[root@study ~]nl -b a -n rz -w 3 /etc/issue
001     \S
002     Kernel \r on an \m
003

可翻页检视

一、more(一页一页翻动)

  1. 语法:
[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:代表往回翻页,不过这动作只对文件有用,对管线无用。
  1. 案例:
    (1)我们使用more /etc/man_db.conf来观察该文件, 若想要在该文件内搜寻MANPATH这个字串时,可以这样做:
[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.
#
....(中间省略)....
/MANPATH   # 输入了 / 之后,光标就会自动跑到最下面一行等待输入!

你输入了字串并按下enter之后,more就会开始向下搜寻该字串啰~而重复搜寻同一个字串, 可以直接按下n即可啊!
二、less(一页一页翻动)

  1. 观察/etc/man_db.conf文件
[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这个程序;

不止可以向下搜寻,也可以向上搜寻

数据撷取

一、head(取出前面几行)

  1. 语法:
[root@study ~]head [-n number] 文件
# 选项与参数:
# -n number:number为数字,显示前number行,默认显示前10行
  1. 案例:
[root@study ~]head /etc/man_db.conf
# 默认的情况中,显示前面十行!若要显示前20行,就得要这样:
[root@study ~]head -n 20 /etc/man_db.conf

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

三、tail(取出后面几行)

  1. 语法
[root@study ~]tail [-n number] 文件
# 选项与参数:
# -n number:number为数字,显示前number行,默认显示前10行
# -f:表示持续侦测后面所接的文件名,要等到按下[ctrl]-c才会结束tail的侦测
  1. 案例:
    (1)如果不知道/etc/man_db.conf有几行,却只想列出100行以后的数据时:tail -n +100 /etc/man_db.conf
    (2)持续侦测/var/log/messages的内容:tail -f /var/log/messages,由于/var/log/messages随时会有数据写入,你想要让该文件有数据写入时就立刻显示到屏幕上,就利用-f这个选项,他可以一直侦测/var/log/messages这个文件,新加入的数据都会被显示到屏幕上,要等到输入[crtl]-c之后才会离开tail这个指令的侦测!
    (3)假如我想要显示/etc/man_db.conf的第11到第20行呢?
    答:取前20行,再取后10行,所以指令就是:head -n 20 /etc/man_db.conf | tail -n 10。这两个指令中间有个管线(|)的符号存在,这个管线的意思是:前面的指令所输出的讯息,请通过管线交由后续的指令继续使用的意思。 所以,head -n 20 /etc/man_db.conf会将文件内的20行取出来,但不输出到屏幕上,而是转交给后续的tail指令继续处理。 因此tail不需要接文件名,因为tail所需要的数据是来自于head处理后的结果!
    (4)承上一题,那如果我想要再屏幕上列出/etc/man_db.conf的第11到第20行,且有行号存在?
    答:先通过cat -n来带出行号,然后再通过head/tail来撷取数据,所以指令为: cat -n /etc/man_db.conf | head -n 20 | tail -n 10

非纯文本文件:od

一、我们上面提到的,都是在查阅纯文本文件的内容。 那么万一我们想要查阅非文本文件,例如/usr/bin/passwd这个可执行文件的内容时,又该如何去读出信息呢?事实上,由于可执行文件通常是binary file,使用上头提到的指令来读取他的内容时,确实会产生类似乱码的数据啊!那我们可以利用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;

三、案例:

  1. 请将/usr/bin/passwd的内容使用ASCII方式来展现!
[root@study ~]od -t c /usr/bin/passwd
0000000 177   E   L   F 002 001 001  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000020 003  \0   >  \0 001  \0  \0  \0 364   3  \0  \0  \0  \0  \0  \0
0000040   @  \0  \0  \0  \0  \0  \0  \0   x   e  \0  \0  \0  \0  \0  \0
0000060  \0  \0  \0  \0   @  \0   8  \0  \t  \0   @  \0 035  \0 034  \0
0000100 006  \0  \0  \0 005  \0  \0  \0   @  \0  \0  \0  \0  \0  \0  \0
.....(后面省略)....
# 最左边第一栏是以8进位来表示Bytes数。以上面范例来说,第二栏0000020代表开头是第16个byes(2x8)的内容之意。
  1. 请将/etc/issue这个文件的内容以8进位列出储存值与ASCII的对照表
[root@study ~]od -t oCc /etc/issue
0000000 134 123 012 113 145 162 156 145 154 040 134 162 040 157 156 040
          \   S  \n   K   e   r   n   e   l       \   r       o   n
0000020 141 156 040 134 155 012 012
          a   n       \   m  \n  \n
0000027
# 如上所示,可以发现每个字符可以对应到的数值为何!要注意的是,该数值是 8 进位喔!
# 例如 S 对应的记录数值为 123 ,转成十进制:1x8^2+2x8+3=83。

虽然读出的来数值默认是使用非文本文件,亦即是16进位的数值来显示的,不过,我们还是可以通过-t c的选项与参数来将数据内的字符以ASCII类型的字符来显示

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

一、每个文件在linux下面都会记录许多的时间参数,其实是有三个主要的变动时间:

  1. modification time(mtime):当该文件的内容数据变更时,就会更新这个时间!内容数据指的是文件的内容,而不是文件的属性或权限喔!
  2. status time(ctime):当该文件的==状态(status)==改变时,就会更新这个时间,举例来说,像是权限与属性被更改了,都会更新这个时间啊。
  3. access time(atime):当该文件的内容被取用时,就会更新这个读取时间(access)。 举例来说,我们使用cat去读取/etc/man_db.conf,就会更新该文件的 atime了。

二、万一我发现了一个文件来自未来,该如何让该文件的时间变成“现在”的时刻呢?使用touch
三、语法:

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

四、案例:

  1. 新建一个空的文件并观察时间
[dmtsai@study ~]cd /tmp
[dmtsai@study tmp]touch testtouch
[dmtsai@study tmp]ls -l testtouch
-rw-rw-r--. 1 dmtsai dmtsai 0 Jun 16 00:45 testtouch

注意到,这个文件的大小是0呢!在默认的状态下,如果touch后面有接文件,则该文件的三个时间(atime/ctime/mtime) 都会更新为目前的时间。若该文件不存在,则会主动的创建一个新的空的文件喔!例如上面这个例子!

  1. ~/.bashrc复制成为bashrc,假设复制完全的属性,检查其日期
[dmtsai@study tmp]cp -a ~/.bashrc bashrc
[dmtsai@study tmp]date; ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
Tue Jun 16 00:49:24 CST 2015                         #这是目前的时间
-rw-r--r--. 1 dmtsai dmtsai 231 Mar  6 06:06 bashrc  #这是 mtime
-rw-r--r--. 1 dmtsai dmtsai 231 Jun 15 23:44 bashrc  #这是 atime
-rw-r--r--. 1 dmtsai dmtsai 231 Jun 16 00:47 bashrc  #这是 ctime

说明:

  1. ll这个指令(两个英文L的小写)是命令别名,是ls -l的意思
  2. 分号;代表连续指令的下达,可以在一行指令当中写入多重指令,这些指令可以“依序”执行。从执行的结果当中发现数据的内容与属性是被复制过来的,因此文件内容时间(mtime)与原本文件相同。但是由于这个文件是刚刚被创建的,因此状态(ctime)就变成现在的时间啦!

注意:即使我们复制一个文件时,复制所有的属性,但也没有办法复制ctime这个属性的。ctime记录文件最近的状态(status)被改变的时间。

  1. 修改案例二的bashrc文件,将日期调整为两天前
[dmtsai@study tmp]touch -d "2 days ago" bashrc
[dmtsai@study tmp]date; ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
Tue Jun 16 00:51:52 CST 2015
-rw-r--r--. 1 dmtsai dmtsai 231 Jun 14 00:51 bashrc
-rw-r--r--. 1 dmtsai dmtsai 231 Jun 14 00:51 bashrc
-rw-r--r--. 1 dmtsai dmtsai 231 Jun 16 00:51 bashrc
# 跟上个范例比较看看,16日变成14日了(atime/mtime)~不过,ctime并没有跟着改变喔!
  1. 修改案例二的bashrc文件,将日期调整为两天前
[dmtsai@study tmp]# touch -t 201406150202 bashrc
[dmtsai@study tmp]# date; ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
Tue Jun 16 00:54:07 CST 2015
-rw-r--r--. 1 dmtsai dmtsai 231 Jun 15  2014 bashrc
-rw-r--r--. 1 dmtsai dmtsai 231 Jun 15  2014 bashrc
-rw-r--r--. 1 dmtsai dmtsai 231 Jun 16 00:54 bashrc
# 注意看看,日期在atime与mtime都改变了,但是ctime则是记录目前的时间!

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

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

文件默认权限:umask

一、umask就是指定目前使用者在创建文件或目录时的权限默认值,他的指定条件以下面的方式来指定:

[root@study ~]umask
0022#与一般权限有关的是后面三个数字!
[root@study ~]umask -S
u=rwx,g=rx,o=rx

查阅的方式有两种

  1. 直接输入umask,就可以看到数字体态的权限设置分数
  2. 加入-S(Symbolic)这个选项,就会以符号类型的方式来显示出权限了!注意第一组是特殊权限用的,我们先不要理他,所以先看后面三组即可。

二、默认权限的情况:

  1. 若使用者创建为“文件”则默认“没有可执行(x)权限”,亦即只有rw这两个项目,也就是最大为666分,默认权限如下:-rw-rw-rw-
  2. 若使用者创建为“目录”,默认为所有权限均开放,亦即为777分:drwxrwxrwx

三、umask的分数指的是“该默认值需要减掉的权限!当要拿掉能写的权限,就是输入2分,而如果要拿掉能读的权限,也就是4分,那么要拿掉读与写的权限,也就是6分,而要拿掉执行与写入的权限,也就是3分。如果以上面的例子来说明的话,因为umask为022,所以user并没有被拿掉任何权限,不过group与others的权限被拿掉了2(也就是w这个权限)
四、如何设置umask:直接在umask后面输入数字就好了!

[root@study ~]umask 002
[root@study ~]touch test3
[root@study ~]mkdir test4
[root@study ~]ll -d test[34] # 中括号[]代表中间有个指定的字符,而不是任意字符
-rw-rw-r--. 1 root root 0  616 01:12 test3
drwxrwxr-x. 2 root root 6  616 01:12 test4

五、假设你的umask为003,请问该umask情况下,创建的文件与目录权限为?
答:umask为003,所以拿掉的权限为wx,因此:文件:(-rw-rw-rw-) - (--------wx) = -rw-rw-r--,目录:(drwxrwxrwx) - (d-------wx) = drwxrwxr--

文件隐藏属性

一、下面的chattr指令只能在Ext2/Ext3/Ext4的Linux传统文件系统上面完整生效,其他的文件系统可能就无法完整的支持这个指令了,例如xfs仅支持部份参数而已。
二、chattr(设置文件隐藏属性)

  1. 语法:
[root@study ~]chattr [+-=][ASacdistu] 文件或目录名称
# 选项与参数:
# +:增加某一个特殊参数,其他原本存在参数则不动。
# -:移除某一个特殊参数,其他原本存在参数则不动。
# =:设置一定,且仅有后面接的参数

# A:当设置了A这个属性时,若你有存取此文件(或目录)时,他的存取时间atime将不会被修改,可避免I/O较慢的机器过度的存取磁盘。(目前建议使用文件系统挂载参数处理这个项目)
# S:一般文件是非同步写入磁盘的,如果加上S这个属性,当你进行任何文件的修改,该更动会“同步”写入磁盘中。
# a:当设置a之后,这个文件将只能增加数据,而不能删除也不能修改数据,只有root才能设置这属性
# c:这个属性设置之后,将会自动的将此文件“压缩”,在读取的时候将会自动解压缩,但是在储存的时候,将会先进行压缩后再储存(看来对于大文件似乎蛮有用的!)
# d:当dump程序被执行的时候,设置d属性将可使该文件(或目录)不会被dump备份
# i:让一个文件“不能被删除、改名、设置链接也无法写入或新增数据!”,对于系统安全性有相当大的助益!只有root能设置此属性
# s:如果被设置了s属性的文件被删除,他将会被完全的移除出这个硬盘空间,所以如果误删了,完全无法救回来了喔!
# u:与s相反的,当使用u来设置文件时,如果该文件被删除了,则数据内容其实还存在磁盘中,可以使用来救援该文件喔!

注意:
(1)属性设置常见的是a与i的设置值,而且很多设置值必须要身为root才能设置
(2)xfs文件系统仅支持AadiS而已
2. 案例:
(1)请尝试到/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
rm: cannot remove `attrtest': Operation not permitted
# 看到了吗?呼呼!连 root 也没有办法将这个文件删除呢!赶紧解除设置!

范例:请将该文件的 i 属性取消!
[root@study tmp]# chattr -i attrtest

三、lsattr(显示文件隐藏属性)

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

文件特殊权限:SUID,SGID,SBIT

一、Set UID

  1. 当s这个标志出现在文件拥有者的x权限上时,例如-rwsr-xr-x,此时就被称为Set UID,简称为SUID的特殊权限。那么SUID的权限对于一个文件的特殊功能是什么呢?基本上SUID有这样的限制与功能:
    (1)SUID权限仅对二进制程序(binary program)有效;
    (2)执行者对于该程序需要具有x的可执行权限;
    (3)本权限仅在执行该程序的过程中有效(run-time);
    (4)执行者将具有该程序拥有者(owner)的权限。

  2. Linux系统中,所有帐号的密码都记录在/etc/shadow这个文件里面,这个文件的权限为---------- 1 root root,意思是这个文件仅有root可读且仅有root可以强制写入而已。既然这个文件仅有root可以修改,那么dmtsai这个一般帐号使用者能否自行修改自己的密码呢?你可以使用你自己的帐号输入passwd这个指令来看看,一般使用者当然可以修改自己的密码了!有没有冲突啊! 明明/etc/shadow就不能让dmtsai这个一般帐户去存取的,为什么dmtsai还能够修改这个文件内的密码呢?这就是SUID的功能啦!借由上述的功能说明,我们可以知道:
    (1)dmtsai对于/usr/bin/passwd这个程序来说是具有x权限的,表示dmtsai能执行passwd;
    (2)passwd的拥有者是root这个帐号;
    (3)dmtsai执行passwd的过程中,会“暂时”获得root的权限;
    (4)/etc/shadow就可以被dmtsai所执行的passwd所修改。
    但如果dmtsai使用cat去读取/etc/shadow时,他能够读取吗?因为cat不具有SUID的权限,所以dmtsai执行cat /etc/shadow时,是不能读取/etc/shadow的。

  3. SUID仅可用在binary program 上,不能够用在shell script上面!这是因为shell script只是将很多的binary可执行文件叫进来执行而已!所以SUID的权限部分,还是得要看shell script调用进来的程序的设置,而不是shell script本身。

  4. SUID对于目录也是无效的

二、Set GID

  1. s在群组的x时则称为Set GID,即SGID,可以用下面的指令来观察到具有SGID权限的文件
[root@study ~]# ls -l /usr/bin/locate
-rwx--s--x. 1 root slocate 40496 Jun 10  2014 /usr/bin/locate
  1. SGID可以针对文件或目录来设置!如果是对文件来说,SGID有如下的功能:
    (1)SGID对二进制程序有用;
    (2)程序执行者对于该程序来说,需具备x的权限;
    (3)执行者在执行的过程中将会获得该程序群组的支持!

三、Sticky Bit

  1. SBIT目前只针对目录有效,SBIT对于目录的作用是:
    (1)当使用者对于此目录具有w,x权限,亦即具有写入的权限时;
    (2)当使用者在该目录下创建文件或目录时,仅有自己与root才有权力删除该文件

  2. 换句话说:当甲这个使用者于 A 目录是具有群组或其他人的身份,并且拥有该目录 w 的权限, 这表示“甲使用者对该目录内任何人创建的目录或文件均可进行 ”删除/更名/搬移“ 等动作。 “ 不过,如果将 A 目录加上了 SBIT 的权限项目时, 则甲只能够针对自己创建的文件或目录进行删除/更名/移动等动作,而无法删除他人的文件。

四、SUID/SGID/SBIT权限设置

  1. 前面我们讲了数字体态更改权限的方式为“三个数字”的组合,那么如果在这三个数字之前再加上一个数字的话,最前面的那个数字就代表这几个权限了!

  2. 4 为 SUID

  3. 2 为 SGID

  4. 1 为 SBIT

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

  6. 案例:

[root@study ~]# cd /tmp
[root@study tmp]# touch test #创建一个测试用空档
[root@study tmp]# chmod 4755 test; ls -l test # 加入具有 SUID 的权限
-rwsr-xr-x 1 root root 0 Jun 16 02:53 test
[root@study tmp]# chmod 6755 test; ls -l test # 加入具有 SUID/SGID 的权限
-rwsr-sr-x 1 root root 0 Jun 16 02:53 test
[root@study tmp]# chmod 1755 test; ls -l test # 加入 SBIT 的功能!
-rwxr-xr-t 1 root root 0 Jun 16 02:53 test
[root@study tmp]# chmod 7666 test; ls -l test # 具有空的 SUID/SGID 权限
-rwSrwSrwT 1 root root 0 Jun 16 02:53 test

最后一个例子怎么会出现大写的S与T呢?因为s与t都是取代x这个权限的,但是我们是下达7666喔!也就是说,user,group以及others都没有x这个可执行的标志(因为666嘛),所以,这个S,T代表的就是“空的”啦! 怎么说?SUID是表示“该文件在执行的时候,具有文件拥有者的权限”,但是文件拥有者都无法执行了,哪里来的权限给其他人使用? 当然就是空的啦!

  1. 你也可以通过符号法来处理设置!其中SUID为u+s,而SGID为g+s,SBIT则是o+t啰! 来看看如下的范例:
# 设置权限成为 -rws--x--x 的模样:
[root@study tmp]# chmod u=rwxs,go=x test; ls -l test
-rws--x--x 1 root root 0 Jun 16 02:53 test

# 承上,加上 SGID 与 SBIT 在上述的文件权限中!
[root@study tmp]# chmod g+s,o+t test; ls -l test
-rws--s--t 1 root root 0 Jun 16 02:53 test

观察文件类型:file

如果你想要知道某个文件的基本数据,例如是属于ASCII 或者是 data 文件,或者是 binary , 且其中有没有使用到动态函数库 (share library) 等等的信息,就可以利用 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 的动态函数库链接等等。
[root@study ~]# file /var/lib/mlocate/mlocate.db
/var/lib/mlocate/mlocate.db: data  # 这是 data 文件!

指令与文件的搜寻

指令文件名的搜寻

一、连续输入两次[tab]按键就能够知道使用者有多少指令可以下达
二、通过whichtype来查找指令的完整文件名
三、which:寻找“可执行文件”

  1. 语法:
[root@study ~]# which [-a] command
选项或参数:
-a :将所有由 PATH 目录中可以找到的指令均列出,而不止第一个被找到的指令名称
  1. 这个指令是根据PATH这个环境变量所规范的路径,去搜寻“可执行文件”的文件名,重点是找出“可执行文件”而已!且which后面接的是“完整文件名”喔!若加上-a选项,则可以列出所有的可以找到的同名可执行文件,而非仅显示第一个而已!
  2. 案例:
    (1)用 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 章节中再来谈的!

(2)请找出 history 这个指令的完整文件名

[root@study ~]# which history
/usr/bin/which: no history in (/usr/local/sbin:/usr/local/bin:/sbin:/bin:
/usr/sbin:/usr/bin:/root/bin)

[root@study ~]# history --help
-bash: history: --: invalid option
history: usage: history [-c] [-d offset] [n] or history -anrw [filename] or history -ps arg 
# 没有history,因为history是“bash内置的指令”啦! 
# 但是which默认是找PATH内所规范的目录,所以当然一定找不到的啊(有bash就有history!)!
# 我们可以通过type这个指令来查找,这个指令会在第十章讲

文件文件名的搜寻

一、 find不常用!因为他是直接搜寻硬盘,速度慢。一般我们都是先使用whereis或者是locate来搜索,如果真的找不到了,才以find。因为whereis只找系统中某些特定目录下面的文件,locate则是利用数据库来搜寻文件名,两者相当的快速,并且没有实际的搜寻硬盘内的文件系统状态,比较省时间啦!
二、whereis:由一些特定的目录中寻找文件文件名

  1. 语法:
[root@study ~]# whereis [-bmsu] 文件或目录名
选项与参数:
-l    :可以列出 whereis 会去查询的几个主要目录而已
-b    :只找 binary 格式的文件
-m    :只找在说明文档 manual 路径下的文件
-s    :只找 source 来源文件
-u    :搜寻不在上述三个项目当中的其他特殊文件
  1. 案例:找出跟 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
  1. whereis只找几个特定的目录,并没有全系统去查询。whereis主要是针对/bin/sbin下面的可执行文件,以及/usr/share/man下面的man page文件,跟几个比较特定的目录来处理而已。使用whereis -l查看whereis到底查找了哪些目录

三、locate / updatedb

  1. 语法:
[root@study ~]# locate [-ir] keyword
选项与参数:
-i  :忽略大小写的差异;
-c  :不输出文件名,仅计算找到的文件数量
-l  :仅输出几行的意思,例如输出五行则是 -l 5
-S  :输出 locate 所使用的数据库文件的相关信息,包括该数据库纪录的文件/目录数量等
-r  :后面可接正则表达式的显示方式
  1. 案例:找出系统中所有与 passwd 相关的文件名,且只列出 5 个
[root@study ~]# locate -l 5 passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
/usr/bin/gpasswd
  1. 使用locate来寻找数据的时候特别的快,因为他寻找的数据是由“已创建的数据库/var/lib/mlocate/”里面的数据所搜寻到的。但由于数据库默认每天更新一次(每个distribution都不同,CentOS 7.x是每天更新数据库一次!),所以当你新创建一个文件,却在数据库更新之前搜寻该文件,那么locate会告诉你找不到!手动更新locate数据库的方法非常简单,直接输入updatedb就可以了。
  2. 总结:
    (1)updatedb:根据/etc/updatedb.conf的设置去搜寻系统硬盘内的文件名,并更新/var/lib/mlocate内的数据库文件;
    (2)locate:依据/var/lib/mlocate内的数据库记载,找出使用者输入的关键字文件名。

四、find

  1. 语法:
[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 的权限”的文件,举例来说,
                 我们要搜寻 -rwxr--r-- ,亦即 0744 的文件,使用 -perm -0744,
                 当一个文件的权限为 -rwsr-xr-x ,亦即 4755 时,也会被列出来,
                 因为 -rwsr-xr-x 的属性已经囊括了 -rwxr--r-- 的属性了。
   -perm /mode :搜寻文件权限“包含任一 mode 的权限”的文件,举例来说,我们搜寻
                 -rwxr-xr-x ,亦即 -perm /755 时,但一个文件属性为 -rw-------
                 也会被列出来,因为他有 -rw.... 的属性存在! 
                 
4\. 额外可进行的动作:
   -exec command :command 为其他指令,-exec 后面可再接额外的指令来处理搜寻到的结果。
   -print        :将结果打印到屏幕上,这个动作是默认动作!

(1)时间参数的意义:
在这里插入图片描述
图中最右边为目前的时间,越往左边则代表越早之前的时间轴

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

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

[root@study ~]# find /etc -newer /etc/passwd
# -newer 用在分辨两个文件之间的新旧关系是很有用的!

(3)范例三:搜寻 /home 下面属于 dmtsai 的文件

[root@study ~]# find /home -user dmtsai
# 这个东西也很有用的~当我们要找出任何一个使用者在系统当中的所有文件时,
# 就可以利用这个指令将属于某个使用者的所有文件都找出来喔!

(4)范例四:搜寻系统中不属于任何人的文件

[root@study ~]# find / -nouser
# 通过这个指令,可以轻易的就找出那些不太正常的文件。
# -nouser或-nogroup:除了你自行由网络上面下载文件时会发生之外,如果你将系统里面某个帐号删除了,但是该帐号已经在系统内创建很多文件时,就可能会发生无主孤魂的文件存在! 

(5)找出文件名包含了 passwd 这个关键字的文件

[root@study ~]# find / -name "*passwd*"
# 利用这个 -name 可以搜寻文件名啊!默认是完整文件名,如果想要找关键字,
# 可以使用类似 * 的任意字符来处理

(6)找出 /run 目录下,文件类型为 Socket 的文件名有哪些?

[root@study ~]# find /run -type s
# 这个 -type 的属性也很有帮助喔!尤其是要找出那些怪异的文件,
# 例如 socket 与 FIFO 文件,可以用 find /run -type p 或 -type s 来找!

(7)搜寻文件当中含有 SGID 或 SUID 或 SBIT 的属性

[root@study ~]# find / -perm /7000 
# 所谓的 7000 就是 ---s--s--t ,那么只要含有 s 或 t 的就列出,所以当然要使用 /7000,
# 使用 -7000 表示要同时含有 ---s--s--t 的所有三个权限。而只需要任意一个,就是 /7000 ~瞭乎?

-perm用于找出特殊权限的文件,我们知道SUID与SGID都可以设置在二进制程序上,假设我想要找出来/usr/bin/usr/sbin这两个目录下,只要具有SUID或SGID就列出来该文件,你可以这样做:[root@study ~]# find /usr/bin /usr/sbin -perm /6000,因为SUID是4分,SGID为2分,总共为6分,因此可用/6000来处理这个权限!至于find后面可以接多个目录来进行搜寻!另外,find本来就会搜寻次目录。
(8)将上个范例找到的文件使用ls -l列出来:find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} \;。注意-exec后面的ls -l就是额外的指令,指令不支持命令别名,所以仅能使用ls -l不可以使用ll喔!
find的特殊功能就是能够进行额外的动作
在这里插入图片描述
该范例中特殊的地方有 {} 以及 ; 还有 -exec 这个关键字,这些东西的意义为:

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

(9)找出系统中,大于1MB的文件:find / -size +1M

  1. 如果你要找的文件是具有特殊属性的,例如 SUID 、文件拥有者、文件大小等等, 那么利用 locate 是没有办法达成你的搜寻的!此时 find 就显的很重要啦! 另外,find 还可以利用万用字符来找寻文件名呢!举例来说,你想要找出 /etc 下面文件名包含 httpd 的文件, 那么你就可以这样做:[root@study ~]# find /etc -name '*httpd*'
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值