一、一切皆文件

   linux下“一切皆文件”,不仅数据被组织成文件形式,连各种设备资源也被抽象成了文件形式,而对文件只有read、write、open、close几种操作,这样便统一了用户对各种资源的访问方式,简化了操作。


二、文件类型

   普通文件(-,f)、目录文件(d)、符号链接文件(l)、设备文件( 字符设备c,块设备b)、命名管道(p)、套接字文件(s)

   查看文件类型file /path/to/somefile...,可同时查看多个文件的类型,中间用空格相隔

   以下当我们将文件和目录并称时,一般指狭义上的“文件”


三 、如何指定一个文件或目录

    linux使用层次化结构表示文件路径,一个目录就是一个名称空间,同一目录下文件不能同名。指定一个文件或目录有绝对路径相对路径两种方式:

      绝对路径:从顶级名称空间(即根)起始标记的路径,例如/home/tesla/test

        每个绝对路径由基名(由命令basename获悉)和目录名(由dirname获悉)组成,以/home/tesla/test为例,其基名为test,目录名为/home/tesla

      相对路径:相对于当前目录而言的路径,例如../test

    几种独特的路径表示

      .:当前目录

      ..:上一级目录

      -:前一个工作目录

      ~:当前使用者的家目录

                

四、与目录相关的操作

   1、cd:切换至指定目录

     用法:cd DirName

     cd ~username:切换至指定用户的家目录

   2、pwd:以绝对路径的方式打印当前工作目录

   3、mkdir:创建目录

     用法:mkdir [option]... DIR...(多同时创建多个目录,用空格隔开)

     常用选项:

        -p:一次创建多个层次目录,如mkdir /temp/a/b/

        -m:创建目录的同时设置目录的权限,如mkdir -m 740 /temp/a

   4、rmdir:删除指定的空目录

     用法:rmdir [option]... DIR...

     常用选项:

        -p:删除指定目录及其上级目录

          注意:要删除的目录必须为空,使用-p选项一次删除多个层级空目录,直至不空的目录为止。例如rmdir -p /temp/a/b/c,若目录b,c为空,a不空,则会删除b,c,保留a

   5、tree:以树状图显示目录层级结构,该程序需额外安装

     常用选项:

        -d:显示目录名称而非内容

        -L #:只显示#层目录

        -a:显示所有目录和文件

[root@localhost ~]# tree -d /lib64
/lib64
├── dbus-1
├── device-mapper
├── rsyslog
├── rtkaio
├── security
│   ├── pam_filter
│   └── pam_krb5
├── tls
└── xtables

9 directories


五、文件与目录管理

  • 查看文件内容:

   1)cat:连接并显示文本文件内容

     用法:cat [option]... FILE...,可同时显示多个文本文件,以空格隔开

     常用选项:

        -n:显示行号

        -E:显示行结束符

   2)tac:逆序显示文本文件内容

   3)nl:添加行号打印文本文件内容

   4)head:用于显示文件的开头的内容。在默认情况下显示文件的头10行内容。

     常用选项:

        -n [-]#:显示前#行内容,若有加-则显示除最后#行外的其他内容

        -c [-]#: 显示文件的前#个字节的内容

     如head -n 3 /etc/inittab /etc/passwd

   5)tail:类似于head,只是tail是显示文件尾部的内容

     常用选项:

        -n [+]#:显示最后#行内容,如果有+则从文件开头的第#项开始显示

        -f:使tail一直显示尾部,因此有实时监视的效果,ctrl+c退出

   6)lessmore:这两个命令均用于分屏显示文本文件内容,不同的是less命令允许向前或向后浏览,而more命令只能向前浏览。用less命令显示文件时,用PageUp键向上翻页,用PageDown键向下翻页。退出按q键。在用less或more查看文本文件内容时,也可搜索字串,方法同vim字串搜索


  • 查看文件或目录状态信息

     stat:用于显示文件或目录的状态信息,包括文件大小,块数,inode号,权限,时间戳等,比ls命令更详细

     用法:stat [option]... FILE...

     时间戳Access、Modify、Change的含义:

             Access文件最后一次被访问的时间

             Modify:文件内容最后一次被修改的时间,例如被vim编辑过后该时间会更新

             Change:文件状态最后一次改变的时间,例如移动,修改权限、属主、属组等均会引起该值改变

    通常modify操作也会引起Access和Change更新

