Linux学习记录四——操作文件与目录

操作文件与目录


前言

为什么要学习使用这些命令行程序呢?使用图形文件管理器来执行一些由这些命令执行的任务要容易的多,但是虽然使用图形文件管理器能轻松实现简单的文件操作,但是对于复杂的任务,使用命令行程序更容易完成,原因就在于命令行程序具有强大的功能和灵活的操作


一、一些预备知识

1、通配符

通配符是一个使命令行如此强大的shell特性,由于shell经常需要使用文件名,因此它提供了一些特殊字符来帮助你快速指向一组文件名,这些特殊字符称为通配符。通配符(也叫文件名替换)允许用户依据字符模式选择文件名

通配符:

通配符 匹配项
* 匹配任意多个字符(包括0个和一个)
? 匹配任意单个字符(不包括0个)
[characters] 匹配任意一个属于字符集额中的字符
[!characters] 匹配任意一个不属于字符集中的字符
[[:class:]] 匹配任意一个属于指定字符类中的字符

常用的字符类:

字符类 匹配项
[:alnum;] 匹配任意一个字母或数字
[:alpha:] 匹配任意一个字母
[:digit:] 匹配任意一个数字
[:lower:] 匹配任意一个小写字母
[:upper:] 匹配任意一个大写字母

通配符的使用为文件名构建复杂的筛选标准成为可能。
举个例子:

形式 匹配项
g* 以g开头的任一文件
b*.txt 以b开头,中间有任意多个字符,并以.txt结尾的任一文件
date??? 以date开头,后面跟三个字符的任一文件
[abc]* 以abc中的任一个开头的任一文件
abc.[0-9][0-9][0-9] 以abc开头,后面紧跟3个数字的任一文件
[[:upper:]]* 以大写字母开头的任一文件
[![:digit:]]* 不以数字开头的任一文件
*[[:lower:]123] 以小写字母或数字1、2、3中的任一个结尾的任一文件

通配符可以与任一个使用文件名为参数的命令一起使用,这使得操作十分灵活。

2、链接

链接给我的感觉与C语言中的指针十分类似,有异曲同工之处的感觉。

硬链接

硬链接是最初UNIX用来创建链接的方式,默认情况下,每个文件有一个硬链接,该硬链接会给文件起名字。当创建一个硬链接的时候,也为这个文件创建了一个额外的目录条目。
硬链接有两条重要的局限性:

  1. 硬链接不能引用自身文件系统之外的文件。换言之,硬链接不能引用与该硬链接不在同一磁盘分区的文件
  2. 硬链接无法引用目录
    硬链接和文件本身没有什么区别。当硬链接被删除时,只是删除了这个链接,文件本身依然存在(换言之,该空间没有被释放。像不像指针?),除非该文件的所有链接都被删除。

软链接(符号链接)

符号链接是为了克服硬链接的局限性创建的。符号链接通过创建一个特殊类型的文件来起作用的,该文件包含了指向引用文件或目录的文本指针。
符号链接指向的文件与符号链接自身几乎没有什么区别,当删除一个符号链接时文件本身依然存在(联想指针),如果文件先于符号链接删除,那么这个符号链接依然存在,但是不指向任何文件,称为坏链接(联想空指针)。

二、几个命令介绍

注: … 表示参数重复

1、mkdir——创建目录

我感觉这个命令是make directory的缩写,mkdir 命令是用来创建目录的,格式如下;
mkdir directory…
可以一次建一个或多个目录,
mkdir dir1 创建单个dir1目录
mkdir dir1 dir2 dir3 分别创建了命名为dire1,dire2,dire3 的目录

2、cp——复制文件和目录

它有两种不同的使用方式;

  1. 将单个文件或目录item1 复制到文件或目录 item2中:
    cp item1 item2
  2. 将多个项目(文件或目录)复制进一个目录中;
    cp item… directory
    cp命令选项(短选项和等价的长选项):
