Linux 基础(9) - 文件与目录管理

1. 目录与路径

1.1 相对路径与绝对路径

绝对路径:路径的写法『一定由根目录 / 写起』,例如: /usr/share/doc 这个目录。
相对路径:路径的写法『不是由 / 写起』,例如由 /usr/share/doc 要到 /usr/share/man 底下时,可以写成:『cd ../man』这就是相对路径的写法啦!相对路径意指『相对于目前工作目录的路径!』

1.2 目录的相关操作

常见的处理目录的指令:
cd:变换目录
pwd(Print Working Directory 的缩写):显示当前目录
mkdir:建立一个新的目录
mkdir [-mp] 目录名称
选项与参数:
-m :配置文件案的权限喔!直接设定,不需要看预设权限 (umask) 的脸色~
-p :帮助你直接将所需要的目录(包含上层目录)递归建立起来!

rmdir:删除一个空的目录
rmdir [-p] 目录名称
选项与参数:
-p :连同『上层』『空的』目录也一起删除

1.3 关于执行文件路径的变量: $PATH

我们知道查阅文件属性的指令 ls 完整文件名为:/bin/ls(这是绝对路径)。
那你会不会觉得很奇怪:『为什么我可以在任何地方执行/bin/ls 这个指令呢? 』
为什么我在任何目录下输入 ls 就一定可以显示出一些讯息而不会说找不到该 /bin/ls 指令呢?
这是因为环境变量PATH 的帮助所致呀
使用『echo $PATH』来看看到底有哪些目录被定义出来了

PATH(一定是大写)这个变量的内容是由一堆目录所组成的,每个目录中间用冒号(:)来隔开, 每个目录是有『顺序』之分的。
PATH需要知道几件事情:

  • 不同身份使用者预设的 PATH 不同,默认能够随意执行的指令也不同(如 root 与 zhangsan);
  • PATH 是可以修改的, PATH="${PATH}:/root";
  • 使用绝对路径或相对路径直接指定某个指令的文件名来执行,会比搜寻 PATH 来的正确;
  • 指令应该要放置到正确的目录下,执行才会比较方便;
  • 本目录(.)最好不要放到 PATH 当中。

2.文件与目录管理

文件与目录的管理上,包括『显示属性』、 『拷贝』、『删除文件』及『移动文件或目录』等等

2.1 文件与目录的检视 ls

ls [-aAdfFhilnrRSt] 文件名或目录名称..
ls [--color={never,auto,always}] 文件名或目录名称..
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)

2.2 复制文件或目录 cp

cp [-adfilprsu] 来源文件(source) 目标文件(destination)
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 等也复制了。
最后需要注意的,如果来源档有两个以上,则最后一个目的文件一定要是『目录』才行!

2.3 移除文件或目录 rm

rm [-fir] 文件或目录
选项与参数:
-f :就是 force 的意思,忽略不存在的文件,不会出现警告讯息;
-i :互动模式,在删除前会询问使用者是否动作
-r :递归删除啊!最常用在目录的删除了!这是非常危险的选项!!!

2.4 移动文件与目录,或更名 mv

mv [-fiu] source destination
mv [options] source1 source2 source3 .... directory
选项与参数:
-f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;
-i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!
-u :若目标文件已经存在,且 source 比较新,才会更新 (update)

3. 取得路径的文件名与目录名称

每个文件的完整档名包含了前面的目录与最终的文件名,而每个档名的长度都可以到达 255 个字符!

basename:就是最后的文档名称
dirname:就是文档的目录路径

4.文件内容查阅

最常使用的显示文件内容的指令:

  • cat 由第一行开始显示文件内容
  • tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!
  • nl 显示的时候,顺道输出行号!
  • more 一页一页的显示文件内容
  • less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
  • head 只看头几行
  • tail 只看尾巴几行
  • od 以二进制的方式读取文件内容!

4.1 cat