[tesla@localhost ~]$ stat test/init
  File: `test/init'
  Size: 884       	Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d	Inode: 131172      Links: 1
Access: (0644/-rw-r--r--)  Uid: (  501/   tesla)   Gid: (  501/   tesla)
Access: 2015-10-01 09:18:06.768163964 +0800
Modify: 2015-10-01 09:18:06.768163964 +0800
Change: 2015-10-01 09:18:39.550391159 +0800
[tesla@localhost ~]$ vim test/init
[tesla@localhost ~]$ stat test/init
  File: `test/init'
  Size: 824       	Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d	Inode: 145404      Links: 1
Access: (0644/-rw-r--r--)  Uid: (  501/   tesla)   Gid: (  501/   tesla)
Access: 2015-10-01 09:19:42.763840959 +0800
Modify: 2015-10-01 09:19:42.763840959 +0800
Change: 2015-10-01 09:19:42.764840957 +0800
[tesla@localhost ~]$

     

  • 复制文件或目录:

   cp: 用来将一个或多个源文件或者目录复制到指定的目的文件或目录

   用法:cp [option]... SRC... DEST

   常用选项:

      -a:相当于-dpr,实际上是存档

      -d:当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录

      -f:强行覆盖

      -i:交互式操作,复制前询问

      --preserve=[ATTR_LIST]:指定保留原文件或目录的哪些属性,ATTR_LIST为mode,ownership,timestamps

      -p:保留原文件或目录的属性,相当于--preserve=mode,ownership,timestamps

      -P:复制符号链接本身

      -r/R:递归复制目录及其子目录内的所有内容

    关于cp命令的几点说明:

      1)SRC是文件,如果DEST不存在,复制SRC为DEST;如果DEST存在:1、如果DEST是文件,则覆盖 2、如果DEST是目录,将SRV复制进DEST中,并保持原名

      2)如果SRC不止一个,则DEST必须是目录

      3)cp默认情况下不复制目录,若要复制目录,可使用选项-r

      4)复制后的新文件属主默认为执行该操作的用户,可使用--preserve或-p选项保留原属性

      5)如果复制的是一个符号链接文件,则会将该链接文件所指向的文件复制,且保留符号链接的名字。如果想复制符号链接文件本身,可使用选项-P


  • 移动和删除

   1)mv:将源文件(或目录)重命名为目标文件,或将源文件移动至指定目录。

     用法:mv [option]... SRC... DEST

     常用选项:

        -b:当目标文件存在时,覆盖前,为其创建一个备份

        -i:移动前询问

        -f:强制覆盖,覆盖前不询问 

        -u:当源文件比目标文件新或者目标文件不存在时,才执行移动操作

      若源文件有多个,则目标文件必须是目录

    2)rm:删除文件或目录

      用法:rm [option]... FILE...

      常用选项:

        -i:删除前询问

        -f:强制删除,删除前不询问

        -r/R:递归处理,将指定目录下的所有文件与子目录一并处理

      rm默认不删除目录,使用-r选项可删除目录及其下所有内容