短选项 长选项 含义
-a –archive(档案,存档) 复制文件和目录及其属性,包括所有权和权限。复制的文件具有用户所操作文件的默认属性。
-i –interactive(交互,互动) 在覆盖一个已存在的文件前,提示用户进行确认。如果没有指定该选项,cp会默认覆盖文件
-r –recursive(递归) 递归地复制目录及其内容。复制目录时需要这个选项(或-a选项)
-u –update(更新) 当将文件从一个目录复制到另一个目录时,只会复制那些目标目录中不存在的文件或是目标目录中相应文件的更新文件
-v –verbose(冗长的,罗嗦的) 复制文件时,显示信息性消息

3、mv——移除和重命名文件

mv的使用方法与cp基本相似,mv可以执行文件移动和文件重命名操作,这具体取决于如何使用它。
mv item1 item2
将文件(或目录)item1 移动(或重命名) 为 item2;
mv item… directory
将一个或多个条目从一个目录移动到另一个目录下
mv选项:

短选项 长选项 含义
-i –interactive(交互,互动) 在覆盖一个已存在的文件前,提示用户进行确认。如果没有指定该选项,mv会默认覆盖文件
-u –update(更新) 当将文件从一个目录移动到另一个目录时,只会移动那些目标目录中不存在的文件或是目标目录中相应文件的更新文件
-v –verbose(冗长的,罗嗦的) 移动文件时,显示信息性消息

4、rm——删除文件和目录

rm 用来删除文件和目录,操作如下
rm item…
item是一个或多个文件(或目录)的名称
要小心rm的使用,因为类UNIX操作系统(如Linux)并不包含还原删除操作的命令!!! Linux系统默认用户是明智的,并清楚自己在干什么(可能是没有预料到有我这种用户 )。
小技巧: 当rm命令与通配符一起使用时,除仔细检查输入内容外,可使用ls 命令预先对通配符做出测试,这将显示预删除的文件,接着你可以使用方向键返回之前调用的命令,并用rm代替ls。
rm选项:

短选项 长选项 含义
-i –interactive(交互,互动) 删除一个已存在的文件前,提示用户确认。如果没有指定这个选项,rm命令会默认删除文件
-r –recursive(递归) 递归地删除目录,换言之,如果删除的目录有子目录的话,也要讲其删除。要删除一个目录,则必须指定该选项
-f –force 忽略不存在的文件并无需提示确认。该选项会覆盖 --i选项
-v –verose(冗长的,罗嗦的) 删除文件时显示信息性消息

5、ln——创建链接

我感觉这个是link的缩写,缩写为ln。
ln 命令的使用方式有两种;
ln file link ——用来创建硬链接
ln -s item link——用来创建符号链接,这里的item既可以是文件也可以是目录

三、实战演练

学了这么多命令后我已经十分手痒,让我们一起来上手实践下。

1、创建目录

先用mkdir来创建一个目录来玩玩,姑且叫做playground吧,我们在这个文件里面进行演练。

yrf-tan@yrftan-Lenovo-G50-70m:~$ pwd
/home/yrf-tan
yrf-tan@yrftan-Lenovo-G50-70m:~$ mkdir playground
yrf-tan@yrftan-Lenovo-G50-70m:~$ cd playground
yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ 

再在playground里创建两个文件分别为 dir1,dir2;

yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ mkdir dir1 dir2
yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ cd dir1
yrf-tan@yrftan-Lenovo-G50-70m:~/playground/dir1$ cd ..
yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ 

2、复制文件

通过cp命令在我们创建的目录中放置一些数据,就放/etc目录中的passwd文件好了(用户账号列表),注意当前工作目录的快捷方式的使用,即在命令末尾加单个点号。

yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ cp /etc/passwd .
yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ ls
dir1  dir2  passwd


使用-v选项再来一次

yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ cp -v /etc/passwd .
'/etc/passwd' -> './passwd'

