chap7Linux文件与目录管理

  • 特殊目录记号
    • .:代表此层目录
    • ..:代表上层目录
    • -:代表前一个工作目录
    • ~:代表目前用户的主文件夹
    • ~aaa:代表用户aaa的主文件夹
    •  
    • 所有目录下都存在“.”和“..”这两个目录
    • 根目录下的“.”和“..”都是根目录自己
  • 目录相关的命令
    • 工作目录切换(Change Directory):cd
      • 基本语法:cd Path
        • Path可以是绝对路径也可以是相对目录,也可以带有特殊目录记号
        • 使用相对路径时,你的目前路径必须清楚确定
      • Path省略时,相当于切换到自己的主文件夹下
        • 即“cd”等价于“cd ~”
    • 显示当前所在目录(Print Working Directory):pwd
      • 基本语法:pwd [-P]
        • -P:若为连接文件,显示目标路径,而非连接文件的路径
    • 新建目录(MaKe DIRectory):mkdir
      • 基本语法:mkdir [-mp] 目录名称
        • -m xyz:自定义目录的权限,不采用默认权限(xyz为权限分数属性)
          • 如:mkdir -m 711 test
        • -p:递归创建不存在的上层目录
          • 如:mkdir -p test1/test2/test3/test4
            • 已存在目录test1,但不存在子目录test2,更别说test3
            • 加入该参数后,会逐层创建test2,test3,test4
            • 若不加入该参数则会报错“No such file or directory”,只能逐层手动创建
          • 并且,该目录本来就存在时,也不会报错
          • 注意:不建议随便使用这个参数,万一打错字,目录会变得乱七八糟
    • 删除“空”目录(ReMove DIRectory):rmdir
      • 基本语法:rmdir [-p] 目录名称
        • -p:连同上层的“空”目录也删除
      • 若要删除非空目录,需要采用“rm -r 目录名称”命令,但是rmdir更为安全
  • 执行文件目录的变量:$PATH
    • $是变量的标志
    • 执行命令时,系统会依照PATH变量下的路径去查找与命令同名的可执行文件,只执行查询到的第一个文件
    • PATH必须是大写
    • 该变量是由一堆目录组成的,每个目录以冒号“:”为分隔符,有顺序之分
    • 我们可以通过echo命令,打印出PATH变量的内容
    • 一般情况下,root用户包含/bin和/sbin,而一般用户只有/bin
      • (root):/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin
      • (一般):/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/zk/bin
    • 对于PATH没有给出的命令目录
      • 可以自行给定命令的路径
        • 如:/root/ls -l
      • 也可以把路径加入到PATH中
        • 如:PATH="$PATH":/root
      • 也就是说,一般用户也能去访问/sbin下的命令
    • 为了安全起见,“.”(当前目录)不宜加入PATH中
    • 指定路径直接执行命令文件,比查询PATH要准确
    • 命令应该放置到正确目录下,执行才方便
  • 文件与目录管理命令
    • 查看文件与目录(LiSt):ls
      • 基本语法:ls [-aAdfFhilnrRSt] [--color={never,auto,always}] [--full-time] dirname/filename
        • 不同类型的参数必须用空格隔开
        • 参数不讲究顺序,先写哪个都行
        • dirname/filename省略表示为当前工作目录
        • -a:全部文件,连同隐藏文件都列出来(常用)
        • -A:列出全部文件除了”.“和”..“这两个目录
        • -d:只列出目录本身,而不列出目录下的文件数据(常用)
        • -f:直接列出结果,不进行排序(默认以文件名排序)
        • -F:根据文件、目录等信息给予附加数据结构(于文件名末尾)
          • *:代表可执行文件
          • /:代表目录文件
          • =:代表socket文件
          • |:代表FIFO文件
          • @:代表连接文件
        • -h:将文件容量以易读的方式(GB,KB等)列出
        • -i:列出i-node号码
        • -l:列出长数据串,包含文件的属性与权限等数据(常用)
        • -n:用UID和GID取代用户名和用户组名
        • -r:将排序结果反向输出
        • -R:递归,连同子目录下的所有文件都显示出来
        • -S:(注意是大写)以文件容量大小排序
        • -t:以时间排序
        •  
        • --color=never:不要依据文件特性给予颜色显示
        • --color=always:显示颜色
        • --color=auto:让系统自行依据设置来判断(= =判断规则不明……)
        • 蓝色为目录,青色为连接文件,白色为一般文件
        •  
        • --full-time:完整显示时间
        • --time={atime, ctime}:将显示的时间修改为atime或ctime(默认为mtime)
      • 默认设置:非隐藏文件、以文件名排序、文件名代表的颜色显示
      • 很多distribution在默认情况下,把”ll“(L的小写)作为”ls -l“的命令别名
      • 示例:ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
        • 表示显示文件bashrc的三个文件时间
        • 分号“;”表示连续命令,一行可以加入多个命令,依序执行
    • 复制、创建连接文件(copy):cp
      • 基本语法1:cp [-adfilprsu] source destination
        • 把source复制为destination
      • 基本语法2:cp [-adfilprsu] source1 source2 source3 ...... directory
        • 把source1等复制到directory下,该格式下的最后一个目的文件必须是目录!!!
      •  
        • -a:相当于-pdr,完整复制原文件的属性(包括完整目录、连接文件、其他文件)(常见)
        • -d:若源文件为连接文件,则复制连接文件的属性而非目标文件
          • 不加入该参数,就相当于复制连接的目标文件,而不是连接文件本身
        • -f:(force)若目标文件已存在而无法开启,则删除后重试
        • -i:若目标文件存在,覆盖前会进行询问(常见)
        • -l:进行硬连接的连接文件创建
        • -p:连同文件属性一同复制而不采用默认属性(备份常见)
        • -r:递归,用于目录复制(常见)
        • -s:创建符号连接文件,即”快捷方式“
        • -u:若destination比source旧时才更新destination
        •  
        • 如:cp /var/log/wtmp .    想要复制到当前目录,最后的”.“不能少!
      • 不同身份执行该命令会产生不同结果,尤其是-a和-p参数
      • 执行该命令时,你必须要有source的r权限,和目标目录的w权限
      • 默认条件下,cp的源文件和目的文件权限是不同的,目的文件的所有者常常是命令操作者本身
      • 权限、属性的复制必须在操作者权限范围内
        • 例如一般用户不能把onwer和group都是root的文件属性复制下来
      • 复制文件时需要考虑:
        • 1、是否需要完整保留来源文件的信息(-a)
        • 2、是否为软连接文件(-d)
        • 3、是否为特殊文件,如FIFO、socket等
        • 4、是否为目录
    • 移除文件和目录(remove):rm
      • 基本语法:rm [-fir] dirname/filename
        • -f:(force)忽略不存在的文件,不报错
        • -i:互动模式,删除前会询问用户
          • 若为root用户,会默认加入该参数,防止误删
            • 若仍要跳过询问,可以在命令前加上反斜杠,即”\rm“来忽略alias指定参数
        • -r:递归,删除整个目录
          • 这个参数非常危险!!尽量只用rmdir命令删除空目录
      • 示例1:rm -i bashrc*
        • *是通配符,表示0到无穷多个任意字符
        • 即删除bashrc, bashrc_1, bashrc_2等文件
      • 示例2:rm ./-aaa-
        • 如果文件名开头是-,系统会将该文件名作为参数
        • 此时应加上./表明这是个文件而不是命令
        • 另外,也可以采用“rm -- -aaa-”的方式删除开头为-的文件
    • 移动文件和目录、重命名(move):mv
      • 基本语法1:mv [-fiu] source destination
        • 将source移动到destination下
        • 若为同一目录下,相当于重命名
      • 基本语法2:mv [-fiu] source1 source2 source3 ...... directory
        • 将source1等文件移动到directory目录下
        • 最后一个文件名必须是目录!!!
      •  
        • -f:(force)如果目标已存在,直接覆盖而不询问
        • -i:如果目标已存在,则询问是否覆盖
        • -u:(update)如果目标已存在,且source比较新,才会覆盖
    • 取得路径文件名
      • 基本语法:basename dirname/filename
      • 如basename /etc/sysconfig/network则得到文件名network
    • 取得路径目录名
      • 基本语法:dirname dirname/filename
      • 如dirname /etc/sysconfig/network则得到目录名/etc/sysconfig(不带文件名)
  • 文件内容查阅
    • 直接查看文件内容(conCATenate):cat
      • 基本语法:cat [-AbEnTv] filename
        • -A:相当于-vET,可列出一些特殊字符(结尾断行符$、[Tab]键^I等)
        • -b:列出行号,空白行不标
        • -E:显示行末的断行符$
          • Windows的断行符为^M$
        • -n:打印行号,与-b不同
        • -T:以^I的形式打印[Tab]按键
        • -v:列出一些看不出来的特殊字符
    • 反向显示:tac(cat反写)
      • 基本语法:tac filename
      • 从最后一行开始显示
    • 添加行号打印:nl
      • 行号有更多显示方式
      • 基本语法:nl [-bnw] filename
        • -b:指定行号指定方式
          • -b a:包括空行(相当于cat -n)
          • -b t:不包括空行(默认)
        • -n:行号显示方式
          • -n ln:最左方
          • -n rn:最右方,且空的数位不加0
          • -n rz:最右方,且空的数位加0
        • -w:行号字段占用位数
          • 后面直接接number,如-w 3
          • 主要是来限定-n rz的
          • 默认值为6
    • 可逐页翻动:more
      • 基本语法:more filename
      • 可操作按键
        • [Space]:向下翻页
        • [Enter]:向下滚动一行
        • /string:查询
        • n:查询时显示下一匹配项
        • :f:立刻显示当前行数以及文件名
          • 按下冒号:时屏幕并没有反馈信息,直接紧接着按下f键即可
        • q:离开
        • b或[ctrl]+b:往回翻页,但对管道无用
    • 更有弹性的逐页翻动:less
      • more不可向上翻页,less可以,而且less有更多功能
      • 基本语法:less filename
      • 可操作的按键
        • [Space]:向下翻页
        • [PageDown]:向下翻页
        • [PageUp]:向上翻页
        • /string:向下查询
        • ?string:向上查询
        • n:进行下一个查询
        • N:回到上一个查询
        • q:离开
      • man page就是利用less来显示说明文件的内容的
    • 选取前几行:head
      • 基本语法:head [-n number] filename
        • -n:后接数字,表示显示前number行
        • 若number前为-,表示除了最后面的number行外,前面部分都显示出来
      • 如head -n -100 /etc/man.config表示除了最后的100行,前面的都显示出来
    • 选取后几行:tail
      • 基本语法:tail [-n number][-f] filename
        • -n:后接数字,表示显示后number行
          • 若number前为+,表示除了最前面的number行外,后面部分都显示出来
        • -f:持续检测文件内容,如果有新内容写入,即时输出到屏幕上,知道按下[ctrl]+c退出
      • 如tail -n +100 /etc/man.config表示除了最前面的100行外,后面的都显示出来
      •  
      • 示例:head -n 20 /etc/man.config | tail -n 10
        • 先取前20行
        • 再取这20行的后10行
        • 即显示第11~20行内容
    • 非纯文本文件:od
      • 用于读取二进制文件或者数据文件
      • 基本语法:od [-t TYPE] filename
        • -t:后接输出类型
          • -t a:默认字符
          • -t c:ASCII字符
          • -t d[size]:十进制(decimal),每个整数占用[size] bytes
          • -t f[size]:浮点数(floating),每个数占用[size] bytes
          • -t o[size]:八进制(octal),每个数占用[size] bytes
          • -t x[size]:十六进制(hexadecimal),每个数占用[size] bytes
        • 默认使用十六进制显示
  • 修改文件时间、创建空文件:touch
    • 文件时间
      • 修改时间(modification time, mtime)
        • 文件内容修改的时间
        • ls命令默认显示mtime
      • 状态时间(status time, ctime)
        • 文件状态改变的时间(包括属性、权限等)
        • ctime是不可修改,不可复制的
      • 访问时间(access time, atime)
        • 文件内容被取用的时间
      • 由于时区问题、BIOS设置问题,有可能会出现来自“未来”的文件,导致某些程序无法正常运行
    • 基本语法:touch [-acdmt] filename
      • -a:仅atime
      • -c:仅修改文件时间,若该文件不存在并不创建新文件
      • -d:自定义修改的时间
        • 如touch -d "2 days ago" bashrc
      • --date:-d的参数全名,但是格式不同
        • 如touch --date="2 days ago" bashrc
      • -m:仅修改mtime
      • -t:自定义修改时间,格式为YYMMDDhhmm
        • 如touch -t 0709150202 bashrc表示把文件的atime和mtime修改为Sep 15 2007 02:02
    • 使用touch时,ctime会自动更新为目前时间
    • 默认情况下,不加入参数,即“touch filename”时
      • 若文件存在,则三个时间都更新为当前时间
      • 若文件不存在,则主动创建一个新的空文件
  • 文件的默认权限:umask
    •  查询默认权限
      • 数字法显示:umask
        • 如:0022
        • 数字表示在默认值的基础上需要减掉的权限而不是具备的权限!!!!
      • 符号法显示:umask -S
        • 注意:S为大写
        • 如:u=rwx, g=rx, o=rx
          • 不显示特殊权限
          • 只显示具备的权限,不具备的不显示-
    • 默认权限的基本设置
      • 文件:-rw-rw-rw-(666)
      • 目录:drwxrwxrwx(777)
    • 默认权限的设置:umask xyz
      • 可以不设置特殊权限
      • xyz表示的是在默认值的基础上需要减掉的权限
    • 默认权限的计算(符号方式)
      • 示例:umask 002
        • 文件:(-rw-rw-rw-) - (--------wx) = -rw-rw-r--
        • 目录:(drwxrwxrwx) - (--------wx) = drwxrwxr--
    • 不同用户身份的umask默认值不同
      • root用户umask默认值为022,只给自己留下写入权限
      • 一般用户的umask默认值为002,保留用户组的写入权限
    • 默认的umask设置可以参考文件/etc/bashrc,但是内容不建议修改
  • 文件隐藏属性
    • 设置文件隐藏属性:chattr
      • 只支持Ext2以上的文件系统
      • 基本语法:chattr [+-=] [ASacdistu] dirname/filename
        • +为添加,-为除去,=为设置
        • A:访问文件时,它的atime不会被修改
          • 避免I/O较慢的及其过度访问硬盘,有利于速度较慢的计算机
        • S:文件修改时,改动会同步写入硬盘
          • 一般情况下,文件是异步写入硬盘的(点击保存)
        • a:文件只能添加数据,不能删除和修改数据(常见)
          • 只用root能设置该参数
        • c:文件将自动压缩,读取时自动解压缩,存储时会自动压缩后存储
          • 有利于大文件的存储
        • d:当dump程序执行时,该文件不会被dump备份
        • i:文件不能删除、重命名,即使设置连接也不能写入、添加数据,即使是root用户也不能(常见)
          • 只有root能设置此参数
          • 有利于系统安全
        • s:当文件删除时,会从磁盘空间中删除
        • u:文件删除时,数据内容仍在磁盘中(类似“回收站”)
      • 该命令的许多设置都只有root能够设置
      • 该命令常用于系统的数据安全
    • 显示文件隐藏属性:lsattr
      • 基本语法:lsattr [adR] dirname/filename
        • -a:把隐藏文件的属性也显示出来
        • -d:若为dirname,只显示目录本身的属性而不是目录下的文件
        • -R:递归,连同子目录下的数据的属性也显示出来
      • 如:
        • chattr +aij attrtest
        • lsattr attrtest
        • 将得到“----ia---j--- attrtest”
  • 文件特殊权限
    • SetUID(SUID):仅对文件有效
      • 权限记号:在文件所有者的x权限处出现s标志
      • 限制与功能
        • SUID权限仅对二进制程序(binary program)有效
          • 对shell script无效!
        • 执行者对于该程序必须具有x的可执行权限
          • 否则显示为S标志,即空的SUID权限
        • 本权限仅在执行该程序的过程(run-time)有效
        • 执行者将暂时具有该程序所有者(owner)的权限
      • 如:系统的账号密码都记录在文件/etc/shadow里面,权限为“-r-------- 1 root root”,仅有root用户有r权限且仅有root用户能够强制写入
        • 但是,一般用户也可以通过passwd命令修改自己的密码
        • 这是因为passwd执行文件具有SUID权限
        • 当执行该命令时,一般用户会暂时取得passwd的owner即root的暂时权限,因此能够修改/etc/shadow的数据内容
    • SetGID(SGID):对文件、目录都有效
      • 权限记号:在用户组的x权限处出现s标志
      • 限制与功能
        • 对于文件
          • 仅对二进制程序(binary program)有效
          • 执行者对该程序必须有x权限
            • 否则显示为S标志,即空的SGID权限
          • 执行者在执行过程中会获得该程序用户组group的支持
        • 对于目录
          • 用户对该目录与r,x权限时,该用户就能进入此目录
          • 用户在此目录下的有效用户组(effective group)将会变成该目录的用户组
          • 若用户在此目录下具有w权限,则用户所创建的新文件的用户组与此目录的用户组相同
      • 该权限常用于项目开发
    • Sticky Bit(SBIT):仅对目录有效
      • 权限记号:在其他人的x权限处出现t标志
      • 限制与功能
        • 当用户在该目录下有w,x权限,仅有自己和root能对自己创建的文件或目录进行删除、重命名、移动等操作
        • 如果没有x权限,则显示为T标志,即空的SBIT权限
    • 特殊权限的设置
      • 与rwx权限类似,采用chmod命令,只需在xyz前加一位数码
      • 数字法
        • 权限分数
          • SUID为4
          • SGID为2
          • SBIT为1
      • 符号法
        • SUID和SGID为s
          • SUID的s用于owner,SGID的s用于group
        • SBIT为t
  • 查询文件类型:file
    • 基本语法:file filename
    • 显示格式
      • 文件完整路径:说明文字
        • /root/.bashrc:ASCII text为ASCII纯文本文件
        • /var/lib/mlocate/mlocate.db:data为data文件
        • 而执行文件的数据很多,包括权限、支持的硬件平台、使用的函数库等等
  • 命令查询:which
    • 基本语法:which [-a] command
      • -a:将所有PATH目录下找到的命令都列出
        • 不加入该参数时,只列出查询到的第一个匹配项
    • which是根据PATH变量列出的目录查找可执行文件的
      • 因此,root用户和一般用户查询结果可能不同
    • which实际是一个命令别名,等价于”alias | /usr/bin/which --tty-only --read-alias --show-dot“
    • 另外也有一个查询命令:type
  • 文件查询
    • whereis与locate命令查询速度比find快,但是不完整
      • whereis与locate命令是利用数据库查询,find是直接搜索硬盘
      • 因此,find查询要慢的多
      • 但是数据库默认一天更新一次,当天创建的文件查询不到,当天删除的文件却能查询到
    • Linux系统会将系统内所有文件记录在一个数据库文件内,当使用whereis或者locate时,会以此数据库为准
      • 该数据库默认一天更新一次
      • 可以通过updatedb命令手动更新,但是要花上几分钟,因为它要查找硬盘
      • 相关的配置文件为/etc/updatedb.conf
      • 数据库文件为/var/lib/mlocate
    • 完整名查询:whereis
      • 基本语法:whereis [-bmsu] dirname/filename
        • -b:只找二进制文件
        • -m:只在说明文件manual路径下找
        • -s:只找source源文件
        • -u:查找以上三种文件以外的文件
      • 当which查找不到命令时,先用whereis找找看
    • 关键词查询:locate
      • 基本语法:locate [-ir] keyword
        • -i:忽略大小写
        • -r:后接正则表达式
      • 只要完整路径名中出现该关键词都会列出来
    • 磁盘查找:find
      • 基本语法:find [PATH] [option] [action]
        • PATH:要查找的目录
        • 时间参数
          • 包括-atime, -ctime, -mtime,以下以-mtime说明
          • -mtime number:number天之前”一天之内“被更改过的文件
          • -mtime +number:number天前(不包括当天)被更改过的文件
          • -mtime -number:number天内被更改过的文件
            ...654321现在




            -4-4-4-4



            4



            +4+4+4





          • -newer file:列出比[file]这个文件还要新的文件名
        • 用户、用户组参数
          • -uid n:查找用户ID(即UID)为n的文件
          • -gid n:查找用户组ID(即GID)为n的文件
          • -user name:查找用户name的文件
          • -group name:查找用户组name的文件
          • -nouser:查找不存在于/etc/passwd的用户的文件
          • -nogroup:查找不存在与/etc/group的用户组的文件
            • 自行安装软件时,软件属性中owner可能为空
            • 用户、用户组删除后,其创建的文件便为nouser或nogroup
        • 文件属性参数
          • -name filename:查找文件名为filename的文件
            • 可以采用通配符*
            • 如find /etc -name '*httpd*'
          • -size [+-] SIZE:查找比SIZE还要大(+)或者还要小(-)的文件
            • SIZE的单位有:c代表bytes,k代表kb
            • 如”-size 200c“和”-size 200k“
            • man page指出,此处支持m代表mb,g代表gb,但是并没有试出来
          • -type TYPE:查找文件类型为TYPE的文件
            • TYPE为文件类型代号
            • 但是此处一般文件为(f)而不是(-)!!!
          • -perm mode:文件权限(数字法)恰好等于mode的文件
          • -perm -mode:文件权限(数字法)包含mode的文件
            • 并不是直接比较整体数字大小,也不是比较各位数码大小
            • 而是权限包含关系
          • -perm +mode:文件权限(数字法)包含mode中任一权限的文件
        • 其他参数
          • -exec command:使用command命令来处理查找结果
            • {}代表查找结果
            • \;代表command命令的结束
              • bash中分号(;)有特殊意义
              • 需要反斜杠(\)来转义
            • 如find / -perm +7000 -exec ls -l {} \;将查找结果的详细信息打印出来
            • command不支持命令别名
          • -print:(默认执行)将结果打印到屏幕上
  • 目录结构是由根目录一层一层读取的
    • 也就是说,如果对上一层目录不具备x权限,即使下一层目录有x权限也不能进入
      • /home/student不具有x权限
      • 而/home/student/www具有x权限
      • 我们依旧无法进入/home/student/www目录
\00