[tesla@localhost ~]$ cp /etc/{rc.local,inittab} test
[tesla@localhost ~]$ cp /etc/rc.local ./
[tesla@localhost ~]$ mv -b rc.local test/ 
[tesla@localhost ~]$ ls test
inittab  rc.local  rc.local~
[tesla@localhost ~]$ rm -irv test
rm: descend into directory `test'? y
rm: remove regular file `test/rc.local~'? y
removed `test/rc.local~'
rm: remove regular file `test/inittab'? y
removed `test/inittab'
rm: remove regular file `test/rc.local'? y
removed `test/rc.local'
rm: remove directory `test'? y
removed directory: `test'


  • 创建文件:

   除了可以通过复制现有文件或使用编辑器(如vim))直接编辑生成新文件之外,还可以通过touch命令创建一个空文件

   touch命令有两个功能:一是创建新的空文件;二是将已存在文件的访问时间和修改时间更新为系统当前的时间,而它们的数据不变

   用法:touch [option]... FILE...

   常用选项:

      -a:只更改访问时间

      -d,--date=字符串:使用指定字符串表示时间替代当前时间

      -m:只更新修改时间

      -t:使用[[CC]YY]MMDDhhmm[.ss] 格式的时间替代当前时间

         -r,--reference=file使用指定文件的时间属性替代当前时间

tesla@localhost ~]$ ls test/
init
[tesla@localhost ~]$ touch test/terminate
[tesla@localhost ~]$ touch -mt 10010830 test/terminate
[tesla@localhost ~]$ stat test/terminate
  File: `test/terminate'
  Size: 0         	Blocks: 0          IO Block: 4096   regular empty file
Device: 802h/2050d	Inode: 145388      Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  501/   tesla)   Gid: (  501/   tesla)
Access: 2015-10-01 10:05:22.332344736 +0800
Modify: 2015-10-01 08:30:00.000000000 +0800
Change: 2015-10-01 10:05:33.662422730 +0800


  • 其它文本文件处理工具

   1)wc:统计指定文件中的字节数、单词数、行数, 并显示出来

     用法:wc [option]... FILE...

     常用选项:

        -l:统计行数

        -c:统计字节数

        -m: 统计字符数

        -w:统计单词数

        -L: 打印最长行的长度

   2)cut:该命令有两个功能,一是在文件中的每一行提取指定片断,并显示在标准输出上,二是连接两个或多个文件,如cut file1 file2 > file3,将file1和file2的内容合并再输出至file3中

     用法:cut [option]... FILE...

     常用选项:

        -b:仅显示行中指定范围的字节

        -c:仅显示行中指定范围的字符 

        -d:指定分隔符默认为制表符),分隔符必须是单个字符,例如要指定空格为分隔符可写为-d ' '

        -f:指定要显示的字段(以列为单位),如-f1,5表示第1、第5字段,-f1-5表示第1到第5之间的字段,-f与-d结合使用

[tesla@localhost ~]$ wc /etc/passwd /etc/inittab
  33   51 1590 /etc/passwd
  26  149  884 /etc/inittab
  59  200 2474 total
[tesla@localhost ~]$ cut -d: -f1 /etc/passwd /etc/inittab > /tmp/initpas
[tesla@localhost ~]$ head -n 3 /tmp/initpas
root
bin
daemon
[tesla@localhost ~]$ wc -l  /tmp/initpas
59 /tmp/initpas

   3)sort:将文件内容进行排序。以行为单位,从首字符开始,依次按ASCII码值进行比较,最后将按升序输出,注意,sort并不实际改变文件内容

     用法:sort [option]... FILE...

     常用选项:

        -f:忽略字符大小写

        -t:指定分隔符

        -k:指定分隔符后要进行排序的字段

        -n:指明以数值大小进行排序,sort默认是以字符来排序的 

        -u:排序后去重(注意:相同且相邻的行才算重复)

        -r:降序输出结果

        -o:将排序后的结果写入到文件,而非标准输出

