chap7Linux文件与目录管理
- 特殊目录记号
- .:代表此层目录
- ..:代表上层目录
- -:代表前一个工作目录
- ~:代表目前用户的主文件夹
- ~aaa:代表用户aaa的主文件夹
-
- 所有目录下都存在“.”和“..”这两个目录
- 根目录下的“.”和“..”都是根目录自己
- 目录相关的命令
- 工作目录切换(Change Directory):cd
- 基本语法:cd Path
- Path可以是绝对路径也可以是相对目录,也可以带有特殊目录记号
- 使用相对路径时,你的目前路径必须清楚确定
- Path省略时,相当于切换到自己的主文件夹下
- 显示当前所在目录(Print Working Directory):pwd
- 基本语法:pwd [-P]
- -P:若为连接文件,显示目标路径,而非连接文件的路径
- 新建目录(MaKe DIRectory):mkdir
- 基本语法:mkdir [-mp] 目录名称
- -m xyz:自定义目录的权限,不采用默认权限(xyz为权限分数属性)
- -p:递归创建不存在的上层目录
- 如:mkdir -p test1/test2/test3/test4
- 已存在目录test1,但不存在子目录test2,更别说test3
- 加入该参数后,会逐层创建test2,test3,test4
- 若不加入该参数则会报错“No such file or directory”,只能逐层手动创建
- 并且,该目录本来就存在时,也不会报错
- 注意:不建议随便使用这个参数,万一打错字,目录会变得乱七八糟
- 删除“空”目录(ReMove DIRectory):rmdir
- 基本语法:rmdir [-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没有给出的命令目录
- 可以自行给定命令的路径
- 也可以把路径加入到PATH中
- 也就是说,一般用户也能去访问/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
- 基本语法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:显示行末的断行符$
- -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)
- 状态时间(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:文件只能添加数据,不能删除和修改数据(常见)
- c:文件将自动压缩,读取时自动解压缩,存储时会自动压缩后存储
- d:当dump程序执行时,该文件不会被dump备份
- i:文件不能删除、重命名,即使设置连接也不能写入、添加数据,即使是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)有效
- 执行者对于该程序必须具有x的可执行权限
- 本权限仅在执行该程序的过程(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权限
- 执行者在执行过程中会获得该程序用户组group的支持
- 对于目录
- 用户对该目录与r,x权限时,该用户就能进入此目录
- 用户在此目录下的有效用户组(effective group)将会变成该目录的用户组
- 若用户在此目录下具有w权限,则用户所创建的新文件的用户组与此目录的用户组相同
- 该权限常用于项目开发
- Sticky Bit(SBIT):仅对目录有效
- 权限记号:在其他人的x权限处出现t标志
- 限制与功能
- 当用户在该目录下有w,x权限,仅有自己和root能对自己创建的文件或目录进行删除、重命名、移动等操作
- 如果没有x权限,则显示为T标志,即空的SBIT权限
- 特殊权限的设置
- 与rwx权限类似,采用chmod命令,只需在xyz前加一位数码
- 数字法
- 符号法
- 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
- which是根据PATH变量列出的目录查找可执行文件的
- 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
- 只要完整路径名中出现该关键词都会列出来
- 磁盘查找:find
- 基本语法:find [PATH] [option] [action]
- PATH:要查找的目录
- 时间参数
- 包括-atime, -ctime, -mtime,以下以-mtime说明
- -mtime number:number天之前”一天之内“被更改过的文件
- -mtime +number:number天前(不包括当天)被更改过的文件
- -mtime -number:number天内被更改过的文件
... | 6 | 5 | 4 | 3 | 2 | 1 | 现在 |
|
|
|
| -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目录