Linux文件与目录管理
目录与路径
目录的相关操作
| . | 代表此层目录 |
|---|---|
| .. | 代表上一层目录 |
| - | 代表前一个工作目录 |
| ~ | 代表目前使用者身份所在的家目录 |
| ~ account | 代表account这个使用者的家目录(account是账号名) |
常见的处理目录的命令
cd:切换目录
pwd:显示当前目录
-P可以获得正确的目录路径
/var/mail是/var/spool/mail的链接文件
mkdir:建立一个新目录
- -p:帮助你直接将所需要的目录递归创建
- -m:设置文件权限,不使用默认权限
- 默认情况下目录是要一层一层创建的
- 图中test目录就是默认权限,而test2目录在创建时赋了711权限
rmdir:删除一个空目录
- -p:连同上层空的目录一起删除
关于执行文件路径的变量:$PATH
为什么可以在任何地方执行/bin/ls命令?
因为无论是root还是用户自身账号都有/bin或/usr/bin这个目录在PATH变量内。/bin在CentOS7中就是链接的/usr/bin
文件与目录管理
文件与目录的查看:ls
当我们执行ls命令时,默认显示的只有:非隐藏的文件名、以文件名进行排序及文件名代表的颜色显示而已
- -a:全部文件,连同隐藏文件(开头为.的文件)一起列出来
- -d:仅列出目录本身,而不是列出目录内的文件数据
- -l:详细信息显示,包含文件的属性和权限等数据
复制、删除与移动:cp、rm、mv
cp(复制文件)
-a:相当于-dr –preserver=all的意思
直接复制不加任何选项的话,文件的某些属性/权限会被改变
如果想要将文件的所有特性一起复制过来就要加-a
-i:若目标文件已存在,在覆盖时会先询问操作的进行
用root身份将home目录下的.bashrc复制到/tmp下,并更名为bashrc
由于第二次加上了-i选项,所以覆盖前会询问是否覆盖
-p:连同文件的属性(权限、用户、时间)一起复制,而非使用默认属性
-r:递归复制,用于目录的复制操作
- 复制/etc/这个目录下的所有内容到/tmp下面,-r选项是可以复制目录,但是文件和目录的权限可能会被改变
rm(删除文件或目录)
- -f:忽略不存在的文件,不会出现警告信息
- -i:在删除前会询问使用者是否操作
- 可以在文件名后面加上通配符*,就可以删掉以文件名开头的所有文件
- 将上面cp例子中建立的/tmp/etc这个目录删掉
- 删除一个带有-开头的文件

- -r:递归删除(危险的选项)
mv(移动文件与目录,或重命名)
- -f:强制,如果目标文件已存在,不会询问而直接覆盖
- -i:目标文件已经存在时,询问是否覆盖
- -u:目标文件已经存在时,且source比较新,才会更新
将某个文件移动到某个目录
对目录重命名
建立两个文件,再全部移动/tmp/mvtest2中- 如果有多个源文件或目录,则最后一个目标文件一定是目录
获取路径的文件名与目录名称
- 获取文件名:basename
- 获取目录名:dirname
文件内容查看
- cat:由第一行开始显示文件内容
- tac:从最后一行开始显示,可以看出tac是cat的倒着写
- nl:显示的时候同时输出行号
- more:一页一页地显示文件内容
- less:与more类似,但是比more更好的是可以往前翻页
- head:只看前面几行
- tail:只看后面几行
- od:以二进制的方式读取文件内容
直接查看文件内容
直接查看文件内容可以用cat/tac/nl这几个命令
cat(concatenate)
- -A:相当于-vET的整合选项,可列出一些特殊字符而不是空白而已
- -b:列出行号,仅针对非空白行做行号显示,空白行不标行号
- -E:将结尾的换行符$显示出来
- -n:打印出行号,连同空白行也会有行号,与-b的选项不同
- -T:将【tab】按键以^I(大写i)显示出来
- -v:列出一些看不出来的特殊字符
查看/etc/issue这个文件的内容
加上打印行号
不显示空白行的行号
将/etc/man_db.conf的内容完整的显示出来(包含特殊字符)
tac(反向列示)
最后一行到第一行反向在屏幕上显示出来
nl(添加行号打印)
- -b:指定行号指定的方式,主要有两种:
- -b a:表示不论是否为空行,也同样列出行号(类似cat -n)
- -b t:如果有空行,空的那一行不要列出行号
- -n:列出行号表示的方法,主要有三种
- -n ln:行号在屏幕的最左方显示
- -n rn:行号在自己栏位的最右方显示,且不加0
- -n rz:行号在自己栏位的最右方显示,且加0
- -w:行号栏位的占用的字符数
用nl列出/etc/issue的内容
加上行号,包括空白行
让行号前面自动补上0
自动补0默认是6位数,把他改成三位数
可翻页查看(more & less)
more(一页一页翻动)
在more程序运行过程中:
- 空格键(space):代表向下翻一页
- Enter:代表向下翻一行
- /字符串:代表在这个显示的内容当中,向下查找字符串这个关键词
- :f:立刻显示出文件名以及目前显示的行数
- q:代表立刻离开more,不再显示该文件的内容
- b或【ctrl】+b:代表往回翻页,只对文件有用,对管道无用
less
less的用法比起more又更加有弹性,在more的时候,我们并没有办法像前面饭,只能往后面看,less就可以使用【pageup】【pagedown】等按键的功能来往前往后翻看文件。在less程序运行过程中
- 空格键::向下翻动一页
- 【pagedown】:向下翻动一页
- 【pageup】:向上翻动一页
- /字符串:向下查找字符串的功能
- ?字符串:向上查找字符串的功能
- n:重复前一个查找(与/或?有关)
- N:反向的重复前一个查找(与/或?有关)
- g:前进到这个数据的第一行
- G:前进到这个数据的最后一行
- q:离开less这个程序
数据截取(head & tail)
head(取出前面几行)
-n:后面接数字,代表显示几行的意思(不加-n的话默认显示前十行),如果是负数,例如-100,文件一共有131行,则只显示前31行