[tesla@localhost ~]$ cat /tmp/sortest
distribute:80
describe:5
attribute:35
literature:100
Alter:11
attribute:35
consist:20
[tesla@localhost ~]$ sort /tmp/sortest
Alter:11
attribute:35
attribute:35
consist:20
describe:5
distribute:80
literature:100
[tesla@localhost ~]$ sort -u -t : -k 2 /tmp/sortest
literature:100
Alter:11
consist:20
attribute:35
describe:5
distribute:80
[tesla@localhost ~]$ sort -u -t : -k 2 -n /tmp/sortest
describe:5
Alter:11
consist:20
attribute:35
distribute:80
literature:100
[tesla@localhost ~]$ sort -u -t : -k 2 -n /tmp/sortest -o /tmp/sortest
[tesla@localhost ~]$ cat /tmp/sortest
describe:5
Alter:11
consist:20
attribute:35
distribute:80
literature:100

   4)uniq去重后显示文件内容

     用法:uniq [option]...  FILE...

     常用选项:

        -c:在每行旁边显示该行出现的次数

        -d:仅显示重复出现的行

        -u:仅显示出没有重复的行

     相同且相邻的行才算重复

[root@localhost ~]# cat /tmp/sortest
describe:5
Alter:11
consist:20
consist:20
attribute:35
Alter:11
[root@localhost ~]# uniq -c /tmp/sortest
      1 describe:5
      1 Alter:11
      2 consist:20
      1 attribute:35
      1 Alter:11


  • 修改文件或目录属性

   1)修改文件权限,见博客http://9124573.blog.51cto.com/9114573/1698033                  

   2)chown:修改文件或目录的属主和属组,指定属主和属组使用名称或ID均可

     用法:chown [-R] [--reference=somefile] user[:group或.group] file...

     常用选项:

        --reference=somefile:参照指定文件的属主属组设定目标文件的属主属组

        -R:递归处理

     示例:chown -R tesla /tmp/test 

         chown tesla:science /tmp/elec  #将elec的属主和属组分别修改为tesla和science

         chown :science /tmp/elec  #作用等同于chgrp science /tmp/elec

         chown --reference=/tmp/future /tmp/past

   3)chgrp:修改文件或目录的属组

     用法同chown类似,不再赘述

     注意:只有root用户才能修改文件属主和属组

   4)chattr:给文件或目录设置隐藏属性

     用法:chattr [+|-] [特殊属性] FILE...

         +:表示增加特殊属性

         -:表示移除特殊属性

         = :更新为指定参数

     常用特殊属性:

        A:访问文件后,其atime不会改变。由此减少了频繁I/O对性能的损耗

        a:设置a之后,该文件(或目录)将只能增加内容,不能删除或更改原有内容,只有root用户能够设置该属性

        i:该属性使文件(或目录)不能被删除、更名、写入、设定链接,只有root用户能够设置

        s:如果文件被删,将会被完全从磁盘上移除,无法恢复

        u:如果文件被删,其内容仍保存于磁盘上,可以恢复

      例:锁定系统关键文件:

        chattr +i /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/inittab

    5)lsattr:显示文件的隐藏属性                       

      用法:lsattr [option]... FILE...

      选项:

         -a:将隐藏文件的特殊属性也显示出来

         -d:仅显示目录自身的特殊属性

         -R:递归处理,边同目录下所有文件和子目录一并显示

[root@localhost tesla]# lsattr test/*
-----a-------e- test/inittab
-------------e- test/passwd
[root@localhost tesla]# rm -f test/inittab
rm: cannot remove `test/inittab': Operation not permitted
[root@localhost tesla]# echo "hello" > test/inittab
-bash: test/inittab: Operation not permitted
[root@localhost tesla]# echo "hello" >> test/inittab
[root@localhost tesla]# echo $?
0
[root@localhost tesla]# chattr +a test
[root@localhost tesla]# lsattr -d test
-----a-------e- test
[root@localhost tesla]# cp /etc/rc.local test/
[root@localhost tesla]# ls test
inittab  passwd  rc.local
[root@localhost tesla]# rm -f test/passwd
rm: cannot remove `test/passwd': Operation not permitted


  • 命令和文件的查找

   1)which:通过遍历PATH环境变量所保存的目录用于查找并显示给定命令的绝对路径

     用法:which [选项] [参数]

     常用选项:

        -a:查找全部内容,而非第一个文件,因which默认是搜索到第一个目标文件后就停止

