计算机中最重要的数据都存在我们的文件中,所以计算机的指令大部分也都是和文件打交道,比如创建新文件,删除文件,更新文件或者移动文件等等。这章我们就来聊聊如何在Ubuntu中使用指令来操作文件。

Linux文件系统

在了解如何操作文件之前,我们先要了解一下文件在 Linux 操作系统中是如何被储存的。Linux文件系统类似树状结构,所有的文件和目录都被组织成以一个根节点开始的倒置的结构:

Image result for linux file system

文件系统的最顶层是由根目录开始的,系统使用 / 来表示根目录。在根目录之下的既可以是目录,也可以是文件,而每一个目录中又可以包含子目录文件。如此反复就可以构成一个庞大的文件系统。

默认情况下,我们如果使用pwd,会发现我们所在的位置是/home/enoch/,那如果我是使用 ls /,则会发现根目录的内容:

在Linux文件系统中有两个特殊的目录,一个用户所在的工作目录,也叫当前目录,可以使用一个点 . 来表示;另一个是当前目录的上一级目录,也叫父目录,可以使用两个点 .. 来表示,这个在我们后面操作文件夹的时候会具体介绍。

具体文件夹解析

这些文件都有什么用呢?我们来简单了解一下每个文件夹的基础作用

系统启动必须

  • /boot:存放的启动Linux 时使用的内核文件,包括连接文件以及镜像文件。
  • /etc:存放所有的系统需要的配置文件和子目录列表更改目录下的文件可能会导致系统不能启动。
  • /lib:存放基本代码库(比如c++库),其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。
  • /sys: 这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统 sysfs 。sysfs文件系统集成了下面3种文件系统的信息:针对进程信息的proc文件系统、针对设备的devfs文件系统以及针对伪终端的devpts文件系统。该文件系统是内核设备树的一个直观反映。当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中

指令集合

  • /bin:存放着最常用的程序和指令
  • /sbin:只有系统管理员能使用的程序和指令。

外部文件管理

  • /dev :Device(设备)的缩写, 存放的是Linux的外部设备。(注意:在Linux中访问设备和访问文件的方式是相同的。)
  • /media:类windows的其他设备,例如U盘、光驱等等,识别后linux会把设备放到这个目录下。
  • /mnt:临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了。

临时文件

  • /run:是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run。
  • /lost+found:一般情况下为空的,系统非法关机后,这里就存放一些文件。
  • /tmp:这个目录是用来存放一些临时文件的。

账户

  • /root:系统管理员的用户主目录。
  • /home:用户的主目录,以用户的账号命名的。
  • /usr:用户的很多应用程序和文件都放在这个目录下,类似于windows下的program files目录。
  • /usr/bin:系统用户使用的应用程序与指令。
  • /usr/sbin:超级用户使用的比较高级的管理程序和系统守护程序。
  • /usr/src:内核源代码默认的放置目录。

运行过程中要用:

  • /var:存放经常修改的数据,比如程序运行的日志文件(/var/log 目录下)。
  • /proc:管理内存空间!虚拟的目录,是系统内存的映射,我们可以直接访问这个目录来,获取系统信息。这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件来做修改。

扩展用的:

  • /opt:默认是空的,我们安装额外软件可以放在这个里面。
  • /srv:存放服务启动后需要提取的数据(不用服务器就是空)

改变当前目录位置(cd)

了解完文件系统,我们就来学习如何移动我们所在文件夹的位置。在前往其他文件夹之前,我们首先得知道我们当前所处的位置。命令行中 $ 符号前的字符显示的就是我们当前的位置,我们也可以使用pwd这个指令输出我们当前所在的文件夹:

~$ pwd
/home/enoch

不知道大家有没有注意的,默认情况下我们的 $ 符号前有一个 ~,这表明我们当前在系统指定的默认目录 /home/ecnoh 中,也就是下图图形界面中的位置:

有意思的是,你会发现原来Desktop桌面也只是一个文件夹,只不过里面的内容会显示在桌面而已。

当我们知道自己的位置后,我们可以使用 cd(change directory)指令切换到不同的文件夹中,如果想去Desktop文件夹,直接输入下面的指令即可。

~$ cd Desktop/

这时候,不仅仅 $ 符号前的内容变成了 ~/Desktop,说明我们已经在Desktop这个文件夹中了,之后所有的操作也都会在此文件夹中生效。如果此时再用pwd指令,也会发现我们的位置发生了改变

~/Desktop$ pwd
/home/enoch/Desktop

以下列举的就是常用的cd指令:

1. 返回上一级目录

~/Desktop$ cd ..
~$ 

3. 进入子文件夹

陌生情况下大家的桌面是没有这个 new_folder 文件夹的,大家可以手动创建,或者使用后面教的创建指令 $ mkdir ~/Desktop/new_folder 先创建一个子文件夹,然后运行下面的指令:

~$ cd Desktop/new_folder/
~/Desktop/new_folder$

3. 返回上级目录两次

~/Desktop/new_folder$ cd ../../
~$

4. 返回你刚才所在的目录

~$ cd -
/home/enoch/Desktop/new_folder
~/Desktop/new_folder$ 

5. 前往 Home

~/Desktop/new_folder$ cd ~
~$