tail(取出后面几行)
-n:后面接数字,代表显示几行的意思(不加-n默认显示后十行)
不知道man_db.conf有多少行但是想显示100行之后的数据
-f:表示持续刷新显示后面所接文件中的内容,要等到按下【ctrl】+ c才会结束
显示/etc/man_db.conf的第11行到20行?
head -n 20 /etc/man_db.conf | tail -n 10:先取前20行,再去后10行显示/etc/man_db.conf的第11行到20行且列出正确的行号?
cat -n /etc/man_db.conf | head -n 20 | tail -n 10
非纯文本文件:od
查看非纯文本文件,例如二进制文件时,用上面的命令来读取会导致乱码。利用这个命令可以将数据文件(data file)或者二进制文件(binary file)的内容数据读出来。
- -t:后面接各种参数
- a:利用默认的字符来输出
- c:利用ASCII字符来输出
- d[size]:利用十进制(decimal)来输出数据,每个整数占用size Bytes
- f[size]:利用浮点数值(floating)来输出数据,每个数占用size Bytes
- o[size]:利用八进制(octal)来输出数据,每个整数占用size Bytes
- x[size]:利用十六进制(hexadecimal)来输出数据,每个整数占用size Bytes
将/usr/bin/passwd的内容使用ASCII方式来显示:
将/etc/issue这个文件的内容以八进制列出存储值与ASCII的对照表(最左边一列是以八进制来表示Bytes数,第二栏0000020代表开头是第16个byte(2x8)的内容的意思)
如果想立刻找到password这几个字的ASCII对照,该如何通过od命令来判断?
echo password | od -t oCc
修改文件时间或创建新文件:touch
- 修改时间(mtime):当文件的【内容数据】变更时,就会更新这个时间,内容数据指的是文件的内容,而不是文件的属性或权限
- 状态时间(ctime):当文件的【状态】改变时,就会更新这个时间,例如权限与属性被更改了就会更新这个时间
- 读取时间(atime):当【文件内容被读取】时,就会更新这个读取时间,例如当我们使用cat命令来读取文件时,就会更新文件的atime
在默认情况下,ls显示出来的是该文件的mtime(修改时间)
touch参数
-a:仅自定义access time
-c:仅修改文件的时间,若该文件不存在则不建立新文件
-d:后面可以接自定义的日期而不用目前的日期,也可以使用–date=”日期或时间”
-m:仅修改mtime
-t :后面可以接自定义的时间而不用目前的时间,格式为[YYYYMMDDhhmm]
创建一个新文件并观察时间
将~/.bashrc复制成为bashrc,复制完全的属性,检查其日期
将bashrc改到两天前
将上面的bashrc日期改为2013/07/15 2:34