[root@localhost tesla]# which ls find
alias ls='ls --color=auto'
	/bin/ls
/bin/find

    2)whereis:用来定位二进制程序、源代码文件和man手册页等相关文件的路径

      用法:whereis [选项]... [参数]...

      常用选项:

        -b:只查找二进制文件

        -m:只定位帮助文件

        -s:只定位源代码文件

[root@localhost tesla]# whereis ssh ftp
ssh: /usr/bin/ssh /etc/ssh /usr/share/man/man1/ssh.1.gz
ftp: /usr/bin/ftp /usr/share/man/man1/ftp.1.gz

   3)locate:查找文件或目录,非实时非精确查找,速度快。不搜索具体目录,而是根据索引(/var/lib/mlocate/mlocate.db)查找,该索引由系统创建并在系统空闲时自动更新,也可手动使用updatedb命令更新。索引构建很占资源。

     例:locate -i /etc/rc  #搜索/etc目录下所有以rc开头的文件,忽略字符大小写

   4)find:查找文件或目录,实时精确查找,速度慢,因为要遍历所有文件进行条件匹配

     用法:find [option]... [查找路径] [查找条件] [处理动作]

     查找路径 :默认为当前目录,find后可接多个目录

     查找条件:默认为指定路径下的所有文件

        -name "文件名":支持使用通配符

        -iname"文件名":查找时忽略字符大小写

        -user USERNAME:根据文件属主查找

        -group GROUPNAME

        -uid UID:删除某用户后,原来属主为该用户的文件其属主会变成该用户的ID号,因此可使用-uid作为查找条件找到这些文件

        -gid GID

        -nouser:查找没有属主的文件

        -nogroup

        -type TYPE:根据文件类型查找

        -size [+|-]#UNIT:根据文件大小查找 ,常用单位有K,M,G   

            #UNIT:#-1<x<=#

            -#UNIT:x<=#-1

            +#UNIT:x>#                              

        -atime [+|-]N:根据时间戳查找,以“天”为单位,另外,还有mtime,ctime。amin/mtime/ctime表示以“分钟”为单位                   

            N:N<=x<N+1

            -N:x<N   今天到N天之间的

            +N:x>=N+1   N天之前的

        -mtime [+|-]N:根据修改时间查找

        -perm [+|-]MODE:根据权限查找

            MODE:与MODE精确匹配

            +MODE:只要能包含指定的任意一类用户的任意一位权限即可,例如权限为-w--w--w-的文件符合条件-perm -446

            -MODE:为每类用户指定的每一位权限都要能够被包含

        -maxdepth: 查找最大目录层数


        组合条件查找

           -a:与。例,find /etc -iname "p*" -a -user root  查找etc目录下以p开头且属主为root的文件

           -o:或

          !/-not:非。例,find /tmp -not \( -iname "*r*" -o -user gentoo \)   查找tmp目录下文件名不包含r且属主不为gentoo的文件                        

        处理动作:默认显示至屏幕

           -print:显示

           -ls:类似于ls -l

           -exec COMMAND {} \;  # {}代表由find找到的内容;-exec到\;是关键字,代表处理动作的开始与结束

           -ok COMMAND {} \;  相当于交互式exec

           find一次性查找符合条件的所有文件,并一同传递给-exec或-ok后面指定的命令,但有些命令无法接受过长的参数,此时可使用find 条件 | xargs COMMAND(xargs:把其他命令给它的数据传递给它后面的命令作为参数),例如find /tmp -iname "*test*" | xargs rm -f


六、find使用示例

  1、查找/var目录属主为root,且属组为mail的所有文件;

