• Linux基础--文件与目录管理


    1、目录与路径
    1)特殊目录
    .   代表此层目录
    ..  代表上一层目录
    -   代表前一个工作目录
    ~   代表『目前使用者身份』所在的家目录
    ~account   代表account这个使用者的家目录

    2)基本命令
    cd:变换目录
    pwd:显示目前的目录
    mkdir:建立一个新的目录
    rmdir:删除一个空的目录

    3)mkdir  建立新目录
    [root@linux ~]# mkdir [-mp] 目录名称
    参数:
    -m:设定档案的权,直接设定,不需要看预设权限(umask)的脸色~
    -p:帮助你直接将所需要的目录递归建立起来 
    [root@linux ~]# cd /tmp
    [root@linux tmp]# mkdir test      <== 建立一名为test的新目录
    [root@linux tmp]# mkdir test1/test2/test3/test4
    mkdir: cannot create directory `test1/test2/test3/test4':
    No such file or directory         <== 没办法直接建立此目录
    [root@linux tmp]# mkdir -p test1/test2/test3/test4   #加了这个-p的参数,可以自行帮您建立多层目录
    [root@linux tmp]# mkdir -m 711 test2
    [root@linux tmp]# ls -l
    drwxr-xr-x 3 root root 4096 Jul 18 12:50 test
    drwxr-xr-x 3 root root 4096 Jul 18 12:53 test1
    drwx--x--x 2 root root 4096 Jul 18 12:54 test2
      仔细看上面的权限部分,如果没有加上-m来强制设定属性,系统会使用预设属性。 那么您的预设属性为何?这要透过umask才能了解!
    4)rmdir  删除空目录
    [root@linux ~]# rmdir [-p] 目录名称
    参数:
    -p:连同上层『空的』目录也一起删除
    [root@linux tmp]# ls -l
    drwxr-xr-x 3 root root 4096 Jul 18 12:50 test
    drwxr-xr-x 3 root root 4096 Jul 18 12:53 test1
    drwx--x--x 2 root root 4096 Jul 18 12:54 test2
    [root@linux tmp]# rmdir test
    [root@linux tmp]# rmdir test1
    rmdir: `test1': Directory not empty
    [root@linux tmp]# rmdir -p test1/test2/test3/test4  
    [root@linux tmp]# ls -l
    drwx--x--x 2 root root 4096 Jul 18 12:54 test2
       利用-p这个参数,立刻就可以将test1/test2/test3/test4一次删除~ 不过要注意的是,这个rmdir仅能删除空的目录。

    2、档案与目录的检视
    [root@linux ~]# ls [-aAdfFhilRS] 目录名称
    [root@linux ~]# ls [--color={none,auto,always}] 目录名称
    [root@linux ~]# 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) 
    范例一:将家目录下的所有档案列出来(含属性与隐藏文件)
    [root@linux ~]# ls -al ~
    total 252
    drwxr-x--- 9 root root 4096 Jul 16 23:40 .
    drwxr-xr-x 24 root root 4096 Jul 16 23:45 ..
    -rw------- 1 root root 1491 Jun 25 08:53 anaconda-ks.cfg
    -rw------- 1 root root 12543 Jul 18 01:23 .bash_history
    -rw-r--r-- 1 root root 24 Dec 4 2004 .bash_logout
    -rw-r--r-- 1 root root 191 Dec 4 2004 .bash_profile
    -rw-r--r-- 1 root root 395 Jul 4 11:45 .bashrc
    -rw-r--r-- 1 root root 68495 Jun 25 08:53 install.log
    -rw-r--r-- 1 root root 5976 Jun 25 08:53 install.log.syslog
    drwx------ 2 root root 4096 Jul 4 16:03 .ssh
    -rw------- 1 root root 12613 Jul 16 23:40 .viminfo
       这个时候您会看到以.为开头的几个档案,以及目录文件./../.ssh等等,不过,目录文件都是以深蓝色显示,有点不容易看清楚就是了。

    范例二:承上题,不显示颜色,但在文件名末显示出该文件名代表的类型(type)
    [root@linux ~]# ls -alF --color=never ~
    total 252
    drwxr-x--- 9 root root 4096 Jul 16 23:40 ./
    drwxr-xr-x 24 root root 4096 Jul 16 23:45 ../
    -rw------- 1 root root 1491 Jun 25 08:53 anaconda-ks.cfg
    -rw------- 1 root root 12543 Jul 18 01:23 .bash_history
    -rw-r--r-- 1 root root 24 Dec 4 2004 .bash_logout
    -rw-r--r-- 1 root root 191 Dec 4 2004 .bash_profile
    -rw-r--r-- 1 root root 395 Jul 4 11:45 .bashrc
    -rw-r--r-- 1 root root 68495 Jun 25 08:53 install.log
    -rw-r--r-- 1 root root 5976 Jun 25 08:53 install.log.syslog
    drwx------ 2 root root 4096 Jul 4 16:03 .ssh/
    -rw------- 1 root root 12613 Jul 16 23:40 .viminfo
       注意看到显示结果的第一行,知道为何我们会下达类似./command之类的指令了吧?因为./代表的是『目前目录下』的意思。

    范例三:完整的呈现档案的修改时间*(modification time)
    [root@linux ~]# ls -al --full-time ~
    total 252
    drwxr-x--- 9 root root 4096 2005-07-16 23:40:13.000000000 +0800 .
    drwxr-xr-x 24 root root 4096 2005-07-16 23:45:05.000000000 +0800 ..
    -rw------- 1 root root 1491 2005-06-25 08:53:37.000000000 +0800 anaconda-ks.cfg
    -rw------- 1 root root 12543 2005-07-18 01:23:33.000000000 +0800 .bash_history
    -rw-r--r-- 1 root root 24 2004-12-04 05:44:13.000000000 +0800 .bash_logout
    -rw-r--r-- 1 root root 191 2004-12-04 05:44:13.000000000 +0800 .bash_profile
    -rw-r--r-- 1 root root 395 2005-07-04 11:45:16.000000000 +0800 .bashrc
    -rw-r--r-- 1 root root 68495 2005-06-25 08:53:34.000000000 +0800 install.log
    -rw-r--r-- 1 root root 5976 2005-06-25 08:53:28.000000000 +0800 install.log.syslog
    drwx------ 2 root root 4096 2005-07-04 16:03:24.000000000 +0800 .ssh
    -rw------- 1 root root 12613 2005-07-16 23:40:13.000000000 +0800 .viminfo
       请仔细看,上面的『时间』字段变了,变成较为完整的格式。一般来说,ls -al仅列出目前短格式的时间,有时不会列出年份,藉由--full-time可以查阅到比较正确的完整时间格式。


    3、复制、移动与删除
    1)cp  复制档案或目录
    [root@linux ~]# cp [-adfilprsu] 来源档(source) 目的檔(destination)
    [root@linux ~]# cp [options] source1 source2 source3 .... directory
    参数:
    -a:相当于-pdr的意思;
    -d:若来源文件为连结文件的属性(link file),则复制连结文件属性而非档案本身;
    -f:为强制(force)的意思,若有重复或其它疑问时,不会询问使用者,而强制复制;
    -i:若目的檔(destination)已经存在时,在覆盖时会先询问是否真的动作!
    -l:进行硬式连结 (hard link) 的连结档建立,而非复制档案本身;
    -p:连同档案的属性一起复制过去,而非使用预设属性;
    -r:递归持续复制,用于目录的复制行为;
    -s:复制成为符号连结文件(symbolic link),亦即『快捷方式』档案;
    -u:若 destination 比 source 旧才更新 destination !
       最后需要注意的,如果来源档有两个以上,则最后一个目的文件一定要是『目录』才行!

    范例一:将家目录下的.bashrc复制到/tmp下,并更名为bashrc
    [root@linux ~]# cd /tmp
    [root@linux tmp]# cp ~/.bashrc bashrc
    [root@linux tmp]# cp -i ~/.bashrc bashrc
    cp: overwrite `basrhc'? n
       重复作两次动作,由于/tmp底下已经存在bashrc了,加上-i参数,则在覆盖前会询问使用者是否确定!可以按下n或者y。但是,反过来说,如果不想要询问时,则加上-f参数来强制直接覆盖。

    范例二:将/var/log/wtmp复制到/tmp底下
    [root@linux tmp]# cp /var/log/wtmp . <==想要复制到目前的目录,最后的 . 不要忘
    [root@linux tmp]# ls -l /var/log/wtmp wtmp
    -rw-rw-r-- 1 root utmp 71808 Jul 18 12:46 /var/log/wtmp
    -rw-r--r-- 1 root root 71808 Jul 18 21:58 wtmp
       注意到了吗?在不加任何参数的情况下,档案的所属者会改变,连权限也跟着改变了~ 这是个很重要的特性!还有,连档案建立的时间也不一样了!如果您想要将档案的所有特性都一起复制过来,可以加上-a!
    [root@linux tmp]# cp -a /var/log/wtmp wtmp_2
    [root@linux tmp]# ls -l /var/log/wtmp wtmp_2
    -rw-rw-r-- 1 root utmp 71808 Jul 18 12:46 /var/log/wtmp
    -rw-rw-r-- 1 root utmp 71808 Jul 18 12:46 wtmp_2
       整个资料特性完全一模一样ㄟ!真是不赖~这就是-a的特性。

    范例三:复制/etc/这个目录下的所有内容到/tmp底下
    [root@linux tmp]# cp /etc/ /tmp
    cp: omitting directory `/etc'    <== 如果是目录,不能直接复制,要加上-r的参数
    [root@linux tmp]# cp -r /etc/ /tmp
       -r是可以复制目录,但是档案与目录的权限会被改变~所以也可以利用cp -a /etc /tmp来下达指令。

    范例四:将范例一复制的bashrc建立一个连结档(symbolic link)
    [root@linux tmp]# ls -l bashrc
    -rw-r--r-- 1 root root 395 Jul 18 22:08 bashrc
    [root@linux tmp]# cp -s bashrc bashrc_slink
    [root@linux tmp]# cp -l bashrc bashrc_hlink
    [root@linux tmp]# ls -l bashrc*
    -rw-r--r-- 2 root root 395 Jul 18 22:08 bashrc
    -rw-r--r-- 2 root root 395 Jul 18 22:08 bashrc_hlink
    lrwxrwxrwx 1 root root 6 Jul 18 22:31 bashrc_slink -> bashrc
       那个bashrc_slink是由-s的参数造成的,建立的是一个『快捷方式』, 所以您会看到在档案的最右边,会显示这个档案是『连结』到哪里去的!至于那个 bashrc_hlink有趣了!建立了这个档案之后,bashrc与bashrc_hlink所有的参数都一样,只是,第二栏的link数改变成为2了~而不是原本的1。

    范例五:若~/.bashrc比/tmp/bashrc新才复制过来
    [root@linux tmp]# cp -u ~/.bashrc /tmp/bashrc
       这个-u 的特性,是在目标档案与来源档案有差异时才会复制的。所以比较常被用于『备份』的工作当中。

    范例六:将范例四造成的bashrc_slink复制成为bashrc_slink_2
    [root@linux tmp]# cp bashrc_slink bashrc_slink_2
    [root@linux tmp]# ls -l bashrc_slink*
    lrwxrwxrwx 1 root root 6 Jul 18 22:31 bashrc_slink -> bashrc
    -rw-r--r-- 1 root root 395 Jul 18 22:48 bashrc_slink_2
       这个例子也是很有趣,原本复制的是连结档,但是却将连结档的实际档案复制过来了,也就是说,如果没有加上任何参数时,复制的是源文件,而非连结文件的属性,若要复制连结文件的属性,就得要使用-d或者-a的参数。

    范例七:将家目录的.bashrc及.bash_history复制到/tmp底下
    [root@linux tmp]# cp ~/.bashrc ~/.bash_history /tmp
       可以将多个数据一次复制到同一个目录去。


    2)rm  移除档案或目录
    [root@linux ~]# rm [-fir] 档案或目录
    参数:
    -f:就是 force 的意思,强制移除;
    -i:互动模式,在删除前会询问使用者是否动作
    -r:递归删除啊!最常用在目录的删除了
     
    范例一:建立一档案后予以删除
    [root@linux ~]# cd /tmp
    [root@linux tmp]# cp ~/.bashrc bashrc
    [root@linux tmp]# rm -i bashrc
    rm: remove regular file `bashrc'? y
       如果加上-i的参数就会主动询问,那么如果不要询问呢?就加-f参数。

    范例二:删除一个不为空的目录
    [root@linux tmp]# mkdir test
    [root@linux tmp]# cp ~/.bashrc test/    <== 将档案复制到此目录去,就不是空的目录了
    [root@linux tmp]# rmdir test
    rmdir: `test': Directory not empty    <== 删不掉啊!因为这不是空的目录
    [root@linux tmp]# rm -rf test

    范例三:删除一个带有-开头的档案
    [root@linux tmp]# ls *aa*
    -rw-r--r-- 1 root root 0 Aug 22 10:52 -aaa-
    [root@linux tmp]# rm -aaa-
    rm: invalid option -- a
    Try `rm --help' for more information. <== 因为"-"是参数嘛!
    [root@linux tmp]# rm ./-aaa-


    3)mv  移动档案与目录或更名
    [root@linux ~]# mv [-fiu] source destination
    [root@linux ~]# mv [options] source1 source2 source3 .... directory
    参数:
    -f:force强制的意思,强制直接移动而不询问;
    -i:若目标档案(destination)已经存在时,就会询问是否覆盖!
    -u:若目标档案已经存在,且source比较新,才会更新(update)
     
    范例一:复制一档案,建立一目录,将档案移动到目录中
    [root@linux ~]# cd /tmp
    [root@linux tmp]# cp ~/.bashrc bashrc
    [root@linux tmp]# mkdir mvtest
    [root@linux tmp]# mv bashrc mvtest
       将某个档案移动到某个目录去,就是这样做!

    范例二:将刚刚的目录名称更名为mvtest2
    [root@linux tmp]# mv mvtest mvtest2 <== 这样就更名了!简单~
       其实在 Linux 底下还有个有趣的指令,名称为 rename,该指令则专职进行档案的更名。
     
    范例三:再建立两个档案,再全部移动到/tmp/mvtest2当中
    [root@linux tmp]# cp ~/.bashrc bashrc1
    [root@linux tmp]# cp ~/.bashrc bashrc2
    [root@linux tmp]# mv bashrc1 bashrc2 mvtest2
       注意到这边,如果有多个来源档案或目录,则最后一个目标文件一定是『目录』 意思是说,将所有的数据移动到该目录的意思。

    4)取得路径的文件名称与目录名称
    [root@linux ~]# basename /etc/sysconfig/network
    network <== 很简单!就取得最后的档名~
    [root@linux ~]# dirname /etc/sysconfig/network
    /etc/sysconfig <== 取得的变成目录名了


    4、档案内容查阅
    1)cat (concatenate) 由第一行开始显示档案内容

    [root@linux ~]# cat [-AEnTv]
    参数:
    -A:相当于 -vET 的整合参数,可列出一些特殊字符
    -E:将结尾的断行字符$显示出来;
    -n:打印出行号;
    -T:将[tab] 按键以^I显示出来;
    -v:列出一些看不出来的特殊字符
    范例一:检阅/etc/issue这个档案的内容
    [root@linux ~]# cat /etc/issue
    Fedora Core release 4 (Stentz)
    Kernel on an m

    范例二:承上题,顺便打印出行号
    [root@linux ~]# cat -n /etc/issue
    1 Fedora Core release 4 (Stentz)
    2 Kernel on an m

    范例三:将/etc/xinetd.conf的内容完整的显示出来(包含特殊字符)
    [root@linux ~]# cat -A /etc/xinetd.conf
    #$
    # Simple configuration file for xinetd$
    #$
    # Some defaults, and include /etc/xinetd.d/$
    $
    defaults$
    {$
    ^Iinstances = 60$
    log_type = SYSLOG authpriv$
    log_on_success^I^I= HOST PID$
    log_on_failure^I^I= HOST$
    ^Icps^I^I^I= 25 30$
    }$
    $
    includedir /etc/xinetd.d$ 
       在一般的环境中,打印出来的结果在有 [tab] 与空格键,其实看不出来,那么使用cat -A时,会将[tab]按键以^I显示,而断行字符也会显示出来,最特殊的当然就是断行字符了!这个段行字符在Linux与Windows是不一样的。在Linux是以$为断行字符,而在Windows则是以^M$为断行字符。

    2)tac  从最后一行开始显示


    3)nl  添加行号打印
    [root@linux ~]# nl [-bnw] 档案
    参数:
    -b:指定行号指定的方式,主要有两种:
    -b a:表示不论是否为空行,也同样列出行号;
    -b t:如果有空行,空的那一行不要列出行号;
    -n:列出行号表示的方法,主要有三种:
    -n ln:行号在屏幕的最左方显示;
    -n rn:行号在自己字段的最右方显示,且不加0;
    -n rz:行号在自己字段的最右方显示,且加0;
    -w:行号字段的占用的位数。
    范例一:列出/etc/issue的内容
    [root@linux ~]# nl /etc/issue
    1 Fedora Core release 4 (Stentz)
    2 Kernel on an m
       注意看,这个档案其实有三行,第三行为空白(没有任何字符),因为他是空白行,所以nl不会加上行号,如果确定要加上行号,可以这样做:
    [root@linux ~]# nl -b a /etc/issue
    1 Fedora Core release 4 (Stentz)
    2 Kernel on an m
    3
       行号加上来了,那么如果要让行号前面自动补上0呢?可这样:
    [root@linux ~]# nl -b a -n rz /etc/issue
    000001 Fedora Core release 4 (Stentz)
    000002 Kernel on an m
    000003
       自动在自己字段的地方补上0了~预设字段是六位数,如果想要改成3位数?
    [root@linux ~]# nl -b a -n rz -w 3 /etc/issue
    001 Fedora Core release 4 (Stentz)
    002 Kernel on an m
    003
       变成仅有3位数了。


    4)more  一页一页的显示档案内容
    功能键:
    空格键(space):代表向下翻一页;
    Enter :代表向下翻『一行』;
    /字符串 :代表在这个显示的内容当中,向下搜寻『字符串』;
    f:立刻显示出文件名以及目前显示的行数;
    q:代表立刻离开more ,不再显示该档案内容。


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

    6)head  取出前面几行
    [root@linux ~]# head [-n number] 档案
    参数:
    -n:后面接数字,代表显示几行的意思
    [root@linux ~]# head /etc/man.config
       预设的情况中,显示前面十行!若要显示前20行,就得要这样:
    [root@linux ~]# head -n 20 /etc/man.config


    7)tail  取出后面几行
    [root@linux ~]# tail [-n number] 档案
    参数:
    -n:后面接数字,代表显示几行的意思 
    [root@linux ~]# tail /etc/man.config
       预设的情况中,显示最后的十行!若要显示最后的20行,就得要这样:
    [root@linux ~]# tail -n 20 /etc/man.config


    8)非纯文字文件:od
    查阅非文字文件,举例来说,如/usr/bin/passwd这个执行档的内容时,可以使用od
    [root@linux ~]# 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 ;
    范例:
    [root@linux ~]# od -t c /usr/bin/passwd
    0000000 177 E L F 001 001 001
    0000020 002 003 001 260 225 004  4
    0000040 020 E 4 a (
    0000060 035 034 006 4 4 200004 
    0000100 4 200 004  340 340 005
    .....中间省略.......


    5、档案的创建
    [root@linux ~]# touch [-acdmt] 档案
    参数:
    -a:仅修订access time;
    -c:仅修改时间,而不建立档案;
    -d:后面可以接日期,也可以使用--date="日期或时间"
    -m:仅修改mtime;
    -t:后面可以接时间,格式为[YYMMDDhhmm] 
    范例一:新建一个空的档案
    [root@linux ~]# cd /tmp
    [root@linux tmp]# touch testtouch
    [root@linux tmp]# ls -l testtouch
    -rw-r--r-- 1 root root 0 Jul 19 20:49 testtouch
       注意到,这个档案的大小是0,在预设的状态下,如果touch后面有接档案,则该档案的三个时间 (atime/ctime/mtime) 都会更新为目前的时间。若该档案不存在,则会主动的建立一个新的空的档案。

    范例二:将~/.bashrc复制成为bashrc,假设复制完全的属性,检查其日期
    [root@linux tmp]# cp ~/.bashrc bashrc
    [root@linux tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
    -rwxr-xr-x 1 root root 395 Jul 4 11:45 bashrc <==这是 mtime
    -rwxr-xr-x 1 root root 395 Jul 19 20:44 bashrc <==这是 atime
    -rwxr-xr-x 1 root root 395 Jul 19 20:53 bashrc <==这是 ctime
       在这个案例当中,我们使用了;这个指令分隔符,此外,ll是 ls -l的命令别名,至于;则是同时下达两个指令,且让两个指令依序执行的意思。

    范例三:修改案例二的bashrc档案,将日期调整为两天前
    [root@linux tmp]# touch -d "2 days ago" bashrc
    [root@linux tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
    -rwxr-xr-x 1 root root 395 Jul 17 21:02 bashrc
    -rwxr-xr-x 1 root root 395 Jul 17 21:02 bashrc
    -rwxr-xr-x 1 root root 395 Jul 19 21:02 bashrc
       跟上个范例比较看,本来是19日的变成了17日了 (atime/mtime)~ 不过ctime并没有跟着改变

    范例四:将上个范例的bashrc日期改为2005/07/15 2:02
    [root@linux tmp]# touch -t 0507150202 bashrc
    [root@linux tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
    -rwxr-xr-x 1 root root 395 Jul 15 02:02 bashrc
    -rwxr-xr-x 1 root root 395 Jul 15 02:02 bashrc
    -rwxr-xr-x 1 root root 395 Jul 19 21:05 bashrc
       注意看,日期在atime与mtime都改变了,但ctime则是记录目前的时间


    6、档案的权限
    档案预设权限:umask
    档案特殊权限:SUID/SGID/Sticky Bit

    7、档案的属性
    1)chattr   设定档案隐藏属性
    [root@linux ~]# chattr [+-=][ASacdistu] 档案或目录名称
    参数:
    +:增加某一个特殊参数,其它原本存在参数则不动。
    -:移除某一个特殊参数,其它原本存在参数则不动。
    =:设定一定,且仅有后面接的参数。
    A:当设定了A这个属性时,这个档案(或目录)的存取时间atime (access)将不可被修改,可避免例如手提式计算机容易有磁盘I/O错误的情况发生!
    S:这个功能有点类似sync的功能,就是会将数据同步写入磁盘当中,可以有效的避免数据流失。
    a:当设定a之后,这个档案将只能增加数据,而不能删除,只有root才能设定这个属性。
    c:这个属性设定之后,将会自动的将此档案『压缩』,在读取的时候将会自动解压缩,但是在储存的时候,将会先进行压缩后再储存。
    d:当dump(备份)程序被执行的时候,设定d属性将可使该档案(或目录)不具有dump功能。
    i:这个i可就很厉害了,他可以让一个档案『不能被删除、改名、设定连结也无法写入 或新增资料!』对于系统安全性有相当大的帮助。
    j:当使用ext3档案系统格式时,设定j属性将会使档案在写入时先记录在journal中,但是当filesystem设定参数为data=journalled时,由于已经设定了日志,所以这个属性无效。
    s:当档案设定了s参数时,他将会被完全的移除出这个硬盘空间。
    u:与s相反的,当使用u来设定档案时,则数据内容其实还存在磁盘中,可以使用来undeletion。
    注意:这个属性设定上面,比较常见的是a与i的设定值,而且很多设定值必须要身为root才能够设定的。
    范例:
    [root@linux ~]# cd /tmp
    [root@linux tmp]# touch attrtest
    [root@linux tmp]# chattr +i attrtest
    [root@linux tmp]# rm attrtest
    rm: remove write-protected regular empty file `attrtest'? y
    rm: cannot remove `attrtest': Operation not permitted
       看到了吗?连root也没有办法将这个档案删除,赶紧解除设定。
    [root@linux tmp]# chattr -i attrtest


    2)lsattr  显示档案隐藏属性
    [root@linux ~]# lsattr [-aR] 档案或目录
    参数:
    -a:将隐藏文件的属性也秀出来;
    -R:连同子目录的数据也一并列出来!
    范例:
    [root@linux tmp]# chattr +aij attrtest
    [root@linux tmp]# lsattr
    ----ia---j--- ./attrtest 


    3)file   档案类型
    [root@linux ~]# file ~/.bashrc
    /root/.bashrc: ASCII text    <== 告诉我们是ASCII的纯文字文件啊!
    [root@linux ~]# file /usr/bin/passwd
    /usr/bin/passwd: setuid ELF 32-bit LSB executable, Intel 80386,version 1
    (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), stripped
       数据可多了~包括这个日Set UID 2的档案,使用shared libs, 适合于Intel的386以上机种的硬件。
    [root@linux ~]# file /var/lib/slocate/slocate.db
    /var/lib/slocate/slocate.db: data    <== 这是data档案!


    8、档案的搜寻
    1)which    寻找『执行档』
    [root@linux ~]# which [-a] command
    参数:
    -a:将所有可以找到的指令均列出,而不止第一个被找到的指令名称
    范例:
    [root@linux ~]# which passwd
    /usr/bin/passwd
    [root@linux ~]# which traceroute -a
    /usr/sbin/traceroute
    /bin/traceroute


    2)whereis   寻找特定档案
    [root@linux ~]# whereis [-bmsu] 档案或目录名
    参数:
    -b: 只找 binary 的档案
    -m: 只找在说明文件 manual 路径下的档案
    -s: 只找 source 来源档案
    -u: 没有说明档的档案!
    范例:
    [root@linux ~]# whereis passwd
    passwd: /usr/bin/passwd /etc/passwd /etc/passwd.OLD
    /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
       任何与passwd有关的档名都会被列出来。
    [root@linux ~]# whereis -b passwd
    passwd: /usr/bin/passwd /etc/passwd /etc/passwd.OLD
    [root@linux ~]# whereis -m passwd
    passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz


    3)locate
    [root@linux ~]# locate filename
    [root@linux ~]# locate passwd
    /lib/security/pam_passwdqc.so
    /lib/security/pam_unix_passwd.so
    /usr/lib/kde3/kded_kpasswdserver.so
    /usr/lib/kde3/kded_kpasswdserver.la
    .......中间省略.......


    4)find
    [root@linux ~]# find [PATH] [option] [action]
    参数:
    4.1.与时间有关的参数
    -atime n:n 为数字,意义为在 n 天之前的『一天之内』被access过的档案;
    -ctime n:n 为数字,意义为在 n 天之前的『一天之内』被change过状态的档案;
    -mtime n:n 为数字,意义为在 n 天之前的『一天之内』被modification过的档案;
    -newer file:file 为一个存在的档案,意思是说,只要档案比file还要新就会被列出来~

    4.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搜寻。

    4.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.4.额外可进行的动作
    -exec command:command为其它指令,-exec后面可再接额外的指令来处理搜寻到的结果。
    -print:将结果打印到屏幕上,这个动作是预设动作!

    范例一:将过去系统上面24小时内有更动过内容(mtime)的档案列出
    [root@linux ~]# find / -mtime 0
       0是重点,代表目前的时间,所以,从现在开始到 24 小时前,有变动过内容的档案都会被列出来。那如果是三天前的 24 小时内? find / -mtime 3 ,意思是说今天之前的3*24~4*24小时之间有变动过的档案都被列出的意思,同时-atime与-ctime的用法相同。

    范例二:寻找/etc底下的档案,如果档案日期比/etc/passwd新就列出
    [root@linux ~]# find /etc -newer /etc/passwd
       -newer 用在分辨两个档案之间的新旧关系是很有用的。

    范例三:搜寻/home底下属于dmtsai的档案
    [root@linux ~]# find /home -user dmtsai
       这个东西也很有用的~当我们要找出任何一个使用者在系统当中的所有档案时,就可以利用这个指令将属于某个使用者的所有档案都找出来。

    范例四:搜寻系统中不属于任何人的档案
    [root@linux ~]# find / -nouser
       透过这个指令,可以轻易的就找出那些不太正常的档案。如果有找到不属于系统任何人的档案时,那有时候是正常的~尤其是您曾经以原始码自行编译软件时。

    范例五:找出档名为passwd这个档案
    [root@linux ~]# find / -name passwd
       利用这个-name可以搜寻档名啊!
     
    范例六:搜寻档案属性为f(一般档案)的档案
    [root@linux ~]# find /home -type f
       这个-type的属性也很有帮助,尤其是要找出那些特殊的档案,例如socket与FIFO档案,可以用find /var -type p或-type s来找!

    范例七:搜寻档案当中含有SGID/SUID/SBIT的属性
    [root@linux ~]# find / -perm +7000
       所谓的7000就是 ---s--s--t,那么只要含有s或t的就列出,所以当然要使用 +7000 ,使用-7000表示要含有---s--s--t的所有三个权限,因此就是+7000。

    范例八:将上个范例找到的档案使用ls -l列出来~
    [root@linux ~]# find / -perm +7000 -exec ls -l {} ;
       注意到,那个 -exec 后面的 ls -l 就是额外的指令,而那个{}代表的是『由 find 找到的内容』的意思~所以,-exec ls -l {}就是将前面找到的那些档案以ls -l 列出长的数据!至于 ; 则是表示-exec的指令到此为止的意思~意思是说,整个指令其实只有在-exec (里面就是指令下达); 也就是说-exec最后一定要以;结束才行。

    范例九:找出系统中大于1MB的档案
    [root@linux ~]# find / -size +1000k

  • 相关阅读:
    程序设计思维与实践 Week5 作业 (3/4/数据班)
    程序设计思维与实践 Week6 作业 (3/4/数据班)
    Effective C++笔记(更新中...)
    二叉树的序列化与反序列化
    矩阵乘法的顺序安排问题 Python简单实现
    Python 读写Excel文件 总结
    2019美赛D题 人员疏散模型Python编程
    函数绘图语言 西电编译原理大作业
    洛谷试炼场 动态规划专练
    2019 IEEEXtreme 13.0 Impact Factor 影响因子
  • 原文地址:https://www.cnblogs.com/defias/p/3427190.html
Copyright © 2020-2023  润新知