最近有几天在忙自己的事,所以没写博客,今天调整好状态,继续开始写吧!
经过了上一篇章中对Linux目录与文件配置的洗礼后,这一篇的内容便是对文件与目录的基本操作
1 目录与路径
1.1 相对路径与绝对路径
谈到目录与文件的操作,不得不提的就是路径问题,
因为在Linux系统中,文件系统是用一层一层的目录串起来的,那么,要进行文件与目录的操作
路径就显得十分重要了!
如上一篇所讲,路径分为绝对路径与相对路径,两者的概念,请去上一篇学习.
两者最大的区别在于:**相对路径是相对于当前目录来讲,而绝对路径则是完整的路径名**gyigegongzuo
用处:
相对路径:再进行日常操作时,使用相对路径就较为方便,比如
有/home/Evilcrow/Document/Kitch,,/home/Evilcrow/Document/Option,
要从Kitch目录切换至option目录怎么办? 用
cd ../option
就显得很方便
绝对路径:进行系统管理,程序编写时,准确无误
就像之前说的一样,使用绝对路径是十分准确的,尤其是进行程序的编写时,使用绝对路径尤为重要!
1.2 目录的基本操作
接下来谈谈目录的基本操作
首先来记忆一些比较特殊,但是又十分好用的目录名
. 表示当前目录
.. 表示上级目录
~ 表示当前用户的主文件夹
~user 表示user用户的主文件夹
— 表示上一个目录
其中,“—”表示”上一级目录”,这个用法,在进行两个目录间的切换时十分方便,需要常用进行熟悉
注:根目录是没有上层目录的,即[Evilcrow@Evilcrow /] $ cd ..
仍为根目录
介绍几个常用的目录命令
cd:切换目录 (change dictionary)
pwd:显示当前目录的路径
mkdir: 在当前目录下创建一个新目录 (make dictionary)
rmdir: 删除一个”空”目录 (rm dictionary)
cd 命令,
进行目录的切换 用法:
[Evilcrow@Evilcrow ~]$ cd [相对路径/绝对路径]
其中注意,~,—,两个特殊目录,同时,
[Evilcrow@Evilcrow]$ cd
命令,==[Ecilcorw@Evilcorw]$ cd ~
命令
注:进行cd命令,切换目录时,cd 与目录路径之间有一个空格,同时我们建议使用[Tab]补齐功能
pwd 命令
显示当前目录路径,用法
[Evilcrow@Evilcrow]$ pwd [-P]
其中,直接使用pwd即可显示当前目录路径,为绝对路径
[-P]选项的作用是显示出文件的真实路径,
举个例子,比如,/var/mail 与 /var/spool/mail
/var/mail连接文件,加上-P参数后,便会完整显示文件路径,不会显示连接文件(可以勉强理解为快捷方式)
pwd -P可以使我们获取到文件的完整路径名
mkdir 命令
创建一个新目录
[Evilcrow@Evilcrow]$mkdir 目录名
重要参数
-m 可以直接进行文件权限的配置 ,不用按照umask的默认权限进行设置
-p 有时我们需要进行多级目录的创建,使用此参数,可以进行目录的递归创建
举个例子:
mkdir -m 744 test
可以自己进行
mkdir -p /home/Evilcrow/test/test1/test2
即可进行多级目录的创建
注意:-p参数虽然十分好用,但是一旦你的参数名混乱,就王炸!,后续的处理十分麻烦
rmdir 命令
删除一个空目录
谈到此命令时,必须强调一点就是,删除一个空目录!
即rmdir命令,只是用来删除空目录的!,若目录不为空,不能进行删除!
重要参数:-p参数是用来进行多级目录删除的,若删除此目录后,..目录也为空则一同删除
那么,问题来了,要是目录不为空,怎么一次性删除目录 ?
这时,就要使用到rm -r的命令了
[Evilcrow@Evilcrow]$ rm -r test,可以直接递归删除掉test及其test以下所有目录!
但是,-r,这个递归参数的使用需要十分注意!
1.3 关于路径的变量:PATH
谈到路径的切换,那么为什么在任何地方都可以执行/bin/ls的命令呢?
这就要提到路径PATH的配置,
我们再使用某一个命令时,系统会根据我们自己PATH的配置,去到相应的目录下
需找该文件,之后就进行命令的使用,那么,PATH很重要,没错吧?
那么,我们如何查看目前的PATH配置呢?
使用echo $PATH
命令
echo,有”显示,打印出”的作用,而$则是,之后跟的是变量的标识符
如何上图所示
PATH中,包含了好多的路径配置,用“:”进行路径的区分,对于一个命令,先查找到哪里
他的PATH就是哪里
有时候,某些命令的PATH是没有划给user的,但是你仍然可以通过
使用绝对路径直接访问文件进行命令调用!
亦即是说,如果,目标命令没有添加至PATH中,那么即使是root用户,也不能直接使用此命令!
关于PATH,我们有以下的建议:
不同用户的默认PATH是不同的,所以默认能执行的命令也是不同的
承上一条,PATH是可以修改的,我们可以根据自己的需求进行PATH的修改
可以直接使用绝对路径的方式进行命令的访问,这样来的更快!
由以上几点,命令必须在PATH中配置正确的命令,才能进行正常方便的使用
最后一点,不建议将”.”与”..”这两级目录添加至PATH路径中!
2 文件与目录管理
谈到文件与目录的管理,就是指”移动,复制,重命名,显示属性”等几方面的内容
2.1 文件/目录的查看操作
针对文件/目录的查看操作,用到的命令,想必已经很熟悉了
ls (list)
而ls命令的参数就有很多了,下面一一详细说明,其中加粗的是常用参数
**1. -a 全部文件,连同隐藏文件也一一显示出来(.开头的即为隐藏文件)**
2.-A 作用同-a参数,但是并不会列出(.与..)两个目录
**3. 仅列出目录本身,而不会列出目录的文件数据**
4.-f直接列出文件的名,并不会进行排序,(使用默认排序)
**5. -F根据文件类型,自动附加文件结构**
*可执行文件, /目录, =代表socket文件, | 表示管道FIFO文件
6.-h,将文件容量以人们常用的方式读出,GB,KB等
7.-i 列出i-node的号码
**8.-l列出长数据串,其中包含了目录/文件的各种信息**
9.-n 列出UID与GID,而非用户名与用户组
10.-r,将排序结果反向输出
11.-R,连同子目录的内容一起显示出来
12.-S,将文件按照文件容量的大小进行排序,而非文件名
13.-t,依照时间名进行排序,而非文件名
14.--color=never/auto/always,总是,从不,自动显示颜色
15.--full-time,完整的时间进行显示
16.--time=atime/ctime(mtime为默认显示),显示权限改变时间/引用时间
从上面就可以看出:ls的命令十分之多,但是,这么多的命令,与你日常经常用到的,
基本上只有4,5和左右,所以熟练掌握常用参数,了解其他参数
正如之前所谈到的,所有的命令,对于他们的参数都是可以进行合并的,比如-alF
但是,请注意,像–color,–time这种完整名的参数,就不能和其他的合并,而要自己单独写
注:由于ls -l异常频繁的使用,在.bashrc文件中,已经用alias加入ll表示ls-l了!
2.2 复制,删除与移动
前一小节谈到的是,文件/目录的查看,那么,这一节就是对文件/目录的操作了!
cp 命令
复制文件,对文件进行更新,创建连接文件,复制整个目录
[Evilcrow@Evilcrow]$ cp 源文件 目标文件
对于cp命令,其参数也是十分之多,
-a == -pdr,集合参数
-d 对连接文件进行复制时,复制连接文件,而并非文件本身
-f fource强制的意思,即如果目标文件存在且无法打开,则删除后再尝试一次
-i,若目标文件已经存在,那么在操作开始前会进行操作是否进行的访问
-l,进行硬连接文件的创建,而非复制文件本体,硬连接
-p,连同文件的属性一起复制过去,而非使用默认的属性,即umask
-r,持续性的递归复制,常用于目录的复制行为
-s,复制成为”符号链接文件”,即”快捷方式”,软连接
-u,目标文件比源文件版本低的时候,会进行文件的更新
重要的内容,如果源文件由两个以上,则最后一个参数,一定是目录!表示多个文件复制进入同一目录
其中,请十分注意-a,-p参数,不同的用户,进行的操作,最后导致的结果会有较大差异
注意:这里要提到cp命令的两个默认属性:
1.cp命令进行文件的复制时,会改变用户名,用户名等属性,所以,不仅有-p,-r命令,更要有-a
2.cp命令再进行复制时,以源文件为主,意思是默认并不会复制符号连接文件,会去复制源文件
所以,要进行”快捷方式”的复制时,需要加上-d参数
另外很重要的一点,再使用-a保留文件属性时,使用root用户,一般用户没有修改用户,用户组的权限
rm 命令
移除文件/目录的命令
[Evilcrow@Evilcrow]$rm 文件/目录名
rm命令的参数不是很多,但是很关键
-f 同之前cp命令的参数,强制进行,忽略警告消息
-i 互动模式,即在删除文件前进行询问(root下的默认模式)
-r 递归删除,当目录不为空的时候,可以使用递归参数进行删除
建议:一般进行删除操作时,可以加上-i,仔细检查文件名,以防误删操作
通配符 *,此符号如其名,通配,可以表示任何字符{..}无穷个
意即,File*表示,以File开头的文件,*File表示,以File结尾的文件
再介绍两个技巧:
1.删除以-开头的文件,-之后接的是参数,那么误判该怎么处理?
很简单,使用.本目录即可化解,eg: ./-aaa-,即可表示本目录下的-aaa-文件
在man中,还提供了一种方法,rm – -aaa-
2.如何忽略-i参数,默认真的有时候有点烦
在命令前加上反斜杠\即可,eg:\rm test.即可不进行互动直接删除
mv 命令
进行文件/目录的移动,重命名的操作
[Evilcrow@Evilcrow]$ mv 源文件 目标文件
[Evilcrow@Evilcrow]$ mv 源文件 源文件 源文件.... 目标目录
参数与rm基本相同,略有差异
-f fource强制,若目标文件已经存在,不会进行询问,而是直接进行覆盖
-i 互动默认,会进行询问
-u 不同于-r的递归,(mv怎么能递归…),若源文件更新,则进行目标文件的更新
当两个文件/目录在同一个目录下时.,在进行mv命令的调用,即为重命名操作
rename可以进行多个文件的重命名,以后再进行详述
mv主要功能即在于进行文件的移动和重命名!
2.3 取得文件的路径名和文件名
看到这个标题,你会想到,之前不是有pwd命令进行路径的显示吗?
但是,此命令是对于长串的文件名(最长可达4096字符)进行文件名和路径名(目录名)的区别的命令
[Evilcrow@Evilcrow]$basename 绝对路径
获得文件名
[Evilcrow@Evilcrow]$dirname 绝对路径
获得路径名
这两个命令可能你看上去比较鸡肋,说出来你可能不信,我也觉得鸡肋
但是,则会两条命令既然存在就有他存在的意义,主要是用于程序中进行判断的命令.
3.文件内容查阅
上一节提到的是文件/目录的操作,实现完毕后,我们就来进行文件的查阅
首先预告一下,文件查阅的命令:cat,tac,more,less,head,tail,od,nl
3.1 直接查阅文件内容
直接查看文件内容可以使用cat,tac,nl几个命令进行查看
cat 命令
查阅文件内容的功能
cat命令具有几个很实用的参数
-A 相当于-vET,同样地,是个聚合参数
-b,可以列出行号,但是指针对于非空白行,空白行不列出行号
-E,将结尾的断行字符(\n)以”$”的形式输出
-n,完整的打引出行号,即使空白行也打引出行号
-T,将[Tab]制表符按照^T,进行打印
-v,列出一些看不出来的特殊字符
cat命令实际上是”Concatenate”即在屏幕上连续的显示文件内容
tac 命令
可能眼尖的你也发现了,tac命令正是cat命令的逆置!
tac命令的作用也正是与cat命令相反,将内容反向输出至屏幕上
两者的参数也都是相同的
但是,即便如此,还是不推荐平时使用cat和tac命令,因为一旦文件内容过长,那么
屏幕上并不能完整的显示出文件的内容,很不方便
而使用more,less,nl等命令,则十分方便
nl 命令
添加行号打印的功能
[Evilcrow@Evilcrow]$ nl 文件
,即可在屏幕上显示文件内容
-b 指定行号指定的方式,有两种:
-b a,不论有无空行,都显示行号 cat -n
-b t,空行不显示行号,(默认值)
-n 列出行号表示的方法
-n ln 行号在屏幕左边显示
-n rn 行号在右边显示,不加0
-n rz 行号在右边显示,加0
-w :行号字符段占用的位数(即行号0的个数)
使用nl命令时,多个参数组合使用,比如“`[Evilcrow@Evilcrow]$nl -b a -n rz -w 3
3.2 翻页查看文件内容
刚才所介绍的,cat,tac,nl三个命令都是将文件内容输出到屏幕上的命令
当文件内容很多的时候,毕竟不方便,所以,就有以下的翻页查看命令
more 命令
一页一页的翻动
more使用的时候,可以作为一个程序对待,类似与man,可以进行操作
[Evilcrow@Evilcrow]$ more 文件
Space 向下翻一页
Enter 向下一行
/字符串 向下查找字符串
:f 立刻显示出文件名及当前行数
q 退出more程序
b或者Ctrl-b 进行退格
more命令只要按照以上要求操作就好
less 命令
less与more大同小异,只不过less功能更具有弹性,所以推荐使用less
Space 向下翻页
[Pagedown] 向下一页
[Pageup] 向上一页
/string 向下搜索字符串
?string 向上搜索字符串
n 向下一个查询
N 向上一个查询
q 离开less程序
以上即为less命令的操作,
是不是和man的用法很像啊?
对,没错,man文档实际上就是用less显示在屏幕上的
3.3 数据选取
以上的几个命令都是对文件内容的显示,那么如果我取出文件中的部分内容使用,怎么办呢?
head 与 tail命令
从文件开头/末尾取出一定行的内容(默认值为10行)
[Evilcrow@Evilcrow]$ head/tail [-number] 文件
其中number即为你指定后想要取出的行数
注意,number -,+的使用,对于head,-number表示减去后面若干行输出
而对于,tail +number表示减去前面若干行进行输出
这很方便在不知道文件总行数的情况下进行操作,而且,可以通过管道这两个命令联合使用
3.4 非纯文本文件
od 命令
将文件按照二进制进行读取
由C语言文件的知识可知,计算机中文件分为文本与二进制,之前的命令都是对文本文件适用
对于二进制文件,就得使用od命令了
[Evilcrow@Evilcrow]$ od [-参数] 文件
a :利用默认字符进行输出
c :利用ASCII码进行输出
d[SIZE] :利用十进制输出,每个整数SIZE个字节
o[SIZE] :利用八进制输出,每个整数SIZE个字节
x[SIZE] :利用十六进制进行输出,每个整数SIZE个字节
活用以上的参数,可以有效的处理二进制文件!
举个例子:[Evilcrow@EVilcrow]$ od -oCc test
意思即是,使用八进制输出,每个整数12个字节,按照ASCII码输出
3.5 创建文件与修改时间
之前讲了这么多的目录创建,现在该轮到文件的创建了
首先来了解几个概念:时间的几个概念
modification time(mtime):当文件的”数据内容”改变时,此时间刷新
status time(stime):当文件的权限发生改变的时候,此时间刷新
access time(atime):当此文件被引用,被访问时,此时间刷新
要查看这三个时间属性的方法,之前已经在ls的参数中提到过了–time=a/stime(mtime默认)
在系统的操作中,时间属性是很关键的!
那么,万一时间出错我们怎么修改呢?
touch 命令
用于新建文件,修改文件时间
[Evilcrow@Evilcrow]$ touch [-acdmt] 文件
-a 仅修改访问时间(atime)
-c 仅修该文件时间,若文件不存在,则不新建文件
-d 可以指定修改的日期,并非是当前的日期(默认),格式–date=”…..”
-m,仅修改mtime
-t 同-d,但是日期的格式为[YYMMDDhhmm]
注:平时最关心的时mtime,因为它记录了文件什么时候被修改。
注:可以在同一行中使用 ;来表示命令的顺序执行
touch最常用的情况:1.新建文件 2.修改文件日期为当前日期(mtime与atime)
PS:至此,Linux文件/目录的基本操作就告一段落了,但是你还记得吗?之前在文件属性中有10个字符
是不是匪夷所思呢?这就是文件的隐藏属性,属于下一篇探讨的内容了.
从这篇开始,换了新的输入法,同时合理使用了标题,我还会尽快使自己的博客风格成型的
06/16/2017