目录与路径
相对路径与绝对路径
- 绝对路径:路径的写法“一定由根目录 / 写起”
- 相对路径:路径的写法“不是由 / 写起”
目录的相关操作
.
代表此层目录..
代表上一层目录-
代表前一个工作目录~
代表“目前使用者身份”所在的主文件夹~account
代表 account 这个使用者的主文件夹(account是个帐号名称)
处理目录的指令
- cd:变换目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16[root@study ~]$ cd [相对路径或绝对路径]
# 最重要的就是目录的绝对路径与相对路径,还有一些特殊目录的符号啰!
[root@study ~]$ cd ~dmtsai
# 代表去到 dmtsai 这个使用者的主文件夹,亦即 /home/dmtsai
[root@study dmtsai]$ cd ~
# 表示回到自己的主文件夹,亦即是 /root 这个目录
[root@study ~]$ cd
# 没有加上任何路径,也还是代表回到自己主文件夹的意思喔!
[root@study ~]$ cd ..
# 表示去到目前的上层目录,亦即是 /root 的上层目录的意思;
[root@study /]$ cd -
# 表示回到刚刚的那个目录,也就是 /root 啰~
[root@study ~]$ cd /var/spool/mail
# 这个就是绝对路径的写法!直接指定要去的完整路径名称!
[root@study mail]$ cd ../postfix
# 这个是相对路径的写法,我们由/var/spool/mail 去到/var/spool/postfix 就这样写! - pwd:显示目前的目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16[root@study ~]$ pwd [-P]
选项与参数:
-P :显示出确实的路径,而非使用链接 (link) 路径。
范例:单纯显示出目前的工作目录:
[root@study ~]$ pwd
/root <== 显示出目录啦~
范例:显示出实际的工作目录,而非链接文件本身的目录名而已
[root@study ~]$ cd /var/mail <==注意,/var/mail是一个链接文件
[root@study mail]$ pwd
/var/mail <==列出目前的工作目录
[root@study mail]$ pwd -P
/var/spool/mail <==怎么回事?有没有加 -P 差很多~
[root@study mail]$ ls -ld /var/mail
lrwxrwxrwx. 1 root root 10 May 4 17:51 /var/mail -> spool/mail
# 看到这里应该知道为啥了吧?因为 /var/mail 是链接文件,链接到 /var/spool/mail
# 所以,加上 pwd -P 的选项后,会不以链接文件的数据显示,而是显示正确的完整路径啊! - mkdir:创建一个新的目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20[root@study ~]$ mkdir [-mp] 目录名称
选项与参数:
-m :设置文件的权限喔!直接设置,不需要看默认权限 (umask) 的脸色~
-p :帮助你直接将所需要的目录(包含上层目录)递回创建起来!
范例:请到/tmp下面尝试创建数个新目录看看:
[root@study ~]$ cd /tmp
[root@study tmp]$ mkdir test <==创建一名为 test 的新目录
[root@study tmp]$ mkdir test1/test2/test3/test4
mkdir: cannot create directory ‘test1/test2/test3/test4’: No such file or directory
# 话说,系统告诉我们,没可能创建这个目录啊!就是没有目录才要创建的!见鬼嘛?
[root@study tmp]$ mkdir -p test1/test2/test3/test4
# 原来是要建 test4 上层没先建 test3 之故!加了这个 -p 的选项,可以自行 帮你创建多层目录!
范例:创建权限为rwx--x--x的目录
[root@study tmp]$ mkdir -m 711 test2
[root@study tmp]$ ls -ld test*
drwxr-xr-x. 2 root root 6 Jun 4 19:03 test
drwxr-xr-x. 3 root root 18 Jun 4 19:04 test1
drwx--x--x. 2 root root 6 Jun 4 19:05 test2
# 仔细看上面的权限部分,如果没有加上 -m 来强制设置属性,系统会使用默认属性。
# 那么你的默认属性为何?这要通过下面介绍的 [umask](../Text/index. html#umask) 才能了解喔! ^_^ - rmdir:删除一个空的目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16[root@study ~]# rmdir [-p] 目录名称
选项与参数:
-p :连同“上层”“空的”目录也一起删除
范例:将于mkdir范例中创建的目录(/tmp下面)删除掉!
[root@study tmp]# ls -ld test* <==看看有多少目录存在?
drwxr-xr-x. 2 root root 6 Jun 4 19:03 test
drwxr-xr-x. 3 root root 18 Jun 4 19:04 test1
drwx--x--x. 2 root root 6 Jun 4 19:05 test2
[root@study tmp]# rmdir test <==可直接删除掉,没问题
[root@study tmp]# rmdir test1 <==因为尚有内容,所以无法删除!
rmdir: failed to remove ‘test1’: Directory not empty
[root@study tmp]# rmdir -p test1/test2/test3/test4
[root@study tmp]# ls -ld test* <==您看看,下面的输出中test与 test1不见了!
drwx--x--x. 2 root root 6 Jun 4 19:05 test2
# 瞧!利用 -p 这个选项,立刻就可以将 test1/test2/test3/test4 一次删除 ~
# 不过要注意的是,这个 rmdir 仅能“删除空的目录”喔!
可执行文件路径的变量: $PATH
- 不同身份使用者默认的PATH不同,默认能够随意执行的指令也不同(如root与blackgane);
- PATH是可以修改的;
- 使用绝对路径或相对路径直接指定某个指令的文件名来执行,会比搜寻PATH来的正确;
- 指令应该要放置到正确的目录下,执行才会比较方便;
- 本目录(.)最好不要放到PATH当中。
文件与目录管理
文件与目录的检视: ls
1 | [root@study ~]$ ls [-aAdfFhilnrRSt] 文件名或目录名称.. |
复制、删除与移动: cp, rm, mv
cp (复制文件或目录)
1 | [root@study ~]$ cp [-adfilprsu] 来源文件(source) 目标文件(destination) |
在复制时,你必须要清楚的了解到:
- 是否需要完整的保留来源文件的信息?
- 来源文件是否为链接文件 (symbolic link file)?
- 来源文件是否为特殊的文件,例如 FIFO, socket 等?
- 来源文件是否为目录?
rm (移除文件或目录)
1 | [root@study ~]$ rm [-fir] 文件或目录 |
mv (移动文件与目录,或更名)
1 | [root@study ~]$ mv [-fiu] source destination |
取得路径的文件名称与目录名称
1 | [root@study ~]$ basename /etc/sysconfig/network |
文件内容查阅
- cat 由第一行开始显示文件内容
- tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!
- nl 显示的时候,顺道输出行号!
- more 一页一页的显示文件内容
- less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
- head 只看头几行
- tail 只看尾巴几行
- od 以二进制的方式读取文件内容!
直接检视文件内容
cat (concatenate)
1 | [root@study ~]$ cat [-AbEnTv] |
tac (反向列示)
cat的相反用法
nl (添加行号打印)
1 | [root@study ~]$ nl [-bnw] 文件 |
可翻页检视
more (一页一页翻动)
- 空白键 (space):代表向下翻一页;
- Enter :代表向下翻“一行”;
- /字串 :代表在这个显示的内容当中,向下搜寻“字串”这个关键字;
- :f :立刻显示出文件名以及目前显示的行数;
- q :代表立刻离开 more ,不再显示该文件内容。
- b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用,对管线无用。
less (一页一页翻动)
- 空白键 :向下翻动一页;
- [pagedown]:向下翻动一页;
- [pageup] :向上翻动一页;
- /字串 :向下搜寻“字串”的功能;
- ?字串 :向上搜寻“字串”的功能;
- n :重复前一个搜寻 (与 / 或 ? 有关!)
- N :反向的重复前一个搜寻 (与 / 或 ? 有关!)
- g :前进到这个数据的第一行去;
- G :前进到这个数据的最后一行去 (注意大小写);
- q :离开 less 这个程序;
数据撷取
head (取出前面几行)
1 | [root@study ~]$ head [-n number] 文件 |
tail (取出后面几行)
1 | [root@study ~]$ tail [-n number] 文件 |
非纯文本文件: od
1 | [root@study ~]$ od [-t TYPE] 文件 |
修改文件时间或创建新文件: touch
linux文件的三个时间:
- modification time (mtime): 当该文件的“内容数据”变更时,就会更新这个时间!内容数据指的是文件的内容,而不是文件的属性或权限喔!
- status time (ctime): 当该文件的“状态 (status)”改变时,就会更新这个时间,举例来说,像是权限与属性被更改了,都会更新这个时间啊。
- access time (atime): 当“该文件的内容被取用”时,就会更新这个读取时间(access)。举例来说,我们使用 cat 去读取 /etc/man_db.conf , 就会更新该文件的atime 了。
1 | [root@study ~]$ touch [-acdmt] 文件 |
文件与目录的默认权限与隐藏权限
文件默认权限:umask
1 | [root@study ~]$ umask |
- umask的利用与重要性:专题制作
1 | [root@study ~]$ umask 002 |
umask 对于新建文件与目录的默认权限是很有关系的!这个概念可以用在任何服务器上面, 尤其是未来在你架设文件服务器 (file server) ,举例来说, SAMBA Server或者是 FTP server 时, 都是很重要的观念!这牵涉到你的使用者是否能够将文件进一步利用的问题喔!不要等闲视之!
文件隐藏属性
chattr指令只能在Ext2/Ext3/Ext4的 Linux 传统文件系统上面完整生效, 其他的文件系统可能
就无法完整的支持这个指令了,例如 xfs 仅支持部份参数而已。
chattr (设置文件隐藏属性)
1 | [root@study ~]$ chattr [+-=][ASacdistu] 文件或目录名称 |
lsattr (显示文件隐藏属性)
1 | [root@study ~]$ lsattr [-adR] 文件或目录 |
文件特殊权限: SUID, SGID, SBIT
Set UID
当 s 这个标志出现在文件拥有者的 x 权限上时,例如刚刚提到的 /usr/bin/passwd 这个文件的权限状态:“-rwsr-xr-x”,此时就被称为 Set UID,简称为 SUID 的特殊权限。
- SUID 权限仅对二进制程序(binary program)有效;
- 执行者对于该程序需要具有 x 的可执行权限;
- 本权限仅在执行该程序的过程中有效 (run-time);
- 执行者将具有该程序拥有者 (owner) 的权限。
- SUID 不能用在shell script和目录上面。
Set GID
当s 在群组的 x 时则称为 Set GID, SGID
与 SUID 不同的是,SGID 可以针对文件或目录来设置!
对文件来说:
- SGID 对二进制程序有用;
- 程序执行者对于该程序来说,需具备 x 的权限;
- 执行者在执行的过程中将会获得该程序群组的支持!
对目录来说:
- 使用者若对于此目录具有 r 与 x 的权限时,该使用者能够进入此目录;
- 使用者在此目录下的有效群组(effective group)将会变成该目录的群组;
- 用途:若使用者在此目录下具有 w 的权限(可以新建文件),则使用者所创建的新文件,该新文件的群组与此目录的群组相同。
Sticky Bit
Sticky Bit, SBIT 目前只针对目录有效。
作用是:
- 当使用者对于此目录具有 w, x 权限,亦即具有写入的权限时;
- 当使用者在该目录下创建文件或目录时,仅有自己与 root 才有权力删除该文件
SUID/SGID/SBIT 权限设置
- 4 为 SUID
- 2 为 SGID
- 1 为 SBIT
假设要将一个文件权限改为-rwsr-xr-x
时,由于 s 在使用者权限中,所以是 SUID ,因此,在原先的 755 之前还要加上 4 ,也就是:chmod 4755 filename
来设置。
1 | [root@study ~]$ cd /tmp |
最后一个例子出现大写的 S 与 T ,是因为 s 与 t都是取代 x 这个权限的,但是下达的权限是 7666,也就是说, user,group 以及 others 都没有 x 这个可执行的标志( 因为 666 ),所以,这个 S, T 代表的就是“空的”,即都没有执行权限。
SUID 为 u+s ,而 SGID 为 g+s ,SBIT 则是 o+t 符号法
1 | # 设置权限成为 -rws--x--x 的模样: |
观察文件类型:file
1 | [root@study ~]$ file ~/.bashrc |
指令与文件的搜寻
指令文件名的搜寻
- which (寻找“可执行文件”)
1 | [root@study ~]$ which [-a] command |
文件文件名的搜寻
whereis (由一些特定的目录中寻找文件文件名)
1 | [root@study ~]$ whereis [-bmsu] 文件或目录名 |
locate / updatedb
1 | [root@study ~]$ locate [-ir] keyword |
更新 locate 数据库直接输入updatedb
就可以了!
updatedb
指令会去读取 /etc/updatedb.conf
这个配置文件的设置,然后再去硬盘里面进行搜寻文件名的动作, 最后就更新整个数据库文件啰!因为 updatedb
会去搜寻硬盘,所以当你执行 updatedb 时,可能会等待数分钟的时间喔!
updatedb
:根据/etc/updatedb.conf
的设置去搜寻系统硬盘内的文件名,并更新/var/lib/mlocate
内的数据库文件;locate
:依据/var/lib/mlocate
内的数据库记载,找出使用者输入的关键字文件名。
find
1 | [root@study ~]$ find [PATH] [option] [action] |
- +4代表大于等于5天前的文件名:
ex> find /var -mtime +4
- -4代表小于等于4天内的文件文件名:
ex> find /var -mtime -4
- 4则是代表4-5那一天的文件文件名:
ex> find /var -mtime 4
该范例中特殊的地方有 {}
以及 \
; 还有 -exec
这个关键字,这些东西的意义为:
{}
代表的是“由 find 找到的内容”,如上图所示,find
的结果会被放置到{}
位置中;-exec
一直到\;
是关键字,代表find
额外动作的开始-exec
到结束\;
,在这中间的就是 find 指令内的额外动作。 在本例中就是ls -l {}
啰!- 因为
;
在 bash 环境下是有特殊意义的,因此利用反斜线来跳脱。
回顾
让使用者能进入某目录成为“可工作目录”的基本权限为何:
- 可使用的指令:例如 cd 等变换工作目录的指令;
- 目录所需权限:使用者对这个目录至少需要具有 x 的权限
- 额外需求:如果使用者想要在这个目录内利用 ls 查阅文件名,则使用者对此目录还需要 r的权限。
使用者在某个目录内读取一个文件的基本权限为何?
- 可使用的指令:例如本章谈到的 cat, more, less等等
- 目录所需权限:使用者对这个目录至少需要具有 x 权限;
- 文件所需权限:使用者对文件至少需要具有 r 的权限才行!
让使用者可以修改一个文件的基本权限为何?
- 可使用的指令:例如 nano 或未来要介绍的 vi 编辑器等;
- 目录所需权限:使用者在该文件所在的目录至少要有 x 权限;
- 文件所需权限:使用者对该文件至少要有 r, w 权限
让一个使用者可以创建一个文件的基本权限为何?
- 目录所需权限:使用者在该目录要具有 w,x 的权限,重点在 w 啦!
让使用者进入某目录并执行该目录下的某个指令之基本权限为何?
- 目录所需权限:使用者在该目录至少要有 x 的权限;
- 文件所需权限:使用者在该文件至少需要有 x 的权限