原版英文书籍《Linux命令行》阅读记录4 | 操作文件和目录
背景:
阅读英文原作只为了更好地理解书中的精髓,当然也是为了更好地掌握书中的技巧。我们会坚持阅读全书,并记录书中的精髓。
从本章节开始,开始真正的实战。
主要学习以下命令:
- 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
和 两个目录 dir1
和dir2
。
我们给 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 命令是个特例。当你删除链接的时候,删除链接本身,而不是链接的对象。