原版英文书籍《Linux命令行》阅读记录4-操作文件和目录

Author Avatar
cuteximi 10月 13, 2018
  • 在其它设备中阅读本文章

背景:
阅读英文原作只为了更好地理解书中的精髓,当然也是为了更好地掌握书中的技巧。我们会坚持阅读全书,并记录书中的精髓。

从本章节开始,开始真正的实战。

主要学习以下命令:

  • cp
  • mv
  • mkdir
  • rm
  • ln
  • 一些练习
    以上命令用来操作文件和目录。

图形化界面,可以简单且轻松的完成文件的复制粘贴等操作,为什么我们还要学习使用命令行呢?一些简单的任务,图形化界面更占优势,但是当遇到很复杂的操作时,使用命令行更加方便。比如复制当前目录下以 .html 结尾的文件,图形化界面是不是要一个一个用手去选择?命令行就很简单了

cp -u *.html destination

通配符

在开始学习上述命令之前,先来了解一下通配符的重要性以及用法。因为 shell 频繁地使用 文件名,shell 提供了特殊字符来帮助你快速指定一组文件名。这些特殊字符叫做通配符。列一个表格:

通配符意义
*匹配任意多个字符(包括零个或一个)
?匹配任意一个字符(不包括零个)
[characters]匹配任意一个属于字符集中的字符
[!characters]匹配任意一个不是字符集中的字符
[[:class:]]匹配任意一个属于指定字符类中的字符

普遍使用的字符类:
|字符类|意义|
|–|–|
|[:alnum:]|匹配任意的字母或数字|
|[:alpha:]|匹配任意的字母|
|[:digit:]|匹配任意一个数字|
|[:lower:]|匹配任意一个小写字母|
|[:upper:]|匹配任意一个大写字母|

我们可以借助通配符来构建复杂的文件名查找规则。下面举一些例子:

代表查找所有文件
g* 代表查找所有以 “g” 开头的文件
b*.txt 代表查找以 “b” 开头,中间任意字符,以 .txt 结尾的文件
Data??? 代表查找以 Data 开头,后面紧跟 3 个字符的文件
[a, b, c]* 代表查找以 a 或 b 或 c 开头的文件
g[0-9][0-9][0-9] 代表查找以 g 开头,并且紧跟着三个数字的文件
[[:lower:]123] 代表查找以小写字母结尾 或者 以 1 或 2 或 3 结尾的文件

mkdir 创建目录

用法:

mkdir directory...
mkdir dir

此时会创建一个目录,名为 dir。

注意表示法: 在描述一个命令时(如上所示),当有三个圆点跟在一个命令的参数后面, 这意味着那个参数可以重复,就像这样:

mkdir dir1 dir2 dir3

此时会创建三个目录,名为 dir1, dir2, dir3。

有用的参数说明

-m 指定权限
-p 用于创建多级目录,若所要建立目录的上层目录目前尚未建立,则会一并建立上层目录

cp 复制文件和目录

复制,有两种用法:
1.复制单个项目
2.复制多个项目

cp item1 item2

复制 文件或目录 item1 到文件或目录 item2

cp item... directory

复制多个项目到一个目录下。

有用的参数

-a , –archive , 复制文件时,带上属性。
-i , –interactive, 重写文件之前,会提示用户是否重写,默认 cp 是重写文件的。
-r , –recursive , 递归地复制目录以及目录里面的内容。
-u , –update ,当把文件从一个目录复制到另一个目录中时,只复制不存在的文件。或者文件内容更新于已存在的文件中。
-v, –verbose, 显示详细的复制操作。

