目录和文件操作

当前工作目录

点击这里,看视频讲解,学习下面内容

我们在命令行里执行命令的时候,都有一个 当前目录(也叫工作目录) ,就是我们所在的目录。

当用户刚登录系统时,当前工作目录是用户的 home目录

root用户的home目录,是 /root

其他用户home目录,是在创建用户的时候 产生的,一般是 /home/用户名

比如你是用户 byhy,home目录通常就是是 /home/byhy。

当前目录下面的所有文件都可以直接访问, 假设当前目录 下面有个文件 a.txt。 要用vi编辑它,就可以直接执行vi a.txt

查看当前目录使用命令 pwd ,比如

[root@izbqz ~]# pwd
/root/package

改变当前目录用命令 cd

比如,

改变当前目录为package目录(这个动作也称之为进入到package目录), 就执行命令 cd package

改变当前路径到根目录 就执行命令 cd /


绝对路径与相对路径


点击这里,看视频讲解,学习下面内容

我们命令行要操作一个文件(或者目录),必须给出这个文件的路径。路径分为:

● 绝对路径: 绝对路径 开始于根目录,沿着目录层级,一直到达所期望的目录或文件。

比如下图

image

其 中的 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 就能看到 当前目录下所包含的文件和子目录列表。

image

比如上图中,我们就发现当前目录下,有一个 目录 , 有两个文件 Python-3.6.8.tgz readme.txt , 还有 一个目录 Python-3.6.8

为什么呈现出不同的颜色?Linux系统可以根据 的类型(文件还是目录)和 扩展名 决定 列出 时的颜色。这些都是可以配置的。


除了当前工作目录以外,也可以指定要列出内容的目录,就像这样:

[root@iztqz ~]# ls /home/byhy/
by.txt  frontend


我们经常使用 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 文件所属用户组的名字。

82 以字节数表示的文件大小。

May 10 10:36 上次修改文件的时间和日期。

byhy.txt 文件名。

查看文本文件内容


点击这里,看视频讲解,学习下面内容

查看文本文件的内容除了我们之前提到过的用vi编辑器外,对于比较短的文件, 可以直接用命令cat将文件的内容显示到屏幕上。

比如

[byhy@izbp16hara3tw8kbagjotqz ~]$ cat byhy.txt
byhy testing

说明byhy.txt 的文件内容就是 一行 byhy testing

创建目录


点击这里,看视频讲解,学习下面内容

mkdir 命令是用来创建目录的。

例如

mkdir byhy1

会在当前目录下,创建一个名为”byhy1”的目录,而

mkdir byhy1 byhy2 byhy3

会创建三个目录,名为 byhy1, byhy2, byhy3。


如果我们要创建好几层的目录,比如 /root/byhy/python/lesson1,

直接这样写命令 mkdir /root/byhy/python/lesson1

shell 会报错,因为系统中可能还 没有 /root/byhy/python 这个目录。

一种方法是:我们 依次 创建 每一级目录, 像这样

mkdir /root/byhy
mkdir /root/byhy/python
mkdir /root/byhy/python/lesson1

更简单的方法是,使用参数 -p

mkdir -p /root/byhy/python/lesson1


删除文件和目录


点击这里,看视频讲解,学习下面内容

rm 命令用来 删除 文件和目录。

rm 命令后面 直接加上要删除的文件,比如

rm file1 file2

当我们要删除目录的时候 ,需要加上 -r 选项,否则会报错,如下所示

$ rm dir1
rm: cannot remove 'dir1': Is a directory

要这样写

$ rm -r dir1

-r 参数 也可以详细的写成 –recursive 。 它表示要 递归地删除文件。 这意味着,如果要删除一个目录,而此目录 又包含子目录,那么子目录也会被删除。


通常 -r 和 -f 参数会一起使用。

-f 参数 也可以详细的写成–force 。 它表示忽视不存在的文件,不显示提示信息。

比如:

rm -rf file1 dir1 file2 dir2

如果文件 file1,或目录 dir1 不存在的话,rm 仍会继续执行,不会报错