[root@localhost ~]# find /var -user root -a -group mail
/var/spool/mail

  2、查找/usr目录下不属于root、bin和hadoop的所有文件;

[root@localhost ~]# find /usr ! \( -user root -o -user bin -o -user hadoop \)
/usr/libexec/abrt-action-install-debuginfo-to-abrt-cache

  3、查找/etc目录下最近一周内其内容修改过,且属主不为root、hadoop的所有文件;

[root@localhost ~]# find /etc -mtime -7 -a ! \( -user root -o -user hadoop \)
[root@localhost ~]#

  4、查找当前系统上没有属主或属组,且最近一周内曾被访问过的所有文件;

[root@localhost ~]# find / -atime -7 -a \( -nouser -o -nogroup \)
find: `/proc/9323/task/9323/fd/5': No such file or directory
find: `/proc/9323/task/9323/fdinfo/5': No such file or directory
find: `/proc/9323/fd/5': No such file or directory
find: `/proc/9323/fdinfo/5': No such file or directory

  5、查找/etc目录下大于20k且类型为普通文件的所有文件;

[root@localhost ~]# find /etc -size +20k -a -type f 
/etc/prelink.cache
/etc/pki/tls/certs/ca-bundle.crt
/etc/pki/tls/certs/ca-bundle.trust.crt
...

  6、查找/etc目录下所有用户都没有写权限的文件;

[root@localhost ~]# find /etc ! -perm +222 -ls
133044    4 -r--r--r--   1 root     root          146 Aug 17  2013 /etc/pam.d/cups
131339  308 -r--r--r--   1 root     root       314336 Aug  6 04:52 /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt
131342  184 -r--r--r--   1 root     root       185023 Aug  6 04:52 /etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem
131340  228 -r--r--r--   1 root     root       232342 Aug  6 04:52 /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
131341  184 -r--r--r--   1 root     root       185220 Aug  6 04:52 /etc/pki/ca-trust/extracted/pem/email-ca-bundle.pem
131343  172 -r--r--r--   1 root     root       172980 Aug  6 04:52 /etc/pki/ca-trust/extracted/java/cacerts
133042    4 -r--r--r--   1 root     root          460 Aug 17  2013 /etc/dbus-1/system.d/cups.conf
145410    4 ----------   1 root     root         1177 Oct  1 23:55 /etc/shadow
145406    4 ----------   1 root     root          675 Oct  1 23:55 /etc/gshadow
131109    4 ----------   1 root     root         1148 Oct  1 20:46 /etc/shadow-
144046    4 -r--r-----   1 root     root         4002 Mar  2  2012 /etc/sudoers
142606    4 -r-xr-xr-x   1 root     root         2134 Nov 24  2013 /etc/rc.d/init.d/lvm2-lvmetad
142607    4 -r-xr-xr-x   1 root     root         2665 Nov 24  2013 /etc/rc.d/init.d/lvm2-monitor
142605    4 -r-xr-xr-x   1 root     root         1340 Nov 24  2013 /etc/rc.d/init.d/blk-availability
131101    4 ----------   1 root     root          664 Oct  1 20:46 /etc/gshadow-
138423    4 -r--r--r--   1 root     root          324 Nov 22  2013 /etc/ld.so.conf.d/kernel-2.6.32-431.el6.x86_64.conf

  7、查找/etc目录下至少有一类用户没有执行权限的文件;

[root@localhost ~]# find /etc ! -perm -111 -ls
...
131115  628 -rw-r--r--   1 root     root       641020 Oct  2  2013 /etc/services
140932    4 -rw-r--r--   1 root     root         1117 Nov 12  2010 /etc/pcmcia/config.opts
131094    4 -rw-r--r--   1 root     root         1512 Jan 12  2010 /etc/aliases
...

  8、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户拥有写权限的文件;

[root@localhost ~]# find /etc/init.d -perm -113
/etc/init.d