这一次显示了一条消息来指明它进行了什么操作。因为cp命令假定用户清楚自己当前的操作,所以没有任何警告,加上-i选项再来一次;

yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ cp -i /etc/passwd .
cp: overwrite './passwd'? 
yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ ls
dir1  dir2  passwd

通过提示符输入y,文件就会被重写,任何其他字符会使cp命令保留该文件,我输入的回车,所以文件被保留了。

3、移动和重命名文件

我们来给passwd文件改个名字,

yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ mv passwd happy
yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ ls
dir1  dir2  happy

现在将happy文件移动到各个文件中再移动回来;

yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ ls
dir1  dir2  happy
yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ mv happy dir1
yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ ls dir1
happy
yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ mv dir1/happy dir2
yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ ls dir2
happy
yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ mv dir2/happy .
yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ ls
dir1  dir2  happy

4、创建链接

感觉创建链接和使用指针的感觉很像,用起来也十分酸爽。

创建硬链接

现在,我们试试创建一些指向数据文件的链接。

yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ ln happy happy-gaoxin
yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ ls
dir1  dir2  happy  happy-gaoxin
yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ ln happy dir1/happy-gaooxin
yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ ls dir1
happy-gaooxin
yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ ln happy dir2/happy-gaoxin
yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ ls dir2
happy-gaoxin
yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ ls
dir1  dir2  happy  happy-gaoxin
yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ ls -l
total 16
drwxrwxr-x 2 yrf-tan yrf-tan 4096 5月  23 15:02 dir1
drwxrwxr-x 2 yrf-tan yrf-tan 4096 5月  23 15:03 dir2
-rw-r--r-- 4 yrf-tan yrf-tan 2410 5月  23 14:33 happy
-rw-r--r-- 4 yrf-tan yrf-tan 2410 5月  23 14:33 happy-gaoxin
yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ ls -li
total 16
926829 drwxrwxr-x 2 yrf-tan yrf-tan 4096 5月  23 15:02 dir1
926830 drwxrwxr-x 2 yrf-tan yrf-tan 4096 5月  23 15:03 dir2
926831 -rw-r--r-- 4 yrf-tan yrf-tan 2410 5月  23 14:33 happy
926831 -rw-r--r-- 4 yrf-tan yrf-tan 2410 5月  23 14:33 happy-gaoxin

happy和happy-gaoxin的第二个字段都是4,这是文件happy的硬链接数目(注:因为文件名,是由链接创建的,所以一个文件通常至少有一个链接),通过ls -l我们可以发现happy和happy-gaoxin的文件大小相同,再通过ls -li 可以发现它们的索引节点号相同,所以它们是相同的文件。

创建符号链接

符号链接是一种特殊的文件,它包含了指向目标文件或目录的文本指针。
创建方法与创建硬链接相似:

yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ ln -s happy happy-sb
yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ ls
dir1  dir2  happy  happy-gaoxin  happy-sb

yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ ls -l
total 16
drwxrwxr-x 2 yrf-tan yrf-tan 4096 5月  23 15:02 dir1
drwxrwxr-x 2 yrf-tan yrf-tan 4096 5月  23 15:03 dir2
-rw-r--r-- 4 yrf-tan yrf-tan 2410 5月  23 14:33 happy
-rw-r--r-- 4 yrf-tan yrf-tan 2410 5月  23 14:33 happy-gaoxin
lrwxrwxrwx 1 yrf-tan yrf-tan    5 5月  23 15:13 happy-sb -> happy

yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ ln -s /playground/happy dir1/happy-sb
yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ ls -l dir1
total 4
-rw-r--r-- 4 yrf-tan yrf-tan 2410 5月  23 14:33 happy-gaooxin
lrwxrwxrwx 1 yrf-tan yrf-tan   17 5月  23 15:17 happy-sb -> /playground/happy

yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ ln -s /playground/happy dir2/happy-sb
yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ ls -l dir2
total 4
-rw-r--r-- 4 yrf-tan yrf-tan 2410 5月  23 14:33 happy-gaoxin
lrwxrwxrwx 1 yrf-tan yrf-tan   17 5月  23 15:18 happy-sb -> /playground/happy

因为创建符号链接时,同时也创建一个文本描述目标文件在哪里与符号链接有关联,所以要指明路径。
在dir1,dir2的详细列表中显示了happy-sb是一个符号链接,这是通过第一个字段中的首字符“l”来确认的,且符号链接文件的长度为17,这是/playground/happy字符串中字符的数目,而不是它所指向的文件的长度。创建符号链接时可以使用绝对路径名和相对路径名,因为相对路径名允许包含符号链接的目录被重命名和(或)移动,而且不会破坏链接,所以更可取一些。 除了普通文件外,符号链接也可以引用目录。

5、删除文件和目录

我们使用rm命令来清除playground目录,
先来删除硬链接;

yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ ls
dir1  dir2  happy  happy-gaoxin  happy-sb
yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ rm happy-gaoxin
yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ ls -l
total 12
drwxrwxr-x 2 yrf-tan yrf-tan 4096 5月  23 15:17 dir1
drwxrwxr-x 2 yrf-tan yrf-tan 4096 5月  23 15:18 dir2
-rw-r--r-- 3 yrf-tan yrf-tan 2410 5月  23 14:33 happy
lrwxrwxrwx 1 yrf-tan yrf-tan    5 5月  23 15:13 happy-sb -> happy

happy-gaoxin被删除了,文件happy的链接数也从4变成了3
再来删除happy试试:

yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ rm -i happy
rm: remove regular file 'happy'? y
yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ ls
dir1  dir2  happy-sb
yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ ls -l
total 8
drwxrwxr-x 2 yrf-tan yrf-tan 4096 5月  23 15:17 dir1
drwxrwxr-x 2 yrf-tan yrf-tan 4096 5月  23 15:18 dir2
lrwxrwxrwx 1 yrf-tan yrf-tan    5 5月  23 15:13 happy-sb -> happy

happy被删除了,happy-sb变成了一个坏链接,在我的终端中这个链接被标记为了红色,(在csdn的文章中显示不出来)。

删除符号链接试试:

yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ rm happy-sb
yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ ls -l
total 8
drwxrwxr-x 2 yrf-tan yrf-tan 4096 5月  23 15:17 dir1
drwxrwxr-x 2 yrf-tan yrf-tan 4096 5月  23 15:18 dir2

值得注意的是,大部分的操作是以链接目标为对象的,而非链接本身。而rm是以链接本身为对象的,当删除一个链接的时候,链接本身被删除,但是目标文件依然存在。

最后,我们来删除playground。为此,我们需要返回主目录,使用rm的递归选项来删除playground目录以及包括其子目录在内的所有内容。

yrf-tan@yrftan-Lenovo-G50-70m:~/playground$ cd
yrf-tan@yrftan-Lenovo-G50-70m:~$ rm -r playground
yrf-tan@yrftan-Lenovo-G50-70m:~$ ls
deepin-wine-for-ubuntu  examples.desktop                        Public     音乐
Desktop                 google-chrome-stable_current_amd64.deb  Templates
Documents               Music                                   Videos
Downloads               Pictures                                下载

大功告成!!!


总结

今天收获很多,学习了一些如通配符,链接之类的基础相关知识,掌握了几个操作文件与目录的简单命令,mkdir、cp、mv、rm、ln,更重要的是自己实际上手操作了一遍从创建文件,复制文件,移除文件,对文件重命名,创建硬链接、符号链接,删除链接,删除文件与目录的整个过程。这个过程可以多上手演练几遍,还可以多“玩玩”其他操作,将不同的操作加入进来,提升操作文件与目录的熟练度。

上一篇:“create-react-app myapp 创建失败”的总结


下一篇:2021-09-11