6. 输入绝对路径,前往电脑的任何地方

~$ cd /home/enoch/Desktop/new_folder
~/Desktop/new_folder$

文本操作

查看文件夹内容

如果光能移动当前位置,可是无法查看文件夹中的内容就没有意义了。所以我们需要 ls(list)这个指令来查看每个文件夹中的内容,如果我们移动到Desktop这个目录,然后使用 ls,那么桌面中的new_folder这个子文件夹就会被显示出来:

~/Desktop$ ls 
new_folder

查看的方式有很多种,我们可以在 ls 后面添加不同的参数,来获得更多与文件相关的信息。

如果想要查看文件的详细信息我们可以添加 -l(long的简写)参数,这个指令会打印出文件的权限 drwxr-x-x(我们之后的章节再探讨这个),用户名,文件大小,修改日期和文件名:

~/Desktop$ ls -l
total 4
drwxr-x-x 2 enoch enoch 4096 Nov  6   08:49 new_folder

如果使用 -a(all的简写),所有的文件则会被显示出来,此时就能看到以 . 开头的隐藏文件:

~/Desktop$ ls -a
.  ..  new_folder

我们也可以将多个参数结合起来,来查看更加详细的信息,比如我们既想查看所有的隐藏文件和文件的具体信息,我们就可以添加 -al 这个参数:

每个指令的用法有很多,大家可以使用 man(manual)这个命令,来查看指令的具体内容:

$ man ls 

下面为了帮助大家的重点能放在指令上,我就不输出 $ 前面的路径提示了。

创建和删除

查了查看文件外,最重要的操作便是创建、删除、移动和复制文件,下面我们就来看看哪些指令可以实现这些操作。

如果想要创建文件夹,我们可以使用 mkdir(make directory)指令加上新文件夹的名字即可:

$ mkdir folder1

我们也可以直接用 mkdir 直接创建子文件夹:

$ mkdir folder1/folder2

这样folder2就会被创建在folder1中了

要删除文件夹的话,我们可以使用 rmdir(remove directory)命令。rmdir的前提条件就是被删除的文件夹必须得是空的,不然命令就会失败。所以fodler1是无法用 rmdir 删除的,因为其中有一个folder2文件夹。但是我们直接删除folder2是可以的:

$ rmdir folder1/folder2

如果想要把文件夹中的内容全部删除,不管里面是否有其他文件,那么可以使用 rm 加参数 -r 或 -R(recursively)来删除文件夹中的全部内容(此操作很危险,请谨慎使用)

$ rm -r folder1

如果要创建文件,使用touch指令加上文件名即可:

$ touch new_file

删除文件可以使用 rm 指令

$ rm new_file

如果要删除多个文件,可以直接在指令后加上所有的文件名

$ rm file1 file2 file3

移动和复制

mv(move)指令可以将一个文件或者文件夹移动到其他的位置

$ mv file1 folder1 # 将file1移动到文件夹folder1中

mv也有重命名的功能

$ mv file1.txt file2.txt # 将file1.txt重命名为file2.txt

cp(copy)指令可以复制文件和文件夹,要注意的是,如果一个文件夹不为空,那么需要加上 -r 或 -R 参数才能复制:

$ cp file1 folder1 # 将file1复制到folder1中
$ cp -R folder1 folder2 # 将folder1全部复制到folder2中

编辑文件

Linux自带文本编辑器nano,我们在nano后加上想要编辑的文件就可以了

$ nano file1.txt

之后我们就可以自己在nano中直接编辑文件内容

然后按 “Ctrl + s” 保存,再按 “Ctrl + x” 退出。

如果要查看文件内容,可以使用 cat(catenate) 命令

$ cat file1.txt
Hello World!

我们也可以使用在 cat <file_name> 之后加上 > 用一个文件中的内容覆盖掉另一文件的内容

$ cat file1.txt > file2.txt # file2.txt的内容会被file1.txt完全覆盖
$ cat file2.txt
Hello World!

如果不想要完全覆盖文件的内容,我们可以使用 >> 将文件的内容添加到新文件的末尾:

$ cat file1.txt >> file2.txt
$ cat file2.txt 
Hello World!
Hello World!

重点命令总结

$ man ls # 显示指令ls的具体信息
$ pwd # 显示当前路径
$ cd Desktop # 进入Desktop文件夹中
$ ls # 显示当前目录中含有的文件和文件夹
$ mkdir new_folder # 创建文件夹new_folder
$ rmdir new_folder # 删除文件夹new_folder
$ touch new_file # 创建new_file文件
$ rm new_file # 删除new_file
$ mv new_file new_folder # 加new_file移到new_folder中
$ cp new_file new_folder # 将new_file复制到new_folder中
$ nano file1 # 用nano文本编辑器编辑文件
$ cat file1 # 在终端查看file1内容
$ cat file1 > file2 # 用file1的内容覆盖掉file2的内容
$ cat file1 >> file2 # 在file2文件的末尾加上file1的内容

实践练习

使用本章学到的命令创建一个新的文件夹 folder1,然后在 folder1 中创建新的文件 file1.txt,并用nano给 file1.txt 编辑任意内容。最后创建一个 folder2,将 folder1 完全复制到 folder2 中,最后删除整个 folder1 文件夹。