无论如何,touch这个命令最常被使用的情况是
- 建立一个空文件
- 将某个文件日期自定义为目前(mtime与atime)
文件与目录的默认权限与隐藏权限
文件默认权限:umask
umask:指定目前用户在建立文件或目录的时候的权限默认值
直接输入umask就可以看到数字类型的权限设置值(与一般权限有关的是后面三个数字)
在后面接上-S这个选项就会以符号类型的方式来显示出权限

在默认情况下
- 对于文件:因为文件默认没有可执行的权限(x),所以只有rw两个权限,也就是最大为666
- -rw-rw-rw-
- 对于目录:因为x权限与是否可以进入此目录有关,所以默认为所有权限均开放
- drwxrwxrwx
umask的数字是 该默认值需要减掉的权限。如果要拿掉能写的权限就要输入2以此类推
文件默认创建是-rw-rw-rw-,因为查出来的umask默认权限是022(后三个数字),groups和others都被拿掉了2(w)这个权限,所以查出来的就是-rwr–r–这个样子
umask是可以被设置的
命令格式:umask 权限数字
umask 022
文件隐藏属性
chattr命令只能在ext2、ext3、ext4的Linux传统文件系统上面完整生效
chattr(配置文件隐藏属性)
chattr [+-=][ASacdistu] 文件或目录名称
比较常用的几个选项
- a:文件只能增加数据,而不能删除也不能修改数据,只有root才能设置这个属性
- i:可以让一个文件不能被删除、改名、设置连接也无法写入或新增数据,对于系统安全性有很大的助益,只有root才能设置此权限
- S:当你进行任何文件的修改,该修改会同步写入磁盘中
设置了i属性后连root都无法删除,只能取消i属性才能删掉
lsattr(显示文件隐藏属性)
lsattr [-adR] 文件或目录
- a:将隐藏文件的属性也显示出来
- d:如果接的是目录,仅列出目录本身的属性而非目录内的文件名
- R:连同子目录的数据也一并列出来
文件特殊权限:SUID、SGID、SBIT
SUID
当s这个标志出现在文件拥有者的x权限上时,例如【-rwsr-xr-x】此时就被称为Set UID,成为SUID的特殊权限
- SUID权限仅对二进制程序(binary program)有效
- 执行者对于该程序需要具有x的可执行权限
- 本权限仅在执行该程序的过程中有效
- 执行者将具有该程序拥有者(owner)的权限
例如:feliks对于passwd这个程序来说是具有x的权限,表示feliks能执行passwd;passwd的拥有者是root这个账号;feliks执行passwd的过程中,会暂时获得root权限,这是/etc/shadow就可以被feliks所执行的passwd所修改。
SUID仅仅只能使用在二进制程序上,不能够用在shell脚本上面
SGID
当s这个标志出现在用户组的x权限上,此时称为Set GID
与SUID不一样的是,SGID可以针对文件或目录来设置
对文件来说:
- SGID对二进制程序有用
- 程序执行者对于该程序来说,需具备x的权限
- 执行者在执行的过程中会将获得该程序用户组的支持
例如:文件locate的权限【-rwx–s–x 1 root slocate】,当我们用feliks这个账户去执行locate时,feliks就会获得slocate用户组的支持
对目录来说:
- 用户如果对此目录有r和x的权限,该用户也能够进入此目录
- 用户在此目录下的有效用户组(effective group)将会变成该目录的用户组
- 用途:如果用户在此目录下具有w的权限(可以新建文件),则用户所建立的新文件,该新文件的用户组与目录的用户组一致
SBIT
Sticky Bit只针对目录有效,对于文件已经没有效果了,SBIT对于目录的作用是
- 当用户对于此目录具有w、x权限,即具有写入的权限
- 当用户在该目录建立文件或目录时,仅有自己与root才有权力删除该文件
例如:在一个目录A内,甲对于A有groups和others的身份,并且拥有该目录的w权限,这表示甲可以对A目录内任何人创建的目录或文件均可删除,但是如果给A加上SBIT权限,则甲只能针对自己建立的文件或目录进行删除、更名、移动等操作
观察文件类型:file
可以让我们知道文件属于ASCII文件还是数据(data)文件还是二进制(binary)文件
file 文件路径
命令与文件的查找
脚本文件的查找
which(查找【执行文件】)
-a:将所有由PATH目录中可以找到的命令列出,而不知第一个被找到的命令名称
which命令是找不到history命令的,因为history是bash内置的命令,which默认是找PATH内所设置的目录
文件的查找
whereis
whereis [-bmsu] 文件或目录名- -l:可以列出whereis会去查询的几个主要目录
- -b:只找binary(二进制)格式的文件
- -m:只找在说明文件manual路径下的文件
- -s:执照source源文件
- -u:查找不在上述三个项目当中的其他特殊文件
locate / updatedb
- -i:忽略大小写的差异
- -c:不输出文件名,仅计算找到的文件数量
- -l:仅输出几行,例如五行则是
-l 5 - -S:输出locate所使用的数据库文件的相关信息,包括该数据库记录的文件/目录数量等
- -r:后面可接正则表达式的显示方式
updatedb:根据/etc/updatedb.conf的设置去查找系统硬盘内的文件,并更新/var/lib/mlocate内的数据库文件
locate:依据/var/lib/mlocate内的数据库记录,找出用户所输入关键词的文件名
find
find [PATH] [option] [action]- -mtime n:n是数字,意义是在n天前的【一天之内】被修改过内容的文件
- -mtime +n:列出在n天之前(不包含n天本身)被修改过内容的文件
- -mtime -n:列出在n天之内(包含n天本身)被修改过内容的文件
- -newer file:file是一个实际存在的文件,列出比file还要新的文件
寻找/etc下的文件,文件日期比/etc/passwd新就列出
- -uid n:n为数字,这个数字是使用者的账号ID,UID记录在/etc/passwd里面
- -gid n:n为数字,哦这个数字是用户组名称的ID,GID记录在/etc/group里面
- -user name:name为使用者账号名称
- -group name:name为用户组名称
- -nouser:查找文件的拥有者不在/etc/passwd当中
- -nogroup:查找文件的拥有用户组不存在于/etc/group的文件
查找home下面属于feliks的文件
-name filename:查找文件名称为filename的文件
-size [+-]SIZE:查找比SIZE还要大或小的文件,这个SIZE的规格如下
- c:代表Bytes
- k:代表1024Bytes(查找比50kb还要大的文件【-size +50k】)
-type TYPE:查找文件的类型为TYPE的,类型主要有:
- 一般正规文件:f
- 设备文件:b,c
- 目录:d
- 链接文件:l
- socket:s
- FIFO:p
-perm mode:查找文件权限【刚好等于】mode的文件
-perm -mode:查找文件权限【必须要全部囊括mode的权限】的文件(例如要找【-rwxr–r–】的文件,因为【-rwxr-xr-x】囊括了【-rwxr–r–】权限,所以也会被查出来)
-perm /mode:查找文件权限【包含任一mode的权限】的文件(例如要查找【-rwxr-xr-x】,但是【rw——-】也会被查出来,因为有【-rw】属性存在)
找出文件名为passwd的文件
找出文件名钟包含了passwd这个关键字的文件
找出/run目录下文件类型为socket的文件名有哪些
查找文件当中含有SGID、SUID或SBIT的属性