cat 是 Concatenate (连续) 的简写, 主要的功能是将一个文件的内容连续的印出在屏幕上面。
cat [-AbEnTv]
选项与参数:
-A :相当于 -vET 的整合选项,可列出一些特殊字符而不是空白而已;
-b :列出行号,仅针对非空白行做行号显示,空白行不标行号!
-E :将结尾的断行字符 $ 显示出来;
-n :打印出行号,连同空白行也会有行号,与 -b 的选项不同;
-T :将 [tab] 按键以 ^I 显示出来;
-v :列出一些看不出来的特殊字符

4.2 tac 反向列示

tac 刚好是将 cat 反写过来,所以他的功能就跟 cat 相反啦, cat 是由『第一行到最后一行连续显示在屏幕上』,而 tac 则是『 由最后一行到第一行反向在屏幕上显示出来 』

4.3 nl 添加行号打印

nl [-bnw] 文件
选项与参数:
-b :指定行号指定的方式,主要有两种:
-b a :表示不论是否为空行,也同样列出行号(类似 cat -n);
-b t :如果有空行,空的那一行不要列出行号(默认值);
-n :列出行号表示的方法,主要有三种:
-n ln :行号在屏幕的最左方显示;
-n rn :行号在自己字段的最右方显示,且不加 0 ;
-n rz :行号在自己字段的最右方显示,且加 0 ;
-w :行号字段的占用的字符数

4.4 可翻页检视

前面提到的 nl 与 cat, tac 等等,都是一次性的将数据一口气显示到屏幕上面,more 与 less可以进行一页一页翻动的指令。

4.4.1 more (一页一页翻动)

如果 more 后面接的文件内容行数大于屏幕输出的行数时, 就会出现类似上面的图示。
重点在最后一行,最后一行会显示出目前显示的百分比, 而且还可以在最后一行输入一些有用的指令喔!
在 more 这个程序的运作过程中,你有几个按键可以按的:

  • 空格键 (space):代表向下翻一页;
  • Enter :代表向下翻『一行』;
  • /字符串 :代表在这个显示的内容当中,向下搜寻『字符串』这个关键词;
  • :f :立刻显示出文件名以及目前显示的行数;
  • q :代表立刻离开 more ,不再显示该文件内容。
  • b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用,对管线无用。

4.4.2 less (一页一页翻动)

在 使用more 的时候,我们并没有办法向前面翻,只能往后面看,若使用了 less 就可以使用 [pageup] [pagedown] 等按键的功能来往前往后翻看文件。
可以输入的指令有:

  • 空格键 :向下翻动一页;
  • [pagedown]:向下翻动一页;
  • [pageup] :向上翻动一页;
  • /字符串 :向下搜寻『字符串』的功能;
  • ?字符串 :向上搜寻『字符串』的功能;
  • n :重复前一个搜寻 (与 / 或 ? 有关!)
  • N :反向的重复前一个搜寻 (与 / 或 ? 有关!)
  • g :前进到这个资料的第一行去;
  • G :前进到这个数据的最后一行去 (注意大小写);
  • q :离开 less 这个程序;

4.5 资料截取

我们可以将输出的资料作一个最简单的撷取,那就是取出文件前面几行 (head) 或取出后面几行 (tail) 文字的功能。
不过,要注意的是, head 与 tail 都是以『行』为单位来进行数据截取的!

4.5.1 head 取出前面几行

head [-n number] 文件
选项与参数: -n :后面接数字,代表显示几行的意思

4.5.2 tail 取出后面几行

tail [-n number] 文件
选项与参数:
-n :后面接数字,代表显示几行的意思
-f :表示持续侦测后面所接的档名,要等到按下[ctrl]-c 才会结束 tail 的侦测

4.6 非纯文本档: od

查阅非文本文件,举例来说,例如/usr/bin/passwd 这个执行档的内容时,由于执行档通常是 binary file,使用上头提到的指令来读取他的内容时会产生类似乱码的数据,可以利用 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 ;

4.7 修改文件时间或建置新档: touch

我们在使用 ls 这个指令时,每个文件在 linux 底下都会记录许多的时间参数, 其实是有三个主要的变动时间,那么三个时间的意义是什么呢?

  • 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]


