目录和文件操作
当前工作目录
我们在命令行里执行命令的时候,都有一个 当前目录(也叫工作目录)
,就是我们所在的目录。
当用户刚登录系统时,当前工作目录是用户的 home目录
。
root用户的home目录,是 /root
其他用户home目录,是在创建用户的时候 指定产生的,一般是 /home/用户名
比如你是用户 byhy,home目录通常就是 /home/byhy
当前目录下面的所有文件都可以直接访问, 假设当前目录 下面有个文件 a.txt。 要用vi编辑它,就可以直接执行vi a.txt
查看当前目录使用命令 pwd
,比如
改变当前目录用命令 cd
比如,
改变当前目录为package目录(这个动作也称之为进入到package目录), 就执行命令 cd package
改变当前路径到根目录 就执行命令 cd /
绝对路径与相对路径
我们命令行要操作一个文件(或者目录),必须给出这个文件的路径。路径分为:
● 绝对路径: 绝对路径 开始于根目录,沿着目录层级,一直到达所期望的目录或文件。
比如下图
其 中的 photos(假设它是个目录) 的绝对路径 就是 /home/jono/photos
我们要进入到 photos这个目录,就执行命令 cd /home/jono/photos
● 相对路径:
相对路径相对的是 当前目录。
在使用相对路径的过程中, 经常用到一对特殊符号 .
(点) 和 ..
(两个点)。
符号 .
指的是当前目录,..
指的是当前目录的父目录。
根据上面的图,假如当前目录为 jono ,如果要用相对路径切换到photos,就这样写 cd ./photos
,也可以直接写 cd photos
,
假如当前目录为 cory ,如果要用相对路径切换到 photos,就这样写 cd ../jono/photos
。其中 两个点 ..
表示上级目录。当然也可以使用绝对路径 cd /home/jono/photos
查看目录和文件
查看目录内容 或者某个文件的属性 使用命令 ls
ls 可能是用户最常使用的命令。通过它,我们可以知道目录里面包含的内容,也可以知道 文件和目录的 属性。
只要简单的输入 ls 就能看到 当前目录下所包含的文件和子目录列表。
比如上图中,我们就发现当前目录下,有一个 目录 , 有两个文件 Python-3.6.8.tgz readme.txt
, 还有 一个目录 Python-3.6.8
为什么呈现出不同的颜色?Linux系统可以根据 的类型(文件还是目录)和 扩展名 决定 列出 时的颜色。这些都是可以配置的。
除了当前工作目录以外,也可以指定要列出内容的目录,就像这样:
我们经常使用 ls 命令的“-l”选项,这样可以显示出更多的信息:
[byhy@iztqz ~]$ ls -l
total 8
-rw-rw-r-- 1 byhy byhy 13 May 10 10:36 byhy.txt
drwxrwxr-x 2 byhy byhy 4096 Apr 17 11:55 frontend
各个字段的含义如下:
-rw-r--r--
文件的访问权限。第一个字符指明文件类型。在不同类型之间, 开头的“-”说明是一个普通文件,“d”表明是一个目录。其后三个字符是文件所有者的 访问权限,再其后的三个字符是文件所属组中成员的访问权限,最后三个字符是其他人的访问权限。这个字段的含义在后面用户权限那一章会详细讲解。
1
文件的硬链接数目。
byhy
文件所有者的用户名。
byhy
文件所属用户组的名字。
13
以字节数表示的文件大小。
May 10 10:36
上次修改文件的时间和日期。
byhy.txt
文件名。
查看文本文件内容
查看文本文件的内容除了我们之前提到过的用vi编辑器外,对于比较短的文件, 可以直接用命令cat将文件的内容显示到屏幕上。
比如
说明byhy.txt 的文件内容就是 一行 byhy testing
创建目录
mkdir 命令是用来创建目录的。
例如
会在当前目录下,创建一个名为"byhy1"的目录,而
会创建三个目录,名为 byhy1, byhy2, byhy3。
如果我们要创建好几层的目录,比如 /root/byhy/python/lesson1,
直接这样写命令 mkdir /root/byhy/python/lesson1
shell 会报错,因为系统中可能还 没有 /root/byhy/python 这个目录。
一种方法是:我们 依次 创建 每一级目录, 像这样
更简单的方法是,使用参数 -p
删除文件和目录
rm 命令用来 删除 文件和目录。
rm 命令后面 直接加上要删除的文件,比如
当我们要删除目录的时候 ,需要加上 -r 选项,否则会报错,如下所示
要这样写
-r 参数 也可以详细的写成 --recursive 。 它表示要 递归地删除文件。 这意味着,如果要删除一个目录,而此目录 又包含子目录,那么子目录也会被删除。
通常 -r 和 -f 参数会一起使用。
-f 参数 也可以详细的写成--force 。 它表示忽视不存在的文件,不显示提示信息。
比如:
如果文件 file1,或目录 dir1 不存在的话,rm 仍会继续执行,不会报错
执行 rm 操作 要非常小心, rm 不像Windows里面有回收站,一旦你用 rm 删除了一些东西,想再恢复是相当的麻烦的。
您需要高效学习,找工作? 点击咨询 报名实战班
点击查看学员就业情况
通配符
当前目录下有这样一些文件
我们要删除 其中 所有 以file开头, 扩展名为 .jpg 的文件,怎么办?
当然可以
但是如果 这样的文件有上百个, 敲起来是非常麻烦的。
Linux 提供了一组特殊字符来匹配 文件名中的各部分内容。
这些特殊字符叫做 通配符
。
上面的例子,我们可以这样写
- 匹配任意多个字符(包括零个或一个), 这样是不是,方便多了?
常用的通配符有下面:
*
匹配任意 多个
字符(包括零个或一个)
?
匹配任意 一个
字符(不包括零个)
[abcd]
匹配abcd中任意一个字符
下面是一些示例的用法
*
表示 所有文件(或目录)
by*
表示 文件名以“by”开头的文件(或目录)
by*.py
表示 以"by"开头,中间有任意多个字符,并以".py"结尾的文件(或目录)
byhy????
表示 以“byhy”开头,其后紧接着 4个字符
的文件(或目录)
[byh]*
表示 文件名以"b","y",或"h"开头的文件(或目录)
byhy[0-9][0-9]
表示 以"byhy"开头,并紧接着2个数字的文件(或目录)
很多 Linux命令,只要它们使用的参数是文件名,都可以使用通配符, 比如 ls、cp、rm、mv
等等
大家要注意:rm命令时,使用通配符特别要小心。 很多人 曾经 为此 流过 悔恨的泪水。
比如,你想删除一个目录中的所有 jpg 文件。你应该这样写 rm *.jpg
如果你不小心在 “*” 和 “.jpg” 之间多输入了一个空格,就像这样: rm * .jpg
这个 rm 命令会删除目录中的所有文件,还会提示没有文件叫做 “.jpg”。
所以,白月黑羽建议大家:只要你使用 rm 命令里面有通配符, 一定要在执行之前 慎重的 思考 10秒钟以上, 再敲回车键。
复制文件和目录
cp 命令, 用来 复制文件或者目录。
假设 byhy1 是一个文件,我们可以 这样
如果 byhy2 这个文件 不存在, 上面的命令会创建一个新文件 byhy2 ,并且把 byhy1内容 拷贝到byhy2中。
如果 byhy2 已经存在了, 上面的命令会直接把 byhy1内容 拷贝到byhy2中, 就是说会覆盖byhy2 原来的内容。
如果我们要拷贝的是一个目录, 则 需要加上 -r 选项
比如
指定 -r 或者 --recursive 会递归地复制目录及目录中的内容。就是说,如果 frontend 里面有好多级子目录和文件,全部都会被拷贝过去。
可以拷贝 文件或者目录到 另外一个目录中,比如
cp -r file1 dir1 dir2
就是复制文件 file1 和 目录dir1 到目录 dir2中。目录 dir2 必须存在。
再比如 cp dir1/* dir2
这里使用通配符,可以把目录 dir1 中的所有文件都 复制到目录 dir2 中。 dir2 必须已经存在。
移动文件目录、重命名文件目录
mv 命令可以 移动
文件或者目录, 也可以 重命名
文件或者目录
mv 使用方法与 cp 很相像。
假设 byhy1 是一个文件,我们可以 这样
如果 byhy2 这个文件 不存在, 上面的命令会 把文件 byhy1 改名为 byhy2 ,并且把 byhy1内容 拷贝到byhy2中。
如果 byhy2 已经存在了, 上面的命令会把文件 byhy1 改名为 byhy2, 等于删除了原来的 byhy2。
假设 dir1 是一个目录,我们可以执行
如果目录 dir2 不存在,就会把 dir1目录 改名为 dir2。
如果目录 dir2 存在,就会把 dir1(及它的内容)到目录 dir2。
假设 byhy1 是一个文件,dir1 是一个目录,我们可以执行
这样写的话, 如果目录 dir2 存在,就会 移动文件 byhy1 和 目录 dir1(及它的内容)到目录 dir2。
在文件中查找字符串
在 Linux 操作过程中,经常需要在一个文本文件中 查询包含特定关键字的那些行的信息。
比如,我们需要在 日志文件 django.log 中查看所有包含了 Error 关键字的行。
当然,我们可以使用vi打开这个文件,然后再底行模式输入 /Error
查看。
更快捷的方式,就是直接 使用 grep命令
比如
$ grep Error django.log
1130_15:57:28 Internal Server Error: /api/cust/pages
raise ExpiredSignatureError('Signature has expired')
jwt.exceptions.ExpiredSignatureError: Signature has expired
1130_16:00:20 Internal Server Error: /api/cust/pages
raise ExpiredSignatureError('Signature has expired')
jwt.exceptions.ExpiredSignatureError: Signature has expired
1130_16:08:38 Internal Server Error: /api/cust/pages
raise ExpiredSignatureError('Signature has expired')
jwt.exceptions.ExpiredSignatureError: Signature has expired
如果你想同时显示 各行的行号,可以加上参数 -n
比如
$ grep Error django.log -n
1:1130_15:57:28 Internal Server Error: /api/cust/pages
18: raise ExpiredSignatureError('Signature has expired')
19:jwt.exceptions.ExpiredSignatureError: Signature has expired
20:1130_16:00:20 Internal Server Error: /api/cust/pages
37: raise ExpiredSignatureError('Signature has expired')
38:jwt.exceptions.ExpiredSignatureError: Signature has expired
39:1130_16:08:38 Internal Server Error: /api/cust/pages
56: raise ExpiredSignatureError('Signature has expired')
57:jwt.exceptions.ExpiredSignatureError: Signature has expired
如果你要查找的不仅仅是Error 这样的 一个单词,而是一段句子,比如 要找 Internal Server Error
就需要使用双引号,这样写
$ grep "Internal Server Error" django.log -n
1:1130_15:57:28 Internal Server Error: /api/cust/pages
20:1130_16:00:20 Internal Server Error: /api/cust/pages
39:1130_16:08:38 Internal Server Error: /api/cust/pages
58:1130_16:09:16 Internal Server Error: /api/cust/pages