本章任务
- 目录间切换
- 建立与删除目录
- 建立与删除文件
- 寻找文件
- 查看文件内容
6.1 目录与路径
6.1.1相对路径与绝对路径
路径(PATH)
- 绝对路径:一定由根目录/写起
- 相对路孔:不是由根目录/写起
6.1.2 目录的相关操作
特殊目录
- . 代表次层目录
- … 代表上层目录
- - 代表前一个工作目录
- ~account 代表accunt这个使用者的家目录
所有的目录下面都会存在两个目录,分别是".“与”…"
常见的目录处理命令
- cd:切换目录
- pwd:显示当前目录
pwd #显示当前工作目录
pwd -P #显示正确完整的路径(区别于链接文件)
- mkdir:建立新目录
mkdir -P //自行建立多层目录
//当test1不存在时,会自行建立test1
mkdir -P test1/test2
mkdir -m //设置文件权限,不使用默认权限
//设置目录文件test2权限为drwx--x--x
mkdir -m 711 test2
- rmdir:删除空目录
rmdir -P //连同上层空目录一并删除
//删除test所有目录
rmdir -P /test1/test2/test3/test4
//将test目录中所有文件删除
rm -r test
6.1.3关于执行文件路径的变量:$PATH
当我们在执行一个指令的时候,举例『ls』,系统会依照 PATH 的设定去每个 PATH 定义的目录下搜寻文件名为ls的可执行文件, 如果在 PATH定义的目录中含有多个文件名为 ls 的可执行文件,那么先搜寻到的同名指令先被执行
注意要点
- 不同身份使用者预设的 PATH 不同,默认能够随意执行的指令也不同(如 root 与 dmtsai)
- PATH 是可以修改的
- 使用绝对路径或相对路径直接指定某个指令的文件名来执行,会比搜寻 PATH 来的正确
- 指令应该要放置到正确的目录下,执行才会比较方便
- 本目录(.)最好不要放到 PATH 当中
6.2文件与目录管理
6.2.1 文件与目录的查看:ls
[root@study ~]# ls [- - aAdfFhilnrRSt]文件名或目录名称 ..
[root@study ~]# ls [ -- color={never,auto,always}]文件名或目录名称 ..
[root@study ~]# ls [ -- full- - time]文件名或目录名称 ..
选项与参数:
-a :全部的文件,连同隐藏档( 开头为 . 的文件)一起列出来(★★★)
-A :全部的文件,连同隐藏档,但不包括 . 与 .. 这两个目录
-d :仅列出目录本身,而不是列出目录内的文件数据(★★★)
-f :直接列出结果,而不进行排序 (ls 预设会以档名排序!)
-F :根据文件、目录等信息,给予附加数据结构,例如:*:代表可执行文件; /:代表目录; =:代表 socket 文件; |:代表 FIFO 文件;
-h :将文件容量以人类较易读的方式(例如 GB, KB 等等)列出来;
-i :列出 inode 号码,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)
6.2.2 复制删除与移动:cp、rm、mv
cp
- 复制
- 建立链接文件 (就是快捷方式)
- 比对两文件的新旧而予以更新
- 复制整个目录
[root@study ~]# cp [- - adfilprsu] 来源文件(source) 目标文件 (destination)
[root@study ~]# cp [options] source1 source2 source3 .... directory
选项与参数:
-a :相当于 -dr --preserve=all 的意思,至于 dr 请参考下列说明;(★★★)
-d :若来源文件为链接文件的属性(link file),则复制链接文件属性而非文件本身;
-f :为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次;
-i :若目标文件(destination)已经存在时,在覆盖时会先询问动作的进行(★★★)
-l :进行硬式连结(hard link)的连结档建立,而非复制文件本身;
-p :连同文件的属性(权限、用户、时间)一起复制过去,而非使用默认属性(备份★★★);
-r :递归持续复制,用于目录的复制行为;(★★★)
-s :复制成为符号链接文件 (symbolic link),亦即『快捷方式』文件;
-u :destination 比 source 旧才更新 destination,或 destination 不存在的情况下才复制。
--preserve=all :除了 -p 的权限相关参数外,还加入 SELinux 的属性, links, xattr 等也复制了。
最后需要注意的,如果来源文件有两个以上,则最后一个目的文件必须是『目录』
- 是否需要完整的保留来源文件的信息
- 来源文件是否为连结档 (symbolic link file)
- 来源档是否为特殊的文件,例如 FIFO, socket 等
- 来源文件是否为目录
rm
rm [- - fir] 文件或目录
选项与参数:
-f :就是 force 的意思,忽略不存在的文件,不会出现警告讯息
-i :互动模式,在删除前会询问使用者是否动作
-r :递归删除,最常用在目录的删除。这是非常危险的选项!!!
系统防止误删,会在rm命令中自带-i参数,去掉-i参数方法是在rm前面加入’\ ',则系统在删除文件或目录时不会询问。
mv
mv [- - fiu] source destination
mv [options] source1 source2 source3 .... directory
选项与参数:
-f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;
-i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!
-u :若目标文件已经存在,且 source 比较新,才会更新 (update)
//复制一文件,建立一目录,将文件移动到目录中
cd /tmp
cp ~/.bashrc bashrc
mkdir mvtest
mv bashrc mvtest
//更名 将目录A改名为目录B
mv a b
6.2.3 获取路径的文件名与目录名称
//取得最后的文件名
basename /etc/sysconfig/network
//取得的变成目录名
dirname /etc/sysconfig/network
6.3文件内容查看
- cat 由第一行开始显示文件内容
- tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!
- nl 显示的时候,顺道输出行号!
- more 一页一页的显示文件内容
- less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
- head 只看头几行
- tail 只看尾巴几行
- od 以二进制的方式读取文件内容!
6.3.1 直接检视文件
cat [-AbEnTv]
选项与参数:
-A :相当于 -vET 的整合选项,可列出一些特殊字符而不是空白而已;
-b :列出行号,仅针对非空白行做行号显示,空白行不标行号!
-E :将结尾的断行字符 $ 显示出来;
-n :打印出行号,连同空白行也会有行号,与 -b 的选项不同;
-T :将 [tab] 按键以 ^I 显示出来;
-v :列出一些看不出来的特殊字符
tac
由最后一行到第一行反向在屏幕上显示出来
nl [-bnw]
添加行号打印
选项与参数:
-b :指定行号指定的方式,主要有两种
-b a :表示不论是否为空行,也同样列出行号(类似 cat -n)
-b t :如果有空行,空的那一行不要列出行号(默认值)
-n :列出行号表示的方法,主要有三种
-n ln :行号在屏幕的最左方显示
-n rn :行号在自己字段的最右方显示,且不加 0
-n rz :行号在自己字段的最右方显示,且加 0
-w :行号字段的占用的字符数
6.3.2 可翻页检视
more ( 一页一页翻动)
在 more 这个程序的运作过程中,几个按键的功能:
键位 | 功能 |
---|---|
space | 代表向下翻一页 |
enter | 代表向下翻『一行』 |
/string | 代表在这个显示的内容当中,向下搜寻『string』这个关键词 |
:f | 立刻显示出文件名以及目前显示的行数 |
q | 代表立刻离开 more ,不再显示该文件内容 |
b | 或 [ctrl]-b :代表往回翻页,只对文件有用,对管道无用 |
less ( 一页一页翻动)
键位 | 功能 |
---|---|
空格键 | 向下翻动一页 |
pagedown | 向下翻动一页 |
pageup | 向上翻动一页; |
/字符串 | 向下搜寻『字符串』的功能 |
?字符串 | 向上搜寻『字符串』的功能 |
n | 重复前一个搜寻 (与 / 或 ? 有关!) |
N | 反向的重复前一个搜寻 (与 / 或 ? 有关!) |
g | 前进到这个资料的第一行去 |
G | 前进到这个数据的最后一行去 (注意大小写) |
q | 离开 less 这个程序 |
6.3.3 资料截取
我们可以将输出的资料作一个最简单的撷取,那就是取出文件前面几行 (head) 或取出后面几行 (tail)
文字的功能。
head (取出前面几行)
head [-n number] 文件
选项与参数:
-n :后面接数字,代表显示几行的意思
//默认的情况中,显示前面十行
head /etc/man_db.conf
//显示前 20 行
head -n 20 /etc/man_db.conf
//后面 100 行的数据都不打印,只打印/etc/man_db.conf 的前面几行
head -n -100 /etc/man_db.conf
tail ( 取出后面几行)
tail [-n number]
选项与参数:
-n :后面接数字,代表显示几行的意思
-f :表示持续侦测后面所接的档名,要等到按下[ctrl]+c 才会结束 tail 的侦测
//默认的情况中,显示最后的十行
tail /etc/man_db.conf
//显示最后的 20 行
tail -n +100 /etc/man_db.conf
//持续侦测xx路径下的文件的内容
tail -f /var/log/messages
例题:假如我想要显示 /etc/man_db.conf 的第 11 到第 20 行呢?
在第 11 到第 20 行,那么我取前 20 行,再取后10行,所以结果就是
head -n 20 /etc/man_db.conf | tail -n 10
//这两个指令中间有个管线 (|) 的符号存在,这个管线的意思是:『前面的指令所输出的讯息,请透过管线交由后续的指令继续使用』的意思。
//所以, head -n 20 /etc/man_db.conf 会将文件内的 20 行取出来,但不输出到屏幕上,而是转交给后续的 tail 指令继续处理。
//因此 tail 『不需要接档名』,因为 tail 所需要的数据是来自于 head 处理后的结果
6.3.4 非纯文本档:od
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
6.3.5 修改文件时间或建置新档:touch
- modification time (mtime):
当该文件的『内容数据』变更时,就会更新这个时间!内容数据指的是文件的内容,而不是文件的属性或
权限喔!
- status time (ctime):
当该文件的『状态 (status)』改变时,就会更新这个时间,举例来说,像是权限与属性被更改了,都会更新
这个时间啊
- access time (atime)
当『该文件的内容被取用』时,就会更新这个读取时间 (access)。举例来说,我们使用 cat 去读取
/etc/man_db.conf , 就会更新该文件的 atime 了。
在默认的情况下,ls 显示出来的是该文件的 mtime ,也就是这个文件的内容上次被更动的时间。
touch [-acdmt] 文件
选项与参数:
-a :仅修订 access time;
-c :仅修改文件的时间,若该文件不存在则不建立新文件;
-d :后面可以接欲修订的日期而不用目前的日期,也可以使用 --date="日期或时间"
-m :仅修改 mtime ;
-t :后面可以接欲修订的时间而不用目前的时间,格式为[YYYYMMDDhhmm]
最常使用的情况
- 建立一个空的文件;
- 将某个文件日期修订为目前 (mtime 与 atime)
6.4 文件与目录的默认权限与隐藏权限
新增一个文件或目录时,默认的权限是什么?
6.4.1 文件预设权限:umask
umask:目前用户在建立文件或目录时候的权限默认,是设置不需要的权限
例如
umask 0022
其作用是拿掉group和others的写权限
//显示权限(数字模式)
umask
//显示分组权限
umask -S
- 若使用者建立为『文件』则预设『没有可执行( x )权限』,亦即只有 rw 这两个项目,也就是最大为 666 分,
预设权限如下:
-rw-rw-rw- - 若用户建立为『目录』,则由于 x 与是否可以进入此目录有关,因此默认为所有权限均开放,亦即为 777 分,
预设权限如下:
drwxrwxrwx
6.4.2 文件隐藏属性
chattr (配置文件隐藏属性)
chattr [+- - =][ASacdistu] 文件或目录名称
选项与参数:
+ :增加某一个特殊参数,其他原本存在参数则不动。
- :移除某一个特殊参数,其他原本存在参数则不动。
= :设定一定,且仅有后面接的参数
A :存取此文件(或目录)时,访问时间 atime 将不被修改,
可避免 I/O 较慢的机器过度的存取磁盘。(目前建议使用文件系统挂载参数处理这个项目)
S :将异步文件同步写入磁盘中
a :文件将只能增加数据,只有 root 有资格设置
c :会自动的将此文件『压缩』,在读取的时会自动解压缩
d :当 dump 程序被执行的时使该文件(或目录)不会被 dump 备份
i :可以让一个文件『不能被删除、改名、设定连结也无法写入或新增数据!』只有 root 能设定此属性
s :文件被删除时,将会被完全的移除硬盘空间
u :与 s 相反,文件被删除后,数据内容还存在磁盘中
注意 1:属性设定常见的是 a 与 i 的设定值,而且很多设定值必须要身为 root 才能设定
注意 2:xfs 文件系统仅支援 AadiS 而已
lsattr (显示文件隐藏属性)
lsattr [-adR] 文件或目录
选项与参数:
-a :将隐藏文件的属性也秀出来;
-d :如果接的是目录,仅列出目录本身的属性而非目录内的文件名;
-R :连同子目录的数据也一并列出来!
6.4.3 文件特殊权限: SUID, SGID, SBIT
Set UID
- SUID 权限仅对二进制程序(binary program)有效
- 执行者对于该程序需要具有 x 的可执行权限
- 本权限仅在执行该程序的过程中有效 (run-time)
- 执行者将具有该程序拥有者 (owner) 的权限
- SUID 仅可用在 binary program 上, 不能够用在 shell script 上面
例如
/etc/shadow为ROOT所拥有全部权限
当用户更改自己密码时,会暂时取得该权限
Set GID
- SGID 对二进制程序有用;
- 程序执行者对于该程序来说,需具备 x 的权限;
- 执行者在执行的过程中将会获得该程序群组的支持!
- 用户若对于此目录具有 r 与 x 的权限时,该用户能够进入此目录;
- 用户在此目录下的有效群组(effective group)将会变成该目录的群组;
- 用途:若用户在此目录下具有 w 的权限(可以新建文件),则使用者所建立的新文件,该新文件的群组与此
目录的群组相同。
Sticky Bit
- 当用户对于此目录具有 w, x 权限,亦即具有写入的权限时;
- 当用户在该目录下建立文件或目录时,仅有自己与 root 才有权力删除该文件
举例来说
我们的 /tmp 本身的权限是『drwxrwxrwt』, 在这样的权限内容下,任何人都可以在 /tmp
内新增、修改文件,但仅有该文件/目录建立者与 root 能够删除自己的目录或文件。
SUID/SGID/SBIT 权限设定
- 4 为 SUID
- 2 为 SGID
- 1 为 SBIT
出错情况 大写的S T
因为 s 与 t 都
是取代 x 这个权限的,当文件本身无x权限时s与t将会变成大写,以此来表示空权限
6.4.4 观察文件类型:
file 文件名
6.5 指令与文件的搜寻
6.5.1 脚本文件名的搜寻
which (寻找执行文件)
which [-a] command
选项或参数:
-a :将所有由 PATH 目录中可以找到的指令均列出,而不止第一个被找到的指令名称
- alias:命令别名,意思是输入的 command 会等于后面接的那串指令
- which 预设是找 PATH 内所规范的目录
6.5.2 文件夹名的搜寻
whereis (由一些特定的目录中寻找文件的文件名)
主要是对 /bin /sbin 底下的执行,以及 /usr/share/man 底下的 man page 文件
whereis [-bmsu] 文件或目录名
选项与参数:
-l :可以列出 whereis 会去查询的几个主要目录而已
-b :只找 binary 格式的文件
-m :只找在说明文件 manual 路径下的文件
-s :只找 source 来源文件
-u :搜寻不在上述三个项目当中的其他特殊文件
locate / updatedb
locate 寻找的数据是由『已建立的数据库 /var/lib/mlocate/』中查找
locate [-ir] keyword
选项与参数:
-i :忽略大小写的差异;
-c :不输出档名,仅计算找到的文件数量
-l :仅输出几行的意思,例如输出五行则是 -l 5
-S :输出 locate 所使用的数据库文件的相关信息,包括该数据库纪录的文件/目录数量等
-r :后面可接正规表示法的显示方式
- updatedb:根据 /etc/updatedb.conf 的设定去搜寻系统硬盘内的文件名,并更新 /var/lib/mlocate 内的数据库
文件; - locate:依据 /var/lib/mlocate 内的数据库记载,找出用户输入的关键词文件名。
如若查不到数据可先更新一遍数据库在查找
find
find [PATH] [option] [action]
选项与参数:
1. 与时间有关的选项:共有 -atime, -ctime 与 -mtime ,以 -mtime 说明
-mtime n :n 为数字,意义为在 n 天之前的『一天之内』被更动过内容的文件;
-mtime +n :列出在 n 天之前(不含 n 天本身)被更动过内容的文件档名;
-mtime -n :列出在 n 天之内(含 n 天本身)被更动过内容的文件档名。
-newer file :file 为一个存在的文件,列出比 file 还要新的文件档名
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 搜寻。
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. 额外可进行的动作:
-exec command :command 为其他指令,-exec 后面可再接额外的指令来处理搜寻到的结果。
-print :将结果打印到屏幕上,这个动作是预设动作!
find 的特殊功能就是能够进行额外的动作(action)
- {} 代表的是『由 find 找到的内容』,如上图所示,find 的结果会被放置到 {} 位置中;
- -exec 一直到 ; 是关键词,代表 find 额外动作的开始 (-exec) 到结束 (? ,在这中间的就是 find 指令内
的额外动作。 在本例中就是『 ls -l {} 』! - 因为『 ; 』在 bash 环境下是有特殊意义的,因此利用反斜杠来转义。
6.6 极重要的复习!权限与指令间的关系
一、让用户能进入某目录成为『可工作目录』的基本权限为何:
- 可使用的指令:例如 cd 等变换工作目录的指令;
- 目录所需权限:用户对这个目录至少需要具有 x 的权限
- 额外需求:如果用户想要在这个目录内利用 ls 查阅文件名,则用户对此目录还需要 r 的权限。
二、用户在某个目录内读取一个文件的基本权限为何?
- 可使用的指令:例如本章谈到的 cat, more, less 等等
- 目录所需权限:用户对这个目录至少需要具有 x 权限;
- 文件所需权限:使用者对文件至少需要具有 r 的权限才行!
三、让使用者可以修改一个文件的基本权限为何?
- 可使用的指令:例如 nano 或未来要介绍的 vi 编辑器等;
- 目录所需权限:用户在该文件所在的目录至少要有 x 权限;
- 文件所需权限:使用者对该文件至少要有 r, w 权限
四、让一个使用者可以建立一个文件的基本权限为何?
- 目录所需权限:用户在该目录要具有 w,x 的权限,重点在 w 啦!
五、让用户进入某目录并执行该目录下的某个指令之基本权限为何?
- 目录所需权限:用户在该目录至少要有 x 的权限;
- 文件所需权限:使用者在该文件至少需要有 x 的权限
6.7 重点回顾
- 绝对路径:『一定由根目录 / 写起』;相对路径:『不由 / 写起,而是由相对当前目录写起』
- 特殊目录有:., …, -, ~, ~account 需要注意;
- 与目录相关的指令有:cd, mkdir, rmdir, pwd 等重要指令;
- rmdir 仅能删除空目录,要删除非空目录需使用『 rm -r 』指令;
- 用户能使用的指令是依据 PATH 变量所规定的目录去搜寻的;
- ls 可以检视文件的属性,尤其 -d, -a, -l 等选项特别重要!
- 文件的复制、删除、移动可以分别使用:cp, rm , mv 等指令来操作;
- 检查文件的内容(读文件)可使用的指令包括有:cat, tac, nl, more, less, head, tail, od 等
- cat -n 与 nl 均可显示行号,但默认的情况下,空白行会不会编号并不相同;
- touch 的目的在修改文件的时间参数,但亦可用来建立空文件;
- 一个文件记录的时间参数有三种,分别是 access time(atime), status time (ctime), modification time(mtime),ls
默认显示的是 mtime。 - 除了传统的 rwx 权限之外,在 Ext2/Ext3/Ext4/xfs 文件系统中,还可以使用 chattr 与 lsattr 设定及观察隐藏属
性。 常见的包括只能新增数据的 +a 与完全不能更动文件的 +i 属性。 - 新建文件/目录时,新文件的预设权限使用 umask 来规范。默认目录完全权限为 drwxrwxrwx, 文件则为
-rw-rw-rw-。 - 文件具有 SUID 的特殊权限时,代表当用户执行此一 binary 程序时,在执行过程中用户会暂时具有程序拥有
者的权限 - 目录具有 SGID 的特殊权限时,代表用户在这个目录底下新建的文件之群组都会与该目录的组名相同。
- 目录具有 SBIT 的特殊权限时,代表在该目录下用户建立的文件只有自己与 root 能够删除!
- 观察文件的类型可以使用 file 指令来观察;
- 搜寻指令的完整文件名可用 which 或 type ,这两个指令都是透过 PATH 变量来搜寻文件名;
- 搜寻文件的完整档名可以使用 whereis 找特定目录或 locate 到数据库去搜寻,而不实际搜寻文件系统;
- 利用 find 可以加入许多选项来直接查询文件系统,以获得自己想要知道的档名。