Linux / Mac 下 基本的 bash shell 命令详解(touch 、cp、mv、rm)

时间:2021-11-09 09:22:31

前言

这一篇主要说了touch,cp,mv,rm这几个很基本常用的命令。博客会同时发布在简书和CSDN,希望大家支持。

处理文件

bash shell 提供了很多在Linux文件系统上操作文件的命令。

创建文件 touch

可以使用touch命令来轻松创建空文件:
touch test
touch命令创建了指定的新文件,并将当前用户名作为文件的属主。
创建的文件大小是零,touch命令只会创建一个空文件。
如果再次使用:touch test命令,当前已经存在test文件,该命令行会使已有文件的访问时间和修改时间进行改变,而不改变文件的内容。

  • touch -a :只修改访问时间;
  • touch -m :只改变修改时间;

默认情况下,touch使用当前时间,可以使用:

  • touch -t 参数加上特定的时间戳来制定时间
    例如:

    touch -t 201612251200 test

复制文件 cp

在文件系统中将文件和目录从一个位置复制到另一个位置就需要使用cp命令。
最基本用法里,cp需要两个参数,源对象和目标对象:

cp source destination

当source的destination参数都是文件名时,cp命令将源代码复制到一个新文件,并且以destination命名。新文件就像全新的文件一样,有新的创建时间和修改时间。如果目标文件已经存在了,那么cp命令将会提示你是否要覆盖已有文件。

同大多数命令一样,cp命令也有一些可以提供帮助的命令行参数(当前其中部分命令行在Mac下面并没有效果):

参数 描述
-a 归档文件,并保留它们现在的属性(linux文件归档的意思是为文件或目录备份,建立归档文件)
-b 创建已存在目录文件的备份,而非覆盖它
-d 保留
-f 强制覆盖已存在的目标文件,不提示
-i 在覆盖目标文件之前提示
-l 创建文件链接而非复制文件
-p 如果可能保留文件属性
-r 递归的复制文件
-R 递归的复制目录
-s 创建一个符号链接而非复制文件
-S 覆盖默认的备份文件的后缀(默认是~)
-u 仅在源文件比目标文件新的情况下复制(相当于更新)
-v 详细模式,解释到底发生了什么
-x 仅限于当前文件系统的复制(这句话的背景是:Linux可同时挂在多个不同的文件系统类型的存储设备)

链接文件 cp -l cp -s

链接文件下面的两个参数只针对Linux有用,Mac上进过测试没有这几个命令参数。
你可能已经注意到,cp命令的许多参数都是针对链接文件的。这是Linux文件系统的一个优点。
如需要在系统上维护同一文件的的两份或者多份副本,除了保存多份单独的物理文件副本之外。还可以采用保存一份物理文件副本和多个虚拟副本的方法。这种虚拟的副本就被称为链接。链接是目录中指向文件真实位置的占位符。在Linux中有两种不同类型的文件链接:

  • 符号链接,即软链接;
  • 硬链接
    硬链接会创建一个独立文件,其中包含了源文件的信息以及位置。引用硬链接文件文件等同于链接了源文件:
cp -l test1 test4

-l参数创建了一个指向test1的硬链接test4。在文件列表可看出,文件test1和test4的索引节点号是相同的,这表明,实际上它们是同一个文件。还要注意,链接计数表示当前这两个文件都有两个链接了。
只能在同种存储媒体上的文件之间创建硬链接,不能在不同挂载点下的文件间创建硬链接。在后一种情况下,可以使用软链接。

-s参数可以创建一个符号链接,即软链接:

cp -s test1 test5

首先,新建的test5文件有了一个不同于test文件的索引节点号,这说明Linux系统把它当做一个单独的文件。
其次,文件变小了。链接文件只需要存储源文件的信息,并不需要存储源文件中的数据。

在复制文件链接时需要注意,如果用cp命令来复制一个链接到到另一个源文件的文件,那么你复制的其实是源文件的另一个副本,而不是链接文件的。这点很容易混淆。可以创建一个指向源文件的新链接,而不用复制链接文件。可以创建指向同一文件的多个链接,但不要创建指向其他符号链接文件的多个符号链接。这样会生成一个链接文件链,不但容易混淆,还容易断掉,造成各种各样的问题。

重命名文件 mv

在Linux中,重命名文件称为移动(moving)。mv命令就是用来将文件和目录移动到另一个位置的:

mv test1 test2
mv test1 ../Desktop/

移动文件会改变文件名,但保持同样的索引节点号和时间戳。移动一个有软链接指向文件会带来麻烦,会造成一个软链接文件指向一个无效文件。

删除文件 rm

在Linux中,删除(deleting)叫做移除(removing)。base shell 中删除文件的命令是rm。

rm test1

注意命令会提示是否真的要删除文件(Mac下不会提示)。
base shell中没有回收站或者垃圾桶,所以一旦删除就无法找回了。

关于rm命令的命令行参数,可以参考cp的命令行参数,大多数是一致的,以下列举几个常用的:

-d:直接把欲删除的目录的硬连接数据删除成0,删除该目录;
-f:强制删除文件或目录;
-i:删除已有文件或目录之前先询问用户;
-r或-R:递归处理,将指定目录下的所有文件与子目录一并处理;
–preserve-root:不对根目录进行递归操作;
-v:显示指令的详细执行过程。

当输出一个带链接的文件时,源文件被删除后,硬链接文件内容依旧存在,而软链接文件时,bash会表示它已经不复存在了。
硬链接文件采用和源文件相同的索引节点号。硬链接会一直维护这个索引节点号来保留数据,知道删除了最后一个链接它的文件。
所有的软链接文件都知道它所指向的文件不存在了,所以指向的也就是一个无效文件。