执行 rm 操作 要非常小心, rm 不像Windows里面有回收站,一旦你用 rm 删除了一些东西,想再恢复是相当的麻烦的。

通配符


点击这里,看视频讲解,学习下面内容

当前目录下有这样一些文件

byhy1.txt  file1.jpg  file2.jpg  file3.jpg  
file5.jpg  hy2.jpg   hyby.jpg  

我们要删除 其中 所有 以file开头, 扩展名为 .jpg 的文件,怎么办?

当然可以

rm -f file1.jpg  file2.jpg  file3.jpg file5.jpg

但是如果 这样的文件有上百个, 敲起来是非常麻烦的。

Linux 提供了一组特殊字符来匹配 文件名中的各部分内容。

这些特殊字符叫做 通配符

上面的例子,我们可以这样写

rm -f  file*.jpg
  • 匹配任意多个字符(包括零个或一个), 这样是不是,方便多了?


常用的通配符有下面:

* 匹配任意 多个 字符(包括零个或一个)

? 匹配任意 一个 字符(不包括零个)

[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 是一个文件,我们可以 这样

cp byhy1 byhy2

如果 byhy2 这个文件 不存在, 上面的命令会创建一个新文件 byhy2 ,并且把 byhy1内容 拷贝到byhy2中。

如果 byhy2 已经存在了, 上面的命令会直接把 byhy1内容 拷贝到byhy2中, 就是说会覆盖byhy2 原来的内容。


如果我们要拷贝的是一个目录, 则 需要加上 -r 选项

比如

cp -r  frontend frontend2

指定 -r 或者 –recursive 会递归地复制目录及目录中的内容。就是说,如果 frontend 里面有好多级子目录和文件,全部都会被拷贝过去。


可以拷贝 文件或者目录到 另外一个目录中,比如

cp -r file1 dir1 dir2 就是复制文件 file1 和 目录dir1 到目录 dir2中。目录 dir2 必须存在。


再比如 cp dir1/* dir2 这里使用通配符,可以把目录 dir1 中的所有文件都 复制到目录 dir2 中。 dir2 必须已经存在。


移动文件目录、重命名文件目录


点击这里,看视频讲解,学习下面内容

mv 命令可以 移动 文件或者目录, 也可以 重命名 文件或者目录

mv 使用方法与 cp 很相像。

假设 byhy1 是一个文件,我们可以 这样

mv byhy1 byhy2

如果 byhy2 这个文件 不存在, 上面的命令会 把文件 byhy1 改名为 byhy2 ,并且把 byhy1内容 拷贝到byhy2中。

如果 byhy2 已经存在了, 上面的命令会把文件 byhy1 改名为 byhy2, 等于删除了原来的 byhy2。


假设 dir1 是一个目录,我们可以执行

mv  dir1 dir2

如果目录 dir2 不存在,就会把 dir1目录 改名为 dir2。

如果目录 dir2 存在,就会把 dir1(及它的内容)到目录 dir2。


假设 byhy1 是一个文件,dir1 是一个目录,我们可以执行

mv  byhy1 dir1 dir2

这样写的话, 如果目录 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



作业和练习

请使用 root 账号登录 Linux,依次执行下面的操作

  • 先用命令查看当前目录是什么

  • 再创建一个新目录 byhy,进入到该目录中,再创建一个目录 package

  • 用vi命令在package目录下面创建 3 个 文件 f1、f2、f3、y1、y2 并且在里面各自添加一些文本内容

  • 分别 拷贝 f1、f2、f3 内容 到 上层目录 byhy 中, 并且新的文件名 依次 为 p1、p2、p3

  • 复制 整个 byhy 目录 内容 到 新目录 byhy2中

  • 重命名 目录 byhy2/package 为 byhy2/files

  • 重命名 byhy/package/f1 为 /byhy/package/fff1

  • 删除 byhy/package 里面 所有 文件名以 字母 y 开头的文件。

  • 删除 目录 byhy2

  • 创建一个文件文件 prac.txt, 点击此处打开链接,复制内容到该文件中。

    用命令 打印出包含了关键字 price 的行


扫码分享给朋友,一起学更有动力哦




上一页

下一页