『ll』这个指令(两个英文 L 的小写),这个指令其实就是『ls -l』的意思, ll 本身不存在,是被『做出来』的一个命令别名。这里先知道 ll="ls -l"即可。
至于分号『 ; 』则代表连续指令的下达啦!你可以在一行指令当中写入多重指令, 这些指令可以『依序』执行。
由上面的指令我们会知道 ll 那一行有三个指令被下达在同一行中。

通过 touch 这个指令,我们可以轻易的修订文件的日期与时间,并且也可以建立一个空的文件。
不过要注意的是,即使我们复制一个文件时,复制所有的属性,但也没有办法复制 ctime 这个属性的。 ctime 可以记录这个文件最近的状态 (status) 被改变的时间。
我们平时看的文件属性中,比较重要的还是属于那个 mtime ,我们关心的常常是这个文件的『内容』是什么时候被更动的。
touch 这个指令最常被使用的情况是:

  • 建立一个空的文件;
  • 将某个文件日期修订为目前 (mtime 与 atime)

4.8 文件预设权限:umask

umask 就是指定 『目前用户在建立文件或目录时候的权限默认值』

查阅的方式有两种,一种可以直接输入 umask ,就可以看到数字型态的权限设定分数, 一种则是加入 -S (Symbolic) 这个选项,就会以符号类型的方式来显示出权限了!
奇怪的是,怎么 umask 会有四组数字啊?不是只有三组吗?是没错啦。 第一组是特殊权限用的,我们先不要理他。

4.9 观察文件类型:file

file 这个指令来检阅文件的基本数据,例如是属于 ASCII 或者是 data 文件,或者是 binary ,且其中有没有使用到动态函式库 (share library) 等等的信息。

5. 指令与文件的搜寻

5.1 which 脚本文件名的搜寻,寻找『执行档』

which [-a] command
选项或参数:
-a :将所有由 PATH 目录中可以找到的指令均列出,而不止第一个被找到的指令名称

which 预设是找 PATH 内所规范的目录,history 是 『bash 内建的指令』,所以没有找到。

5.2 文件档名的搜寻

whereis 由一些特定的目录中寻找文件文件名
whereis [-bmsu] 文件或目录名
选项与参数:
-l :可以列出 whereis 会去查询的几个主要目录而已
-b :只找 binary 格式的文件
-m :只找在说明文件 manual 路径下的文件
-s :只找 source 来源文件
-u :搜寻不在上述三个项目当中的其他特殊文件

whereis 主要是针对 /bin /sbin 底下的执行档, 以及 /usr/share/man 底下的 man page 文件,跟几个比较特定的目录来处理而已,所以速度比较快。
想要知道 whereis 到底查了多少目录?可以使用 whereis -l 来查看。

locate [-ir] keyword
选项与参数:
-i :忽略大小写的差异;
-c :不输出档名,仅计算找到的文件数量
-l :仅输出几行的意思,例如输出五行则是 -l 5
-S :输出 locate 所使用的数据库文件的相关信息,包括该数据库纪录的文件/目录数量等
-r :后面可接正规表示法的显示方式

locate 来寻找数据的时候特别的快, 这是因为 locate 寻找的数据是由『已建立的数据库 /var/lib/mlocate/』 里面的数据所搜寻到的。
当你新建立起来的文件, 却还在数据库更新之前搜寻该文件,那么 locate 会告诉你『找不到!』,因为必须要更新数据库。
updatedb 指令会去读取 /etc/updatedb.conf 这个配置文件的设定,然后再去硬盘里面进行搜寻文件名的动作, 最后就更新整个数据库文件。
因为 updatedb 会去搜寻硬盘,所以当你执行 updatedb 时,可能会等待数分钟的时间喔。
updatedb:根据 /etc/updatedb.conf 的设定去搜寻系统硬盘内的文件名,并更新 /var/lib/mlocate 内的数据库文件;
locate:依据 /var/lib/mlocate 内的数据库记载,找出用户输入的关键词文件名。

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 为使用者账号名称喔
    -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 :将结果打印到屏幕上,这个动作是预设动作!

posted @ 2021-12-03 13:39  自然有道  阅读(124)  评论(0编辑  收藏  举报