如何在 Linux 中检查文件是否可读

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,你将学习如何使用各种命令行工具来检查 Linux 系统中的文件是否可读。首先,你会使用基础的 test -r 命令以编程方式检查文件的读取权限,并了解它在条件表达式中的用法。

接下来,你将探索 ls -l 命令,通过它直观地查看文件权限,深入理解权限字符串及其含义。最后,你会深入学习 stat 命令,以获取文件的详细信息,包括其访问权限和其他元数据。通过完成这些步骤,你将掌握在 Linux 环境中判断文件可读性的实用技能。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/FileandDirectoryManagementGroup(["File and Directory Management"]) linux(("Linux")) -.-> linux/InputandOutputRedirectionGroup(["Input and Output Redirection"]) linux/BasicSystemCommandsGroup -.-> linux/echo("Text Display") linux/BasicSystemCommandsGroup -.-> linux/test("Condition Testing") linux/BasicFileOperationsGroup -.-> linux/ls("Content Listing") linux/FileandDirectoryManagementGroup -.-> linux/pwd("Directory Displaying") linux/InputandOutputRedirectionGroup -.-> linux/redirect("I/O Redirecting") subgraph Lab Skills linux/echo -.-> lab-558713{{"如何在 Linux 中检查文件是否可读"}} linux/test -.-> lab-558713{{"如何在 Linux 中检查文件是否可读"}} linux/ls -.-> lab-558713{{"如何在 Linux 中检查文件是否可读"}} linux/pwd -.-> lab-558713{{"如何在 Linux 中检查文件是否可读"}} linux/redirect -.-> lab-558713{{"如何在 Linux 中检查文件是否可读"}} end

使用 test -r 测试可读性

在这一步中,你将学习如何使用带有 -r 选项的 test 命令来检查你是否拥有读取文件的权限。

test 命令是一个内置的 shell 命令,用于计算条件表达式。它常用于 shell 脚本中以进行决策。-r 选项专门用于检查文件是否存在,以及当前用户是否可以读取该文件。

让我们创建一个简单的文件来进行测试。我们将使用 echo 命令,把一些文本放入你 ~/project 目录下名为 my_file.txt 的文件中。

输入以下命令并按回车键:

echo "This is a test file." > ~/project/my_file.txt

此命令会创建文件 ~/project/my_file.txt,并将字符串 "This is a test file." 写入其中。> 符号将 echo 命令的输出重定向到指定的文件。

现在,让我们使用 test -r 来检查你是否可以读取这个文件。如果条件为真,test 命令本身不会产生输出。我们通常会将它与 echo 等其他命令结合使用,以查看结果。

输入以下命令并按回车键:

test -r ~/project/my_file.txt && echo "File is readable."

&& 运算符表示“仅当左边的命令执行成功(返回退出状态码为零)时,才执行右边的命令”。如果 test -r ~/project/my_file.txt 为真(即文件可读),echo 命令将被执行。

你应该会看到如下输出:

File is readable.

现在,让我们尝试检查一个不存在的文件。

输入以下命令并按回车键:

test -r ~/project/non_existent_file.txt && echo "This won't be printed."

由于 ~/project/non_existent_file.txt 不存在,test -r 将返回非零退出状态码(表示失败),echo 命令将不会被执行。你应该看不到此命令的任何输出。

test 命令是 Linux 脚本编写的基础工具。理解如何使用其各种选项(如 -r)对于编写健壮的脚本至关重要,这些脚本可以在尝试执行操作之前检查文件的权限和是否存在。

点击 继续 进入下一步。

使用 ls -l 检查权限

在上一步中,你使用 test -r 检查了文件是否可读。现在,让我们使用带有 -l 选项的 ls 命令来查看文件的详细权限。

ls 命令用于列出目录内容。-l 选项提供“长列表”格式,其中包含文件类型、权限、硬链接数量、所有者、所属组、大小、修改时间和文件名等信息。

让我们查看上一步中创建的 my_file.txt 文件的权限。确保你位于 ~/project 目录中。你可以使用 pwd 命令确认当前所在目录:

pwd

你应该会看到 /home/labex/project

现在,输入以下命令并按回车键:

ls -l my_file.txt

你会看到类似如下的输出:

-rw-rw-r-- 1 labex labex XX Month XX XX:XX my_file.txt

让我们来分析一下输出的第一部分,它代表了文件类型和权限:

-rw-rw-r--

