如何在 Linux 上使用“安装”命令复制文件

install 命令是在 Linux 和 macOS 系统中一个功能强大的文件复制工具。它特别适合那些追求效率的高级用户。本文将深入探讨如何更明智地使用它,从而提高工作效率。

install 命令:不仅仅是安装软件?

install 命令的名字可能是所有 Linux 命令中最容易让人误解的。它实际上并不执行软件的安装操作。如果你想在基于 Debian 的发行版(如 Ubuntu)中使用命令行安装软件包,应该使用 apt-get 命令。而在其他 Linux 发行版中,应使用各自的包管理工具,例如 Fedora 的 dnf 或 openSUSE 的 zypper

那么 install 命令的功能是什么?

简单来说,install 命令整合了 cp复制)、chown更改所有者)、chmod更改模式)、mkdir创建目录)和 strip去除符号)等命令的功能,让你可以在一个操作中完成所有这些操作。

install 命令可以执行以下操作:

  • 复制文件,与 cp 命令类似。
  • 选择是否覆盖现有文件。
  • 如果目标目录不存在,则创建它,类似于 mkdir
  • 设置文件的用户权限标志,如同 chmod 命令。
  • 设置文件的所有者,如同 chown 命令。
  • 从可执行文件中去除不必要的符号,如同 strip 命令。

尽管功能强大,install 命令的选项 并不算多。

何时使用 install 命令?

install 命令可能不是每天都会用到的工具。它很有用,但仅在特定情况下适用。一个典型的应用场景是软件开发。假设你正在编写一个新的实用程序,需要将其部署到开发环境之外进行测试。这时,你需要将新程序文件复制到测试目录。可能还需要创建测试目录,并为文件设置正确的权限和所有权。

由于开发是一个迭代过程,你可能需要多次执行此操作序列。install 命令可以为你完成所有这些繁琐的工作。最后,当你的新实用程序准备好部署时,可以使用 install 命令将其复制到最终的工作位置,并设置正确的权限。

一个实际示例

假设一位程序员正在开发一个名为 ana 的新实用程序,它包含一个可执行二进制文件和一个数据库。在测试之后,必须将其复制到 /usr/local/bin 目录,以便 Linux 系统的所有用户都能使用。在使用 install 命令时,需要将示例中的文件名和目录路径替换为你计算机上使用的实际文件和路径。

在发布之前,ana 实用程序会在 ~/test/ana 目录中进行测试。开发团队成员拥有读取和执行权限,其他用户也具有读取和执行权限。install 命令使用与 chmod 相同的数字表示权限。程序员决定将权限设置为:

  • 所有者:读取、写入和执行。
  • 组:读取和执行。
  • 其他:仅执行。

如何使用 install 命令?

我们的程序员的工作目录是 ~/work。他已经编写并编译了程序,生成了一个名为 ana 的二进制文件,以及一个名为 Words.db 的数据库文件。现在这两个文件都准备好进行测试了。让我们先看看它们:

ls -l ana Words.db

这个 ana 实用程序可以根据命令行提供的短语生成字谜。验证测试非常简单。

程序员使用 “cookie” 短语调用了 ana,一切正常。现在他想将这两个文件复制到 ~/test/ana 目录,以查看新实用程序是否在远离开发环境的情况下正常运行。他使用了以下命令:

install -D -v ana Words.db -t ~/test/ana

命令行上使用的选项含义如下:

  • -D:如果需要,创建目录,包括父目录。
  • -v:详细模式,列出创建的每个目录以及执行的每个文件副本。
  • -t:目标目录。

可以看到 install 命令创建了 ~/test 目录,然后创建了 ~/test/ana 目录。文件在复制到目标目录时被逐一列出。

列出 ~/test/ana 中的文件,确认它们已被正确复制。

ls -l

下一步是在 ~/test/ana 目录中调用 ana 实用程序进行测试。

该实用程序按预期运行,但权限不正确。要求是设置 geek 组的成员具有读取和执行权限,其他用户只能执行。

我们可以使用以下命令轻松解决这两个问题。请注意,需要使用 sudo 命令以 root 权限运行。-o-g 选项需要此权限。当执行该命令时,会被要求输入密码。