复习(权限与命令之间的关系)
- 让用户能进入某目录成为可工作目录的基本权限?
- 可使用的命令:cd等变换工作目录的命令
- 目录需要的权限:用户对这个目录至少需要有x的权限
- 额外需求:如果用户想要在这个目录内利用ls查看文件名,则还需要用户对此目录有r的权限
- 用户在某个目录内读取一个文件的基本权限?
- 可使用的命令:cat、more、less等
- 目录需要的权限:用户对这个目录至少需要有x的权限
- 文件需要的权限:用户对文件至少需要有r的权限
- 让用户可以修改一个文件的基本权限是?
- 可使用的命令:nano或vi编辑器
- 目录需要的权限:用户在该文件所在的目录至少要有x的权限
- 文件需要的权限:用户对该文件至少要有r、w权限
- 让一个用户可以建立一个文件的基本权限是什么
- 目录需要的权限:用户在该目录要具有w、x的权限,重点是w
- 让用户进入某目录并执行该目录下的某个命令的基本权限?
- 目录需要的权限:用户在该目录至少要有x的权限
- 文件需要的权限:用户在该文件至少要有x的权限
- 文件具有SUID的特殊权限时,代表当用户执行此二进制程序时,在执行过程中用户会暂时具有程序拥有者的权限
- 目录具有SGID的特殊权限时,代表用户再这个目录下面新建的文件的用户组都会于该目录的组名相同
- 目录具有SBIT的特殊权限时,代表用户在这个目录下面新建的文件只有自己与root能删除