这十个字符的字符串包含了很多关于文件权限的信息。

  1. 第一个字符表示文件类型:

    • - 表示这是一个普通文件。
    • d 表示这是一个目录。
    • l 表示这是一个符号链接。
    • (还有其他类型,但这些是最常见的)
  2. 接下来的九个字符分为三组,每组三个:

    • 第一组 (rw-) 显示文件 所有者 的权限。
    • 第二组 (rw-) 显示文件所属 的权限。
    • 第三组 (r--) 显示 其他用户(其他所有人)的权限。

在每组三个字符中:

  • 第一个字符表示 读取 权限 (r)。如果是连字符 (-),则表示没有读取权限。
  • 第二个字符表示 写入 权限 (w)。如果是连字符 (-),则表示没有写入权限。
  • 第三个字符表示 执行 权限 (x)。如果是连字符 (-),则表示没有执行权限。

因此,对于权限为 -rw-rw-r--my_file.txt 文件:

  • 所有者 (labex) 有读取 (r) 和写入 (w) 权限,但没有执行 (-) 权限。
  • 所属组 (labex) 有读取 (r) 和写入 (w) 权限,但没有执行 (-) 权限。
  • 其他用户有读取 (r) 权限,但没有写入 (-) 或执行 (-) 权限。

这个输出证实了所有者 (labex) 有读取权限,这就是上一步中 test -r 命令能正常工作的原因。

理解 ls -l 的输出是在 Linux 中管理文件和目录以及控制访问权限的基础。

点击 继续 进入下一步。

使用 stat 检查文件访问信息

在这一步中,你将使用 stat 命令来获取文件的详细信息,包括文件的访问时间、修改时间、更改时间,以及以符号和数字格式表示的权限。

虽然 ls -l 能让你大致了解文件的权限,但 stat 能更深入地查看文件的元数据。

让我们对之前在 ~/project 目录下创建的 my_file.txt 文件使用 stat 命令。

输入以下命令并按回车键:

stat ~/project/my_file.txt

你会看到类似如下的输出:

  File: /home/labex/project/my_file.txt
  Size: XX          Blocks: X          IO Block: XXXX   regular file
Device: XXh/XXd Inode: XXXXXXXX    Links: X
Access: (0664/-rw-rw-r--)  Uid: (  XXXX/   labex)   Gid: (  XXXX/   labex)
Access: XXXX-XX-XX XX:XX:XX.XXXXXXXXXX +XXXX
Modify: XXXX-XX-XX XX:XX:XX.XXXXXXXXXX +XXXX
Change: XXXX-XX-XX XX:XX:XX.XXXXXXXXXX +XXXX
 Birth: -

让我们来看看输出中的一些关键行:

  • File:文件的名称。
  • Size:文件的大小,以字节为单位。
  • Access: (0664/-rw-rw-r--):这一行以两种格式显示了文件的权限:
    • 0664:这是权限的数字(八进制)表示形式。每个数字分别代表所有者、所属组和其他用户的权限。
      • 所有者的 6rwx(读 = 4,写 = 2,执行 = 0)-> 4 + 2 + 0 = 6
      • 所属组的 6rwx(读 = 4,写 = 2,执行 = 0)-> 4 + 2 + 0 = 6
      • 其他用户的 4rwx(读 = 4,写 = 0,执行 = 0)-> 4 + 0 + 0 = 4
      • 前面的 0 通常用于表示八进制表示法。
    • -rw-rw-r--:这是权限的符号表示形式,你在使用 ls -l 时已经了解过。
  • UidGid:文件所有者和所属组的用户 ID 和组 ID,以及它们的名称。
  • AccessModifyChange:这些行显示了文件的时间戳:
    • Access:文件最后一次被访问(读取)的时间。
    • Modify:文件内容最后一次被修改的时间。
    • Change:文件元数据(如权限、所有者、所属组)最后一次被更改的时间。

当你需要文件属性的详细信息时,尤其是在编写脚本或排查权限问题时,stat 命令非常有用。

你现在已经学习了三种不同的方法来检查 Linux 中的文件权限和访问信息:test -rls -lstat。这些都是在命令行中处理文件的重要工具。

点击 继续 完成本次实验。

总结

在本次实验中,你学习了如何在 Linux 中使用带有 -r 选项的 test 命令来检查文件是否可读。你练习了创建文件,然后结合使用 test -r&& 运算符,根据文件的可读性有条件地打印消息。你还观察到,对于不存在的文件,test -r 会返回 false,从而阻止后续命令执行。这一步展示了在 shell 脚本中以编程方式检查文件权限的基本方法。