Linux基础之四

来源:互联网 发布:钢铁战队 知乎 编辑:程序博客网 时间:2024/06/07 01:11

文件与目录管理(第六章)

    目录与路径

    相对路径的用途

    例如:/cluster/raid/output/taiwan2006/smoke 这个目录,而另一个目录在/cluster/raid/output/taiwan2006/cctm,那么我从第一个要到第二个目录去的话,怎么写比较方便?当然是“ cd ../cctm ”。

        . 代表此层目录

        .. 代表上一层目录

        - 代表前一个工作目录

        ~ 代表“目前使用者身份”所在的主文件夹

        ~account 代表 account 这个使用者的主文件夹(account是个帐号名称)

    例题:请问在Linux下面,根目录下有没有上层目录(..)存在?

    答:若使用“ ls -al / ”去查询,可以看到根目录下确实存在 . 与 .. 两个目录,再仔细的查阅,可发现这两个目录的属性与权限完全一致,这代表根目录的上一层(..)与根目录自己(.)是同一个目录。处理目录的指令吧:

    cd:变换目录

    pwd:显示目前的目录

    mkdir:创建一个新的目录

    rmdir:删除一个空的目录

    cd (changedirectory, 变换目录)

    我们知道dmtsai这个使用者的主文件夹是/home/dmtsai/,而root主文件夹则是/root/,假设我以root身份在Linux系统中,那么简单的说明一下这几个特殊的目录的意义是:

        [dmtsai@study~]$ su - # 先切换身份成为 root 看看!

        [root@study ~]#cd [相对路径或绝对路径]

        # 最重要的就是目录的绝对路径与相对路径,还有一些特殊目录的符号啰!

        [root@study ~]#cd ~dmtsai

        # 代表去到 dmtsai 这个使用者的主文件夹,亦即/home/dmtsai

        [root@studydmtsai]# cd ~

        # 表示回到自己的主文件夹,亦即是 /root 这个目录

        [root@study ~]#cd

        # 没有加上任何路径,也还是代表回到自己主文件夹的意思喔!

        [root@study ~]#cd ..

        # 表示去到目前的上层目录,亦即是 /root 的上层目录的意思;

        [root@study /]#cd -

        # 表示回到刚刚的那个目录,也就是 /root 啰~

        [root@study ~]#cd /var/spool/mail

        # 这个就是绝对路径的写法!直接指定要去的完整路径名称!

        [root@studymail]# cd ../postfix

        # 这个是相对路径的写法,我们由/var/spool/mail 去到/var/spool/postfix 就这样写!

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

        [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 suchfile 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](../Text/index.html#umask) 才能了解喔! ^_^

    rmdir (删除“空”的目录)

        选项与参数:

        -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’: Directorynot 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 仅能“删除空的目录”喔!

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

    现在,请下达“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当中的喔!

    现在,请下达“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(一定是大写)这个变量的内容是由一堆目录所组成的,每个目录中间用冒号(:)来隔开,每个目录是有“顺序”之分的。

    为什么PATH是那么重要的项目!

    例题:假设你是root,如果你将ls由/bin/ls移动成为/root/ls(可用“mv/bin/ls /root”指令达成),然后你自己本身也在/root目录下,请问(1)你能不能直接输入ls来执行?(2)若不能,你该如何执行ls这个指令?(3)若要直接输入ls即可执行,又该如何进行?

    答:由于这个例题的重点是将某个可执行文件移动到非正规目录去,所以我们先要进行下面的动作才行:(务必先使用 su - 切换成为root的身份)

        [root@study ~]#mv /bin/ls /root

        # mv 为移动,可将文件在不同的目录间进行移动作业

        (1)接下来不论你在那个目录下面输入任何与ls相关的指令,都没有办法顺利的执行ls了!也就是说,你不能直接输入ls来执行,因为/root这个目录并不在PATH指定的目录中,所以,即使你在/root目录下,也不能够搜寻到ls这个指令!

        (2)因为这个ls确实存在于/root下面,并不是被删除了!所以我们可以通过使用绝对路径或者是相对路径直接指定这个可执行文件文件名,下面的两个方法都能够执行ls这个指令:

        [root@study ~]# /root/ls <==直接用绝对路径指定该文件名

        [root@study ~]# ./ls <==因为在 /root 目录下,就用./ls来指定

        (3)如果想要让root在任何目录均可执行/root下面的ls,那么就将/root加入PATH当中即可。加入的方法很简单,就像下面这样:

        [root@study ~]# PATH="${PATH}:/root"

    上面这个作法就能够将/root加入到可执行文件搜寻路径PATH中了!不相信的话请您自行使用“echo $PATH”去查看吧!另外,除了$PATH之外,如果想要更明确的定义出变量的名称,可以使用大括号 ${PATH} 来处理变量的调用喔!如果确定这个例题进行没有问题了,请将ls搬回/bin下面,不然系统会挂点的!

        [root@study ~]# mv /root/ls /bin

    例题:如果我有两个ls指令在不同的目录中,例如/usr/local/bin/ls与/bin/ls那么当我下达 ls 的时候,哪个ls会被执行?

    答:那还用说,就找出 ${PATH} 里面哪个目录先被查询,则那个目录下的指令就会被先执行了!所以用 dmtsai帐号为例,他最先搜寻的是/usr/local/bin,所以/usr/local/bin/ls会先被执行喔!

   例题:为什么 ${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 号码,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)

    范例一:将主文件夹下的所有文件列出来(含属性与隐藏文件)

        [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

        -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

        # 之类的指令了吧?因为 ./ 代表的是“目前目录下”的意思啊!至于什么是 FIFO/Socket ?

        # 请参考前一章节的介绍啊!另外,那个.bashrc 时间仅写2013,能否知道详细时间?

    范例三:完整的呈现文件的修改时间 (modificationtime)

        [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 +0800anaconda-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 (复制文件或目录)

        [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 等也复制了。

    最后需要注意的,如果来源文件有两个以上,则最后一个目的文件一定要是“目录”才行!

    范例一:用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 来二次确认呢!

    范例二:变换目录到/tmp,并将/var/log/wtmp复制到/tmp且观察属性:

        [root@study~]# cd /tmp

        [root@studytmp]# cp /var/log/wtmp . <==想要复制到目前的目录,最后的 . 不要忘

        [root@studytmp]# ls -l /var/log/wtmp wtmp

        -rw-rw-r--. 1root utmp 28416 Jun 11 18:56 /var/log/wtmp

        -rw-r--r--. 1root root 28416 Jun 11 19:01 wtmp

        # 注意上面的特殊字体,在不加任何选项的情况下,文件的某些属性/权限会改变;

        # 这是个很重要的特性!要注意喔!还有,连文件创建的时间也不一样了!

        # 那如果你想要将文件的所有特性都一起复制过来该怎办?可以加上 -a 喔!如下所示:

        [root@studytmp]# cp -a /var/log/wtmp wtmp_2

        [root@studytmp]# ls -l /var/log/wtmp wtmp_2

        -rw-rw-r--. 1root utmp 28416 Jun 11 18:56 /var/log/wtmp

        -rw-rw-r--. 1root utmp 28416 Jun 11 18:56 wtmp_2

        # 瞭了吧!整个数据特性完全一模一样ㄟ!真是不赖~这就是 -a 的特性!

    范例三:复制 /etc/ 这个目录下的所有内容到/tmp 下面

        [root@studytmp]# cp /etc/ /tmp

        cp: omittingdirectory `/etc' <== 如果是目录则不能直接复制,要加上 -r 的选项

        [root@studytmp]# cp -r /etc/ /tmp

        # 还是要再次的强调喔! -r是可以复制目录,但是,文件与目录的权限可能会被改变

        # 所以,也可以利用“ cp-a /etc /tmp ”来下达指令喔!尤其是在备份的情况下!

    范例四:将范例一复制的 bashrc 创建一个链接文件 (symboliclink)

         [root@studytmp]# ls -l bashrc

         -rw-r--r--. 1root root 176 Jun 11 19:01 bashrc <==先观察一下文件情况

        [root@studytmp]# cp -s bashrc bashrc_slink

        [root@studytmp]# cp -l bashrc bashrc_hlink

        [root@studytmp]# ls -l bashrc*

        -rw-r--r--. 2root root 176 Jun 11 19:01 bashrc <==与原始文件不太一样了!

        -rw-r--r--. 2root root 176 Jun 11 19:01 bashrc_hlink

        lrwxrwxrwx. 1root root 6 Jun 11 19:06 bashrc_slink -> bashrc

    范例五:若 ~/.bashrc 比 /tmp/bashrc新才复制过来

        [root@studytmp]# cp -u ~/.bashrc /tmp/bashrc

        # 这个 -u 的特性,是在目标文件与来源文件有差异时,才会复制的。

        # 所以,比较常被用于“备份”的工作当中喔! ^_^

    范例六:将范例四造成的bashrc_slink 复制成为 bashrc_slink_1 与bashrc_slink_2

        [root@studytmp]# cp bashrc_slink bashrc_slink_1

        [root@study tmp]#cp -d bashrc_slink bashrc_slink_2

        [root@studytmp]# ls -l bashrc bashrc_slink*

        -rw-r--r--. 2root root 176 Jun 11 19:01 bashrc

        lrwxrwxrwx. 1root root 6 Jun 11 19:06 bashrc_slink -> bashrc

        -rw-r--r--. 1root root 176 Jun 11 19:09 bashrc_slink_1 <==与原始文件相同

        lrwxrwxrwx. 1root root 6 Jun 11 19:10 bashrc_slink_2 -> bashrc <==是链接文件!

        # 这个例子也是很有趣喔!原本复制的是链接文件,但是却将链接文件的实际文件复制过来了

        # 也就是说,如果没有加上任何选项时,cp复制的是原始文件,而非链接文件的属性!

        # 若要复制链接文件的属性,就得要使用 -d 的选项了!如 bashrc_slink_2 所示。

    范例七:将主文件夹的 .bashrc 及 .bash_history复制到 /tmp 下面

        [root@studytmp]# cp ~/.bashrc ~/.bash_history /tmp

        # 可以将多个数据一次复制到同一个目录去!最后面一定是目录!

    例题:你能否使用 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--. 1dmtsai dmtsai 28416 6月 11 18:56 /tmp/dmtsai_wtmp

         -rw-rw-r--. 1root utmp 28416 6月 11 18:56 /var/log/wtmp

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

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

    rm (移除文件或目录)

        [root@study~]# rm [-fir] 文件或目录

        选项与参数:

        -f :就是 force 的意思,忽略不存在的文件,不会出现警告讯息;

        -i :互动模式,在删除前会询问使用者是否动作

        -r :递回删除啊!最常用在目录的删除了!这是非常危险的选项!!!

    范例一:将刚刚在 cp 的范例中创建的bashrc 删除掉!

        [root@study~]# cd /tmp

        [root@studytmp]# rm -i bashrc

        rm: removeregular file `bashrc'? y

        # 如果加上 -i 的选项就会主动询问喔,避免你删除到错误的文件名!

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

        [root@studytmp]# rm -i bashrc*

        # 注意那个星号,代表的是 0到无穷多个任意字符喔!很好用的东西!

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

        [root@studytmp]# rmdir /tmp/etc

        rmdir: failedto remove '/tmp/etc': Directory not empty <== 删不掉啊!因为这不是空的目录!

        [root@studytmp]# rm -r /tmp/etc

        rm: descendinto directory `/tmp/etc'? y

        rm: removeregular file `/tmp/etc/fstab'? y

        rm: removeregular empty file `/tmp/etc/crypttab'? ^C <== 按下 [crtl]+c 中断

        .....(中间省略).....

        # 因为身份是 root ,默认已经加入了 -i 的选项,所以你要一直按 y才会删除!

        # 如果不想要继续按 y ,可以按下“[ctrl]-c ”来结束 rm 的工作。

        # 这是一种保护的动作,如果确定要删除掉此目录而不要询问,可以这样做:

        [root@studytmp]# \rm -r /tmp/etc

        # 在指令前加上反斜线,可以忽略掉 alias 的指定选项喔!至于 alias 我们在bash再谈!

        # 拜托!这个范例很可怕!你不要删错了!删除 /etc 系统是会挂掉的!

    范例四:删除一个带有 - 开头的文件

        [root@studytmp]# touch ./-aaa- <==[touch](../Text/index.html#touch)这个指令可以创建空文件!

        [root@studytmp]# ls -l

        -rw-r--r--. 1root root 0 Jun 11 19:22 -aaa- <==文件大小为0,所以是空文件

        [root@studytmp]# rm –aaa

        rm: invalidoption -- 'a' <== 因为 "-" 是选项嘛!所以系统误判了!

        Try 'rm./-aaa-' to remove the file `-aaa-'. <== 新的 bash 有给建议的

        Try 'rm--help' for more information.

        [root@studytmp]# rm ./-aaa-

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

        [root@study~]# mv [-fiu] source destination

        [root@study~]# mv [options] source1 source2 source3 .... directory

    选项与参数:

        -f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;

        -i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!

        -u :若目标文件已经存在,且source 比较新,才会更新(update)

    范例一:复制一文件,创建一目录,将文件移动到目录中

        [root@study~]# cd /tmp

        [root@studytmp]# cp ~/.bashrc bashrc

        [root@studytmp]# mkdir mvtest

        [root@studytmp]# mv bashrc mvtest

        # 将某个文件移动到某个目录去,就是这样做!

    范例二:将刚刚的目录名称更名为 mvtest2

        [root@studytmp]# mv mvtest mvtest2 <== 这样就更名了!简单~

        # 其实在 Linux 下面还有个有趣的指令,名称为 rename ,

        # 该指令专职进行多个文件名的同时更名,并非针对单一文件名变更,与mv不同。请man rename。

    范例三:再创建两个文件,再全部移动到 /tmp/mvtest2 当中

        [root@studytmp]# cp ~/.bashrc bashrc1

        [root@studytmp]# cp ~/.bashrc bashrc2

        [root@studytmp]# mv bashrc1 bashrc2 mvtest2

        # 注意到这边,如果有多个来源文件或目录,则最后一个目标文件一定是“目录!”

        # 意思是说,将所有的数据移动到该目录的意思!

    这是搬移 (move) 的意思!当你要移动文件或目录的时后,呵呵!这个指令就很重要啦!同样的,你也可以使用 -u ( update )来测试新旧文件,看看是否需要搬移啰!另外一个用途就是“变更文件名!”,我们可以很轻易的使用mv来变更一个文件的文件名呢!不过,在Linux 才有的指令当中,有个rename ,可以用来更改大量文件的文件名,你可以利用man rename 来查阅一下,也是挺有趣的指令喔!

    文件内容查阅

    cat 由第一行开始显示文件内容

    tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!

    nl 显示的时候,顺道输出行号!

    more 一页一页的显示文件内容

    less 与 more 类似,但是比 more 更好的是,他可以往前翻页!

    head 只看头几行

    tail 只看尾巴几行

    od 以二进制的方式读取文件内容!

    检视文件内容

    cat (concatenate)

        选项与参数:

        -A :相当于 -vET 的整合选项,可列出一些特殊字符而不是空白而已;

        -b :列出行号,仅针对非空白行做行号显示,空白行不标行号!

        -E :将结尾的断行字符 $ 显示出来;

        -n :打印出行号,连同空白行也会有行号,与 -b 的选项不同;

        -T :将 [tab] 按键以 ^I 显示出来;

        -v :列出一些看不出来的特殊字符

    范例一:检阅 /etc/issue 这个文件的内容

        [root@study ~]# cat /etc/issue

        \S

        Kernel \r on an \m

    范例二:承上题,如果还要加印行号呢?

        [root@study ~]# cat -n /etc/issue

        1 \S

        2 Kernel \r on an \m

        3

        # 所以这个文件有三行!看到了吧!可以印出行号呢!这对于大文件要找某个特定的行时,有点用处!

        # 如果不想要编排空白行的行号,可以使用“cat -b /etc/issue”,自己测试看看:

    范例三:将/etc/man_db.conf 的内容完整的显示出来(包含特殊字符)

        [root@study~]# cat -A /etc/man_db.conf

        tac (反向列示)

        [root@study~]# tac /etc/issue

        Kernel \r onan \m

        \S

    # 嘿嘿!与刚刚上面的范例一比较,是由最后一行先显示喔!

    nl (添加行号打印)

        [root@study~]# nl [-bnw] 文件

        选项与参数:

        -b :指定行号指定的方式,主要有两种:

        -b a :表示不论是否为空行,也同样列出行号(类似 cat -n);

        -b t :如果有空行,空的那一行不要列出行号(默认值);

        -n :列出行号表示的方法,主要有三种:

        -n ln :行号在屏幕的最左方显示;

        -n rn :行号在自己字段的最右方显示,且不加 0 ;

        -n rz :行号在自己字段的最右方显示,且加 0 ;

        -w :行号字段的占用的字符数。

    范例一:用 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

        # 嘿嘿!自动在自己字段的地方补上 0 了~默认字段是六位数,如果想要改成 3 位数?

        [root@study~]# nl -b a -n rz -w 3 /etc/issue

        001 \S

        002 Kernel \ron an \m

        003

        # 变成仅有 3 位数啰~

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

    more (一页一页翻动)

        [root@study ~]# more /etc/man_db.conf

        空白键 (space):代表向下翻一页;

        Enter :代表向下翻“一行”;

        /字串:代表在这个显示的内容当中,向下搜寻“字串”这个关键字;

        :f :立刻显示出文件名以及目前显示的行数;

        q :代表立刻离开 more ,不再显示该文件内容。

        b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用,对管线无用。

    less (一页一页翻动)

        [root@study ~]# less /etc/man_db.conf

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

        空白键 :向下翻动一页;

        [pagedown]:向下翻动一页;

        [pageup] :向上翻动一页;

        /字串 :向下搜寻“字串”的功能;

       ?字串 :向上搜寻“字串”的功能;

        n :重复前一个搜寻 (与 / 或 ? 有关!)

        N :反向的重复前一个搜寻 (与 / 或 ? 有关!)

        g :前进到这个数据的第一行去;

        G :前进到这个数据的最后一行去 (注意大小写);

        q :离开 less 这个程序;

    head (取出前面几行)

        [root@study ~]# head [-n number] 文件

        选项与参数:

        -n :后面接数字,代表显示几行的意思

        [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 (取出后面几行)

        [root@study~]# tail [-n number] 文件

       选项与参数:

        -n :后面接数字,代表显示几行的意思

        -f :表示持续侦测后面所接的文件名,要等到按下[ctrl]-c才会结束tail的侦测

        [root@study~]# tail /etc/man_db.conf

        # 默认的情况中,显示最后的十行!若要显示最后的 20 行,就得要这样:

        [root@study~]# tail -n 20 /etc/man_db.conf

    范例一:如果不知道/etc/man_db.conf有几行,却只想列出100行以后的数据时?

         [root@study~]# tail -n +100 /etc/man_db.conf

    范例二:持续侦测/var/log/messages的内容

        [root@study~]# tail -f /var/log/messages

        <==要等到输入[crtl]-c之后才会离开tail这个指令的侦测!

    非纯文本文件: od

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

        [root@study~]# touch [-acdmt] 文件

        选项与参数:

        -a :仅修订 accesstime;

        -c :仅修改文件的时间,若该文件不存在则不创建新文件;

        -d :后面可以接欲修订的日期而不用目前的日期,也可以使用 --date="日期或时间"

        -m :仅修改 mtime ;

        -t :后面可以接欲修订的时间而不用目前的时间,格式为[YYYYMMDDhhmm]

    范例一:新建一个空的文件并观察时间

        [dmtsai@study~]# cd /tmp

        [dmtsai@studytmp]# touch testtouch

        [dmtsai@studytmp]# ls -l testtouch

        -rw-rw-r--. 1dmtsai dmtsai 0 Jun 16 00:45 testtouch

        # 注意到,这个文件的大小是0 呢!在默认的状态下,如果 touch 后面有接文件,

        # 则该文件的三个时间 (atime/ctime/mtime) 都会更新为目前的时间。若该文件不存在,

        # 则会主动的创建一个新的空的文件喔!例如上面这个例子!

    范例二:将 ~/.bashrc 复制成为 bashrc,假设复制完全的属性,检查其日期

        [dmtsai@studytmp]# cp -a ~/.bashrc bashrc

        [dmtsai@studytmp]# date; ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc

        Tue Jun 1600:49:24 CST 2015 <==这是目前的时间

        -rw-r--r--. 1dmtsai dmtsai 231 Mar 6 06:06 bashrc <==这是 mtime

        -rw-r--r--. 1dmtsai dmtsai 231 Jun 15 23:44 bashrc <==这是 atime

        -rw-r--r--. 1dmtsai dmtsai 231 Jun 16 00:47 bashrc <==这是 ctime

        在上面这个案例当中我们使用了“ll”这个指令(两个英文L的小写),这个指令其实就是“ls -l”的意思,ll本身不存在,是被“做出来”的一个命令别名。相关的命令别名我们会在bash章节当中详谈的,这里先知道ll="ls -l"即可。至于分号“ ; ”则代表连续指令的下达啦!你可以在一行指令当中写入多重指令,这些指令可以“依序”执行。由上面的指令我们会知道ll那一行有三个指令被下达在同一行中。至于执行的结果当中,我们可以发现数据的内容与属性是被复制过来的,因此文件内容时间(mtime)与原本文件相同。但是由于这个文件是刚刚被创建的,因此状态(ctime)就变成现在的时间啦!那如果你想要变更这个文件的时间呢?可以这样做:

    范例三:修改案例二的 bashrc 文件,将日期调整为两天前

        [dmtsai@studytmp]# touch -d "2 days ago" bashrc

        [dmtsai@studytmp]# date; ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc

        Tue Jun 1600:51:52 CST 2015

        -rw-r--r--. 1dmtsai dmtsai 231 Jun 14 00:51 bashrc

        -rw-r--r--. 1dmtsai dmtsai 231 Jun 14 00:51 bashrc

        -rw-r--r--. 1dmtsai dmtsai 231 Jun 16 00:51 bashrc

        # 跟上个范例比较看看,本来是16 日变成 14 日了(atime/mtime)~不过, ctime 并没有跟着改变喔!

   范例四:将上个范例的 bashrc 日期改为2014/06/15 2:02

        [dmtsai@studytmp]# touch -t 201406150202 bashrc

        [dmtsai@studytmp]# date; ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc

        Tue Jun 1600:54:07 CST 2015

        -rw-r--r--. 1dmtsai dmtsai 231 Jun 15 2014 bashrc

        -rw-r--r--. 1dmtsai dmtsai 231 Jun 15 2014 bashrc

        -rw-r--r--. 1dmtsai dmtsai 231 Jun 16 00:54 bashrc

        # 注意看看,日期在atime 与 mtime 都改变了,但是 ctime 则是记录目前的时间!