第6章 Linux 文件与目录管理
6.1 目录与路径
6.1.2 目录的相关操作
比较特殊的几个目录,需要记忆:
. 代表此层目录
.. 代表上一层目录
~ 代表目前使用者身份所在的家目录
~account 代表account这个使用者的家目录
特别注意:在所有目录下面都会存在的两个目录,分别是【.】【…】;根目录下面也有上层目录,只不过与根目录自己是一个目录
常见的处理目录的命令:
-
cd(change directory,切换目录)
语法:cd 相对路径或绝对路径 eg:当前用户是root cd ~ #进入家目录,/root cd ~xuan #进入用户xuan的家目录 cd .. #返回上一层目录 cd - #返回上一个工作目录 cd #进入家目录 cd /var/spool/mail #绝对路径写法,进入该目录 cd ../plymouth #相对路径写法
-
pwd(显示当前所在目录)
语法:pwd [-P] 选项与参数: -P:显示出真正的路径,而非使用链接路径
-
mkdir (建立新目录)
语法:mkdir [-mp] 目录的名称 选项与参数: -m:设置文件的权限 -p:帮你直接将所需的目录(包含上层目录)递归创建 eg1: 在tmp下面创建数个新目录 mkdir test mkdir -p test1/test2/test3/test4 eg2: 创建权限为 rwx--x--x 的目录 mkdir -m 711 test2
-
rmdir (删除“空”的目录)
语法:rmdir [-p] 目录名称 选项与参数: -p:连同上层“空的”目录也一起删除 eg: 删除上面刚创建的目录 rmdir test rmdir -p test1/test2/test3/test4
注意:目录必须要一层一层的删除才行,而且被删除的目录里面必定不能存在其他的目录或文件
6.1.3 关于执行文件路径的变量:$PATH
当执行一个命令时,如 ls,系统会依照PATH的设置去每个 PATH 定义的目录下查找文件名为 ls 的可执行文件,如果有多个文件名为 ls 的可执行文件,那么先查找到的同名命令先被执行
PATH 前面加的 $ 表示后面接的是变量
PATH 这个变量的内容是由一堆目录所组成,每个目录中间用冒号来隔开,每个目录有顺序之分
总结:
-
不同身份用户默认的 PATH 不同,默认能够随意执行的命令也不同
-
PATH 是可以修改的
PATH="${PATH}:/root"
-
使用绝对路径或相对路径直接指定某个命令的文件名来执行,会比查找 PATH 来的正确
-
命令应该要放置到正确的目录下,执行才会比较方便
-
本目录(.)最好不要放到 PATH 变量当中
6.2 文件与目录
6.2.1 文件与目录的查看:ls
语法:ls [参数] 文件名或目录名
选项与参数:全部使用man查看,只列几个常用的
-a:全部的文件,包括隐藏文件
-d:仅列出目录本身,而不是列出目录内的文件数据
-l:详细信息显示
6.2.2 复制、删除与移动:cp、rm、mv
-
cp(复制文件或目录、建立链接文件、比对两文件的新旧予以更新)
语法: cp [options] 源文件(source) 目标文件(destination) cp [options] source1 source2 source3 ... directory 选项与参数: -a:相当于-dr --preserve=all 的意思 -d:若源文件为链接文件属性,则复制链接文件属性而非文件本身 -i:若目标文件已经存在时,在覆盖时会先询问操作的进行 -p:连同文件的属性(权限、用户、时间)一起复制过去,而非使用默认属性(备份常用) -r:递归复制,用于目录的复制操作 --preserve=all:除了 -p 的权限相关参数外,还加入SELinux的属性,links、xattr等也复制 -s:复制成为符号链接文件,即快捷方式 -u:目标文件比源文件旧才更新目标文件,或目标文件不存在的情况下才复制 注意:如果源文件有两个以上,则最后一个目标文件一定要是“目录”才行
-
范例一:用root身份,将家目录下的任意文件复制到 /tmp下,并更名
-
范例二:切换到目录 /tmp,并将 /var/log/wtmp 复制到 /tmp 并观察属性
一般来说,我们如果去复制别人的数据(该文件必须有read权限才行)时,总是希望复制到的数据是我们自己的,所以在默认的条件中,cp 的源文件与目标文件的权限是不同的,目标文件的拥有者通常会是命令操作者本身
-
范例三:复制 /etc/ 这个目录下的所有内容到 /tmp 下面
想要权限保持不变可以加 -a 参数 -
范例四:将范例一复制的文件建立一个符号链接文件
-l 是硬链接;-s 是符号链接,即快捷方式 -
范例六:将范例四的 slink 文件复制成 slink1 slink2
没有加上任何选项时复制的是原始文件。而非链接文件的属性
若要复制链接文件的属性,就得要使用 -d 的选项 -
例题:能否使用 xuan 的身份,完整地复制 /var/log/wtmp,到目录 /tmp 中并更名
答:能够复制,但由于 xuan 的身份无法随意修改文件的拥有者与用户组,即使加上 -a 选项,也是无法完成完整权限的复制总之,由于 cp 有种种的文件属性与权限的特性,所以,在复制时,必须清楚地了解到:
- 是否需要完整的保留源文件的信息?
- 源文件是否为符号链接文件?
- 源文件是否为特殊的文件,例如 FIFO、socket等?
- 源文件是否为目录?
-
-
rm(删除文件或目录)
语法: rm [参数] 文件或目录 选项与参数: -f:强制删除,忽略不存在的文件,不会出现告警信息 -i:交互模式,在删除前会询问使用者是否操作(root身份默认加入此参数) -r:递归删除,最常用于目录的删除,这是非常危险的选项 范例一:将在cp范例中建立的bashrc删除掉 范例二:通过匹配符*的帮忙,将 /tmp 下面开头为bashrc的文件名通通删除 范例三:将cp范例中建立的/tmp/etc目录删除 在命令前加上反斜杠,可以忽略掉 alias 的指定选项 范例四:删除一个带有-开头的文件 所以文件名最好不要用-开头,系统会误判
-
mv(移动文件与目录,或重命名)
语法: mv [参数] source destination mv [参数] source1 source2 ... directory 选项与参数: -f:强制,如果目标文件已经存在,不会询问而直接覆盖 -i:若目标文件已经存在,就会询问是否覆盖 -u:若目标文件已经存在,且 source 比较新,才会更新 范例一:复制一文件,建立一目录,将文件移动到目录中 范例二:将刚刚目录重命名 还可以使用rename,可以进行多个文件名的同时重命名(更改其中相同名字的部分) 范例三:再建立两个文件,移动到目录中
6.2.3 获取路径的文件名与目录名称
6.3 文件内容查看
- cat 由第一行开始显示文件内容
- tac 从最后一行开始显示,可以看出 tac 是 cat 的到着写
- nl 显示的时候,同时输出行号
- more 一页一页地显示文件内容
- less 与 more 类似,但是比 more 更好的是,它可以往前翻页
- head 只看前面几行
- tail 只看后面几行
- od 以二进制的方式读取文件内容
6.3.1 直接查看文件内容
-
cat(concatenate)
语法: cat [参数] 选项与参数: -A:相当于 -vET 的整合选项,可列出一些特殊字符而不是空白而已 -b:列出行号,仅针对非空白行做行号显示 -E:将结尾的换行符 $ 显示出来 -n:打印出行号,连同空白行 -T:将 [Tab] 建以 ^I 显示出来 -v:列出一些看不出来的特殊符号
- tac
-
nl(添加行号打印)
语法: nl [参数] 文件 选项与参数: -b:指定行号指定的方式,主要由两种: -b a:表示不论是否为空行,也同样列出行号(类似 cat -n) -b t:如果有空行,空的那一行不要列出行号(默认值) -n:列出行号的表示方法,主要有三种: -n ln:行号在屏幕的最左方显示 -n rn:行号在自己栏位的最右方显示,且不加0 -n rz:行号在自己栏位的最右方显示,且加0 -w:行号栏位的占用的字符数
6.3.2 可翻页查看
-
more(一页一页翻动)
语法: more 文件名 eg: more /etc/man_db.conf
在 more 这个程序的运行过程中,有几个按键可以使用:
- 空格键:向下翻一页
- Enter:向下翻一行
- /字符串:在这个显示的内容当中,向下查找这个字符串的关键字,重复查找同一个字符串,按 n 即可
- :f:立刻显示出文件名以及目前显示的行数
- q:代表立刻离开
- b:往回翻页,不过此操作只对文件有用,对管道无用
-
less(一页一页翻动)
用法同 more
常用输入命令(全部可以用 man 查看):
- 空格键:向下翻动一页
- [pagedown]:向下翻动一页
- [pageup]:向上翻动一页
- /字符串:向下查找字符串
- ?字符串:向上查找字符串
- n:重复前一个查找(与/与?有关)
- N:反向的重复前一个查找
- g:前进到这个数据的第一行(查找的数据)
- G:前进到这个数据的最后一行
- q:离开这个程序
6.3.3 数据截取
-
head(取出前面几行)
语法: head [-n number] 文件 选项与参数: -n:后面接数字,代表显示几行的意思 不加参数默认显示10行 eg1: 显示前20行 head -n 20 /etc/man_db.conf eg2: 后面100行数据都不打印,只打印前面几行 head -n -100 /etc/man_db.conf -n 选项后面的参数若是负数,代表列出前面的所有行数,但不包括后面100行
-
tail(取出后面几行)
语法: tail [-n number] 文件 选项与参数: -n:后面接数字,代表显示几行的意思 -f:表示持续刷新显示后面所接文件中的内容,要等到按下 [ctrl] + c 才会结束 不加参数默认显示10行 eg: 显示后20行 tail -n 20 /etc/man_db.conf 显示100-结尾131行 tail -n +100 /etc/man_db.conf
例题
显示 /etc/man_db.conf 的11到20行,并显示行号
head -n 20 /etc/man_db.conf | tail -n 10 | cat -n
6.3.4 非纯文本文件:od
语法:
od [-t TYPE] 文件
选项或参数:
-t:后面可以接各种【类型(TYPE)】的输出:
a:利用默认字符来输出
c:使用ASCII字符来输出
d[size]:利用十进制来输出数据,每个整数占用 size Bytes
f[size]:利用浮点数值来输出数据,每个整数占用 size Bytes
o[size]:利用八进制来输出数据,每个整数占用 size Bytes
x[size]:利用十六进制来输出数据,每个整数占用 size Bytes
eg1:
使用ASCII方式显示内容
od -t c /etc/passwd
eg2:
将这个文件的内容以八进制列出存储值与ASCII的对照表
od -t oCc /etc/issue
6.3.5 修改文件时间或创建新文件:touch
-
修改时间(modification time,mtime)
当该文件的【内容数据】变更时,就会更新这个时间,内容数据指的是文件的内容,而不是文件的属性或权限
-
状态时间(status time,ctime)
当该文件的【状态】改变时,就会更新这个时间,举例来说,权限与属性被更改了,会更新
-
读取时间(access time,atime)
当【文件的内容被读取】时,就会更新这个时间,比如用 cat 读取文件时
默认情况下,ls 显示出来的是文件的 mtime
语法:
touch [-acdmt] 文件
选项与参数:
-a:仅自定义 access time
-c:仅修改文件的时间,若文件不存在则不建立新的文件
-d:后面可以接欲自定义的日期而非目前的日期,也可以使用 --date="日期或时间"
-m:仅修改 mtime
-t:后面可以接欲自定义的日期而非目前的日期,格式为 [YYYYMMDDhhmm]
范例一:新建一个空文件并观察
注意到,上面这个文件的大小是 0。在默认情况下,如果 touch 后面有接文件,则该文件的三个时间都会更新成目前的时间。若该文件不存在,则会主动建立一个空的文件
范例二&三:复制文件并检查日期,属性完全复制,并修改时间调整为两天前
总结:
通过 touch 这个命令,可以轻易地自定义文件的日期与时间,并且也可以建立一个新的文件。不过,需要注意的是,即使我们复制一个文件时,复制所有的属性,但也没有办法复制 ctime 这个属性。
touch 这个命令最常被使用的场景是:
- 建立一个空文件
- 将某个文件日期定义为目前(mtime 及 atime)