cp 命令的几个例子展示

  • cp file1 file2 如果file2 存在的话,cp 命令把 file1 的内容重写到 file2 中。如果 file2 不存在,则创建。
  • cp -i file1 file2 如果 file2 存在,在重写之前会提示用户确认 “是否重写?”,其他的,同上。
  • cp file1 file2 dir1 复制 file1 和 file2 到目录 dir1 中,目录 dir1 必须存在
  • cp dir1/* dir2 使用通配符,将 dir1目录下的内容全部复制到 dir2 目录下,目录 dir2 必须存在
  • cp -r dir1 dir2 复制目录 dir1 中的内容到目录 dir2目录中,目录 dir 不存在则创建。

mv 移动和重命名

mv 的使用方法和 cp 一样。

mv item1 item2

移动(重命名)item1 为 item2

mv item... directory

移动多个项目到一个目录下。

有用的参数

-i , –interactive, 重写文件之前,会提示用户是否重写,默认 cp 是重写文件的。
-u , –update ,当把文件从一个目录移动到另一个目录中时,只移动不存在的文件。或者文件内容更新于已存在的文件中。
-v, –verbose, 显示详细的操作信息。

mv的例子:

  • mv file1 file2 如果file2 存在的话,cp 命令把 file1 的内容重写到 file2 中。如果 file2 不存在,则创建。
  • mv -i file1 file2 如果 file2 存在,在重写之前会提示用户确认 “是否重写?”,其他的,同上。
  • mv file1 file2 dir1 移动 file1 和 file2 到目录 dir1 中,目录 dir1 必须存在
  • mv dir1 dir2 如果目录 dir2 不存在,则创建目录 dir2 ,并且移动 dir1 的内容到目录 dir2 中,同时删除目录 dir1 。如果存在 dir2 , 移动目录 dir1以及它的内容到目录 dir2 。

rm 删除文件和目录

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

rm item...

前面提到过这种表达方式,代表参数可以一个或多个,可以删除一个或多个项目。

有用的参数

-i, –interactive, 删除的时候,提示用户确认信息,如果不带此参数,rm 会默默直接删掉文件。
-r, –recursive, 递归的删除文件。要删除目录时,必须要指定此参数,代表全部清空。
-f, –force, 忽视不存在的信息,不显示提示信息,会覆盖 -i参数
-v,verbose, 显示详细的操作信息。

提个醒!

类 Unix 的操作系统,比如说 Linux,没有复原命令。一旦你用 rm 删除了一些东西, 它就消失了。Linux 假定你很聪明,你知道你在做什么。尤其要小心使用通配符。

ln 创建链接

ln 既可以创建硬链接,也可以创建符号链接(软链接)。

  • 硬链接是最初 Unix 创建链接的方式。每个文件都默认都有一个硬链接,这个硬链接给予文件名字。我们每建立一个硬链接,都相当于新增一个额外的目录项。硬链接有两个额外的局限性:
    1.一个硬链接不能关联不同文件系统 的文件。2.硬链接不能关联目录

  • 符号链接是为了解决上述局限性,通过创建一个特殊类型的文件,这个文件包含一个关联文件或目录的文件指针。这种方式和 Windows 的快捷方式差不多,但是比 Windows 要早很多年!删除符号链接的时候,只是链接被删除,而不是文件本身。如果文件先被删除,链接依然会存在,只是不指向任何东西。

练习

首先创建一个领地,执行命令 mkdir playground

[me@linuxbox ~]$ mkdir playground

然后,进入 playground 目录创建两个目录 dir1 和 dir2

[me@linuxbox ~]$ cd playground
[me@linuxbox playground]$ mkdir dir1 dir2

接下来,复制一些数据来这个目录。

[me@linuxbox playground]$ cp /etc/passwd .

再次执行上面的命令,只不过这一次加上了参数 -v 来显示详细的操作信息:

[me@linuxbox playground]$ cp -v /etc/passwd .
`/etc/passwd' -> `./passwd'

如果换成参数 -i 会显示上面呢?来试试

[me@linuxbox playground]$ cp -i /etc/passwd .
cp: 是否覆盖 './passwd'?

接着输入 y 就会被重写,输入背的字符(n什么的),会保留。

这样,我们就有了 一个 playground 目录下 有一个文件 passwd和 两个目录 dir1dir2

我们给 passwd 改一个名字:改成 dog

[me@linuxbox playground]$ mv passwd  dog

首先把 dog 文件移动到 dir1 木目录中。

me@linuxbox playground]$ mv dog dir1

接着把 dir1 移动到目录 dir2 中。

me@linuxbox playground]$ mv dir1 dir2

因为 dir2 存在,所以 dir1 以及它里面的内容都会移动到 dir2中。
如果 dir2 不存在, dir1 会重命名为 dir2 。

最后将 dog 文件再移动到 playground 目录下。

me@linuxbox playground]$ cd dir2/dir1
me@linuxbox dir1]$ mv dog ~/playround

建立符号链接(软链接)

me@linuxbox playground]$ ln -s  /home/me/playground/dog dog-system

使用ll,查看一下:

lrwxrwxrwx 1 me me 6 2008-01-15 15:17 dog-system -> /home/me/playground/dog

根据我们前面所学的文件解析,可知这一个符号链接文件,指向 /home/me/playground/dog 文件。

提示:创建符号链接的时候,最好使用绝对路径。

上面演示的是创建文件的符号链接,同样也可以创建的目录的符号链接。

对于符号链接,有一点值得记住,执行的大多数文件操作是针对链接的对象,而不是链接本身。 而 rm 命令是个特例。当你删除链接的时候,删除链接本身,而不是链接的对象。

This blog is under a CC BY-NC-SA 3.0 Unported License
本文链接:http://blog.cuteximi.com/原版英文书籍《Linux命令行》阅读记录4-操作文件和目录/