sudo install -b -S .bak -o dave -g geek -m 751 ana Words.db -t ~/test/ana

各选项的含义如下:

  • -b(备份):在覆盖文件之前创建文件备份。
  • -S(后缀):定义备份文件的后缀。如果不提供后缀,则使用 ~(波浪号)。这里我们要求 install 命令使用 .bak 后缀。
  • -o(所有者):将文件的所有者设置为 dave
  • -g(组):指定组名。这将成为文件的所有者组。我们使用的组叫做 geek
  • -m(模式):使用标准的 chmod 数字语法设置文件的文件模式。

我们不再需要使用 -D(创建目录)选项,因为测试目录已经存在。我们还省略了 -v(详细)选项。列出 ~/test/ana 目录中的文件,可以看到文件详细信息:

ls -l

这证实了我们的所有要求都已满足:

  • 文件已被复制到测试目录。
  • 权限设置正确。
  • dave 是文件的所有者。
  • geek 组是这两个文件的所有者组。
  • 为每个文件(名为 ana.bakWords.db.bak)创建了备份副本。

所有这些都是通过使用一个命令实现的,非常简洁。

程序员对实用程序做了一些最终更改并重新编译。需要将更改后的文件从 ~/work 目录复制到 ~/test/ana 目录。可以使用 -C(比较)选项来实现此操作。如果源文件和目标文件相同,则不会复制源文件。

sudo install -C -b -S .bak -o dave -g geek -m 751 ana Words.db -t ~/test/ana

列出目标目录中的文件,可以看到 ana 文件的大小已更改,比 ana.bak 文件大。 ana 文件的时间戳也发生了变化。这些更改是因为复制了新版本的文件。

ls -l

Words.db 文件的大小和时间戳未更改。因为没有对 Words.db 文件进行任何更改,所以没有复制。在包含许多文件的项目中,-C(比较)选项可以节省大量时间和硬盘空间,因为它只复制那些已更改的文件。

程序员再次测试了 ana 实用程序是否继续运行。

现在是时候使用 install 命令将文件复制到 /usr/local/bin 目录了。这将使该 Linux 计算机的所有用户都可以使用这个新实用程序。我们知道 /usr/local/bin 目录存在,所以不需要创建它。可以使用上一个命令的修改版本:

我们将目标目录更改为 /usr/local/bin。我们删除了 -C(比较)选项,因为目标目录中还没有这些文件的副本,所以没有什么可比较的。同样,没有什么需要备份的,所以我们可以删除 -b(备份)选项和 -S(后缀)选项。

sudo install -o dave -g geek -m 751 ana Words.db -t /usr/local/bin

可以列出文件,验证它们是否已到达 /usr/local/bin 目录:

ls -l

作为最后的测试,让我们将目录更改为我们的主目录,看看是否可以从那里调用我们的新实用程序。

请注意,我们不需要在 ana 命令前加上 ./,这意味着它正在从 /usr/local/bin 目录运行。任务完成!

我们提到 install 命令可以从二进制文件中去除多余的符号表和其他包袱,以减小其大小。现在我们来做这个操作。请注意,以下命令不包括 Words.db,因为 Words.db 是数据库文件,而不是二进制可执行文件。要复制和缩小二进制文件,可以使用以下命令。我们添加了带小写“s”的 -s(缩小)选项。我们在 -b(备份)选项和 -S(后缀)选项中添加了大写“S”。

sudo install -s -b -S .bak -o dave -g geek -m 751 ana -t /usr/local/bin

列出 /usr/local/bin 中的文件,我们可以比较 ana 文件的大小与其备份版本。ana 文件的大小已减小到先前大小的近 60%。

ls -l /usr/local/bin

总结

install 命令针对的是一个非常特定的用例。对许多人来说,它可能不是日常使用的命令,甚至不是每月都需要的命令。尽管如此,install 命令是一个非常优秀的工具,值得熟悉并在你的技能库中保留。当你确实需要它的时候,它会通过提高效率、简化操作和减少击键来回报你的学习投入。