type
status
date
slug
summary
tags
category
icon
password
这章主要学习目录间变换、 创建与删除目录、创建与删除文件,还有寻找文件、查阅文件内容
目录与路径
- 绝对路径:路径的写法“一定由根目录 / 写起”,例如: /usr/share/doc 这个目录。
- 相对路径:路径的写法“不是由 / 写起”,例如由 /usr/share/doc 要到 /usr/share/man 下面时,可以写成: “cd ../man”这就是相对路径的写法啦!相对路径意指“相对于目前工作目录的路径!”
对于文件名的正确性来说,“绝对路径的正确度要比较好~”。一般来说,鸟哥会建议你,如果是在写程序 (shell scripts) 来管理系统的条件下,务必使用绝对路径的写法。 怎么说呢?因为绝对路径的写法虽然比较麻烦,但是可以肯定这个写法绝对不会有问题。 如果使用相对路径在程序当中,则可能由于你执行的工作环境不同,导致一些问题的发生。 这个问题在工作调度(at, cron, 第十五章)当中尤其重要!这个现象我们在十二章、shell script时,会再次的提醒你喔! ^_^
目录的相关操作
. 代表此层目录,也可以使用 ./ 来表示
.. 代表上一层目录,也可以使用 ../ 来表示
- 代表前一个工作目录
~ 代表“目前使用者身份”所在的主文件夹
~account 代表 account 这个使用者的主文件夹(account是个帐号名称)
小插曲~ 根目录下是否存在上层目录(..)?在根目录下使用ls -al,你会发现目录.和目录..的属性完全一致,所以根目录的上层目录就是他自己~
关于可执行文件路径的变量: $PATH
当我们在执行一个指令的时候,举例来说“ls”好了,系统会依照PATH的设置去每个PATH定义的目录下搜寻文件名为ls的可可执行文件, 如果在PATH定义的目录中含有多个文件名为ls的可可执行文件,那么先搜寻到的同名指令先被执行!
令ls完整文件名为:/bin/ls(这是绝对路径),因为有PATH所以我们才可以在任何目录 下输入ls就能使用(/bin/ls)
查看PATH变量
usage: echo $PATH
echo有“显示、印出”的意思,而PATH 前面加的 $ 表示后面接的是变量,所以会显示出目前的 PATH !PATH一点是大写的

查询的结果路径用(:)隔开,每个目录有顺序之分。无论是root还是一般账号,都有/usr/bin这个目录在PATH变量内,所以在任意目录下都能执行ls。不同身份使用者默认的PATH不同,默认能够随意执行的指令也不同(如上图root与haitang)
配置PATH变量
usage: PATH="${PATH}:/dir"
将/dir加入到可执行文件搜寻路径PATH中。
小插曲~为什么 ${PATH} 搜寻的目录不加入本目录(当前目录,即.和~)?加入本目录的搜寻不是也不错?加入本目录指的是:PATH="${PATH}:./"答:如果在PATH中加入本目录(.)后,确实我们就能够在指令所在目录进行指令的执行了。 但是由于你的工作目录并非固定(常常会使用cd来切换到不同的目录), 因此能够执行的指令会有变动(因为每个目录下面的可可执行文件都不相同嘛!),这对使用者来说并非好事。另外,如果有个坏心使用者在/tmp下面做了一个指令,因为/tmp是大家都能够写入的环境,所以他当然可以这样做。 假设该指令可能会窃取使用者的一些数据,如果你使用root的身份来执行这个指令,那不是很糟糕? 如果这个指令的名称又是经常会被用到的ls时,那“中标”的概率就更高了!所以,为了安全起见,不建议将“.”加入PATH的搜寻目录中。
目录的相关操作
cd:变换目录
pwd:显示目前的目录
mkdir:创建一个新的目录
rmdir:删除一个空的目录
cd
cd是change directory的缩写,用于变换工作目录的指令。
pwd
pwd是Print Working Directory的缩写,显示当前所在目录的指令。
mkdir
make directory,创建新的目录,默认只能一次创建一层目录。例如要创建test/test2这样的多层目录就需要用到选项-p。默认的新建目录权限跟 umask 有关,我们在本章后头会加以介绍的。
常用的选项:
- m:直接设置文件的权限,不需要看默认权限 (umask) 的脸色~
- p :帮助你直接将所需要的目录(包含上层目录)递回创建起来!
rmdir
remove directory,删除“空”的目录。该指令需要一层一层删除,而且被删除的目录里面必定不能存在其他的目录或文件!
ls
默认显示:非隐藏文件的文件名,以文件名进行排序,文件名代表的颜色显示。
很多发行版已经默认将ll(L的小写)设置成为ls -l的意思了,实质是Bash shell 的 alias 功能。
cp
复制文件或目录。
常用选项:
如果来源文件有两个以上,则最后一个目的文件一定要是“目录”才行!

不加任何选项直接cp得到的文件,权限和属性会改变。如果要将文件所有特性都复制过来要加上-a
一般,如果我们去复制别人的数据 ,该文件你必须要有 read 的权限才行
我们总是希望复制到的数据最后是我们自己的,所以,在默认的条件中, cp 的来源文件与目的文件的权限是不同的,目的文件的拥有者通常会是指令操作者本身。举例来说, 上图中,由于我是 root 的身份,因此复制过来的文件拥有者与群组就改变成为 root 所有了!由于具有这个特性,因此当我们在进行备份的时候,某些需要特别注意的特殊权限文件, 例如密码档(/etc/shadow) 以及一些配置文件,就不能直接以 cp 来复制,而必须要加上 -a 或者是 -p 等等可以完整复制文件权限的选项才行!另外,如果你想要复制文件给其他的使用者, 也必须要注意到文件的权限(包含读、写、执行以及文件拥有者等等), 否则,其他人还是无法针对你给予的文件进行修订的动作喔!注意注意!
范例:若 ~/.bashrc 比 /tmp/bashrc 新才复制过来
[root@study tmp]# cp -u ~/.bashrc /tmp/bashrc
# 这个 -u 的特性,是在目标文件与来源文件有差异时,才会复制的。
# 所以,比较常被用于“备份”的工作当中喔! ^_^
rm
remove
范例:删除一个带有-开头的文件
"-" 后面接的是选项,因此,单纯的使用“ rm -aaa- ”系统的指令就会误判啦! 那如果使用后面会谈到的正则表达式时,还是会出问题的!所以,只能用避过首位字符是 "-" 的方法啦! 就是加上本目录“ ./ ”即可!如果 man rm 的话,其实还有一种方法,那就是“ rm -- -aaa- ”也可以啊!
mv
move,移动文件与目录,或更名。
usage: mv [option] source[source...] destination
如果有多个来源文件或目录,则最后一个目标文件一定是目录。
常用选项:
- f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖
- i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!
- u :若目标文件已经存在,且 source 比较新,才会更新 (update)
更名
将test更名为test2
引申:指令rename, 该指令专职进行多个文件名的同时更名,并非针对单一文件名变更,与mv不同。
取得目录名称与路径的文件名称
每个文件的完整文件名包含了前面的目录与最终的文件名,而每个文件名的长度都可以到达 255 个字符耶! 那么你怎么知道那个是文件名?那个是目录名?嘿嘿!就是利用斜线 (/) 来分辨啊! 其实,取得文件名或者是目录名称,一般的用途应该是在写程序的时候用来判断之用的啦~ 所以,这部分的指令可以用在第三篇内的 shell scripts 里头喔! 下面我们简单的以几个范例来谈一谈 basename 与 dirname 的用途!