Linux 文件和目录的基本命令详解

文件和目录

我们首先专门介绍标准 GNU/Linux 操作系统的基本文件结构。标准 GNU/Linux 操作系统具有一种文件管理层次结构,用于组织计算机上存储的数据。确定特定数据的存储位置是开始了解操作系统的结构方式的初步课程之一。为了避免低估您现有的 Linux 体验,我暂时不讨论"Linux 文件系统层次结构简介"。更好的是,这里有一篇详实的文章,其中详细地介绍了文件系统层次结构。这里,我们假设您知道学习方法,所以我将向您提供一些有关如何轻松浏览的提示(或者可能是一些提醒)。当您需要编辑文件,浏览文件系统,进行更改或观察配置时,您将需要此技能。

使用 cd 更改目录

cd 命令用于在终端 shell 中从当前目录更改为所需目录。浏览 GNU/Linux 文件系统的目录结构时,会频繁用到此命令。语法如下所示:

$ cd [directory]

[directory] 参数是指您想要更改到的所需目录或目标目录,并且可以通过多种方式提供通过文件系统层次结构到达该目录的路径

  1. 绝对路径

  2. 相对路径

  3. 波浪号扩展

  4. 特殊索引节点

绝对路径

绝对路径是从根目录(通常用/ 表示)到文件系统层次结构中存在的目标目录或目标文件的"完整路径"。下面的简明示例展示了绝对路径:

如果用户名是 jsmith,那么在标准 GNU/Linux 操作系统上,到其主目录的绝对路径将为:

/home/jsmith

简明提示:在标准 GNU/Linux 操作系统上,您可以通过在命令提示符下键入 cd 进入主目录,不必指定目标目录。

在上面提供的示例中,到目标目录的路径都相当短,但是在很多情况下,到目录的路径可能很长。在本文中,我们将使用如下所示的文件系统层次结构:

采用这种目录结构,到 pacific_rose 文件的绝对路径将如下所示:

/home/jsmith/grocery_store/foods/produce/fruits/apples/pacific_rose

相对路径

GNU/Linux 操作系统的真正强大之处在于其命令行界面 (CLI)。在 Linux 上执行任务常常会使用可输入命令的 CLI。每次需要时在命令行中键入完整路径会很麻烦,这时,相对路径便为我们提供了一些支持。

相对路径定义为目标目录(或文件)_相对于_当前工作目录的路径。我们再次使用上面的例子。如果当前工作目录为  /home/jsmith/grocery_store/foods/produce/ 目录,那么进入 fruits 目录便很简单了:

$ cd fruits

由于当前工作目录包含 fruits 子目录,因此上述命令有效,因为它使用相对路径。只要未在 cd  命令旁边指定绝对路径,您就几乎可以将其描述为操作系统做出的"假设"。现在您已经导航到 fruits 目录,所以可以使用  pwd 命令查看此目录的完整路径:

1
2
$ pwd
/home/jsmith/grocery_store/foods/produce/fruits

pwd(或打印工作目录)命令对于查看当前工作目录非常方便(通常以绝对路径格式显示)。此命令显示了如何使用绝对路径和相对路径浏览文件系统层次结构。

波浪号扩展

为了让更方便地浏览文件层次结构(特别是在用户的主目录下创建的文件层次结构),包含 Bash Shell 的标准 GNU/Linux 操作系统为我们提供了波浪号扩展,也可以帮助我们。为了说明波浪号扩展的含义,我们来看看下面的示例:

$ cd ~

以上命令中的波浪号 ~ 字符映射到 $HOME 环境变量的值,此值通常设置为当前用户的主目录。这意味着该变量的值将根据当前登录的用户而更改。在同一系统上,对于 Jane          Smith,cd ~ 命令会进入 /home/jsmith 目录,而对于 Mark Jones(以用户名  mjones 登录),同样的命令会进入 /home/mjones 目录。

下面是一些使用波浪号扩展的示例:

  • ~ - 映射到 $HOME 目录

  • ~/grocery_store- $HOME 目录中存在的 grocery_store 子目录

  • ~mjones/grocery_store-mjones 用户的 $HOME 目录中专门存在的  grocery_store 子目录

特殊索引节点

为了深入探讨,我们简单谈谈索引节点,"在 Unix 上,组成目录或文件内容的数据集合不以某个名称存储;数据存储为称为数据结构的一部分,也称为索引节点。"简而言之,目录和文件是映射到索引节点编号的名称,并且有许多"特殊索引节点"可用于浏览文件系统层次结构。为了说明,请看下面的示例:

..(双点)索引节点可用于更改到文件系统层次结构中的父目录(上移一层):

$ cd ..

您还可以通过将 ..(双点)索引节点连接在一起,从而在文件系统层次结构中上移多层:

1
2
3
4
5
6
$ pwd
/home/jsmith/grocery_store/foods/produce/fruits
$ cd ../ ../
$ pwd
/home/jsmith/grocery_store/foods
$

在这里,我们将文件系统层次结构从 fruits 目录上移到 foods 目录(上移两层)。

-(短横线)可用于切换到上一个工作目录:

$ cd -

如果您需要从一个目录浏览到另一个目录然后再返回,那么无论当前在文件系统层次结构中的哪个位置,都可以使用 -(短横线)返回到上一个工作目录。

使用 pushd/popd 更改目录

这为我们提供了 Linux 用户可用来浏览文件系统层次结构的另一种方法:pushdpopd 和  dirs 命令。这三个 shell 内置命令允许您操作目录堆栈,也就是最近访问过的目录的列表。用于存储最近访问过的目录列表的数据结构实际上是堆栈或 LIFO(后进先出)数据结构。pushd  可将当前目录更改为目标目录,并将这个新目录添加到堆栈中,而 popd 会删除堆栈顶部列出的目录,然后将目录更改为堆栈顶部的目录。

根据我的个人经验,pushdpopd 命令是我在自动化脚本中最常用的命令,这是一种创建所访问目录的"面包屑痕迹"的方式。当自动化任务要求您以特定方式或特定顺序更改文件(和目录)时,使用此列表将有所帮助。先前访问过的目录可以从堆栈中剥离并且可以轻松地重新访问。

dirs  命令是我最近偶尔使用的命令,但这个命令也很好用。此命令可用于查看目录堆栈自身,以查看最近访问过的目录的列表。此命令还有一些选项,可用于根据需要来管理堆栈。下面是 pushdpopddirs 命令用法的示例:

/home/jsmith/grocery_store/foods/ 开始,我们将使用 pushd 来切换到  produce 目录:

$ pushd produce

当前目录现在是 /home/jsmith/grocery_store/foods/produce 目录,由于我们已经使用了 pushd 来切换到此目录,所以这个目录已经被添加到目录堆栈中,如 dirs 命令所示:

1
2
3
$ dirs
/home/jsmith/grocery_store/foods/produce /home/jsmith/grocery_store/foods
$

注意,目录的列表(从左到右)是按照最近访问的时间列出的。我们将再次使用 pushd 来进入 meats 目录,然后再次查看目录堆栈:

1
2
3
4
$ pushd /home/jsmith/grocery_store/foods/meats
$ dirs
/home/jsmith/grocery_store/foods/meats /home/jsmith/grocery_store/foods/produce /home/jsmith/grocery_store/foods
$

目录列表现在已经增长为 3 个最近访问过的目录。现在,如果我们使用 popd 命令,则将删除堆栈顶部列出的目录,并将当前目录更改回  /home/jsmith/grocery_store/foods/produce,因为它现在是目录堆栈顶部列出的目录:

1
2
3
$ popd
$ pwd
/home/jsmith/grocery_store/foods/produce

再看一下目录堆栈,我们会发现,该列表又回到了最近访问的两个目录:

1
2
3
$ dirs
/home/jsmith/grocery_store/foods/produce /home/jsmith/grocery_store/foods
$

在接下来的文章和教程中,轻松地浏览目录结构肯定是不可或缺的方便技能,希望这篇关于浏览文件系统层次结构的简要介绍已经足够吸引您深入研究。

创建目录

我们已经讨论了目录浏览,现在让我们快速地介绍目录创建,可以通过 mkdir 命令来创建目录:

$ mkdir [target]

在这一示例中,[target] 是您希望创建的目录的名称。执行后,mkdir 将在当前工作目录中创建此目录(因为未指定完整路径)。您还可以在文件系统层次结构的任何级别创建新目录,只要可以确定完整路径,并且您的用户帐户具有执行此操作的权限。例如:

$ mkdir /home/jsmith/grocery_store/foods/produce/veggies

这将在 home/jsmith/grocery_store/foods/produce 目录中创建  veggies 目录。通常,您可能需要在文件系统层次结构中的同一级别上创建多个目录,在某些情况下,甚至需要创建全新的目录结构。此时,-p 命令选项就很有用了。下面是一个更高级的示例:

$ mkdir -p /home/jsmith/grocery_store/foods/meats/{beef,fish,chicken,pork/{bacon,sausage}}

在此示例中,有几个概念在起作用。首先,-p  选项允许我们创建指定的"路径",无论此路径中的目录先前是否已创建。使用括号,可以同时创建多个目录。这里,我们已经在 meats        目录中(并非先前创建的目录)创建了 beeffishchicken 和    pork 子目录。此外,我们还继续在 pork 目录下创建了两个子目录:bacon 和  sausage 子目录。 这样,您可以轻松地看到起作用的命令行的强大功能,只需一个命令即可创建全新的目录结构。

查看文件和目录

我们讨论了如何在标准 GNU/Linux 操作系统上浏览和创建目录。现在,我们将讨论如何列出目录、查看文件和编辑文件。除了基于 GUI 的应用程序之外,还有几种直接从 CLI        查看文件和目录的方法。

使用 ls 查看目录内容

可以采用多种方法来使用 ls 命令查看目录内容。命令提示符下的简单 ls 以水平方式显示当前工作目录的内容:

$ ls

还有几个常用的命令选项。例如,向命令中添加一个   -l 标志以显示目标目录的内容,包括文件/目录名称、权限、所有者、修改日期和文件/目录大小:

$ ls -l

-a 选项可显示目录的内容,包括隐藏文件,隐藏文件是指主要用于桌面的自定义和个性化以及用于应用程序配置的文件:

$ ls -a

ls 的不常用命令选项

我们目前介绍的 ls 命令选项都是广泛采用的选项。然而,还有一些选项也很好用。下面是这些命名的简要列表:

使用 cat 查看文件

要查看文件内容,最简单的命令之一是 cat 命令。cat 是  "concatenate(拼接)"的缩写,不仅用于查看文件的内容,还用于通过重定向输出来创建文件:

1
2
3
$ cat pacific_rose
This is a test file.
$

在这里,pacific_rose 文件包含文本 "This is a test file."  cat 直接在终端窗口中显示此文件的内容,这是查看所包含内容的快速、简便方法。

与重定向运算符组合后,您也可以使用 cat 来创建文件:

$ cat > granny_smith

以上命令将在当前工作目录中创建一个名为 granny_smith 的新文件。

$ cat apple1.txt apple2.txt apple3.txt > three_apples.txt

如前所述,cat"concatenate(拼接)" 的缩写,上面的示例说明了如何使用 > 重定向运算符将多个文件的内容组合成一个文件。

下面列出的命令标志(或选项)也可以方便地与 cat 命令一起使用:

  • cat -n 将在文件输出旁边显示行号。

  • cat -e 将在文件输出中显示行结尾和行空白,通常以 $ 字符表示。

  • cat -T 将在文件输出中显示以制表符分隔的行。

使用 more/less 查看文件

要在终端中直接查看文件,另外两种方法是使用 moreless 命令。more 和   less 都允许您查看文件的内容,在文件内容填满屏幕缓冲区时暂停文件输出。您可以选择在此时暂停,或按任意键继续查看剩余的输出。但是,less 命令略有不同。虽然在查看文件方面,less 命令与 more 命令功能相同,但使用 less,您还可以在输出中后退,而 more 命令只允许向前查看输出。

终端文本编辑器 (vim/emacs/pico)

在实践中学习时,学习 Linux 通常需要您进行更改,以便创建配置文件、更新配置文件和/或从配置文件中删除信息。这些操作都可以通过使用大多数 Linux 操作系统上提供的文本编辑器来完成。这些文本编辑器包括:

  • vi/vim

  • emacs

  • pico

每个编辑器都有自己的优点、缺点和特色。下面是一个简短的资源列表,并非吹嘘这个编辑器比另一个编辑器更强大,而是为您提供每个编辑器的提示/技巧:

vi/vim:

  • Learn vim For the Last Time: Tutorial  and Primer

emacs

  • Absolute Beginners Guide to emacs

pico

  • Basic Pico Commands

文件权限

随着您开始在学习路径中学习更多内容,您最终会发现需要了解文件权限。作为 Linux 用户,我们可以精细地控制您作为用户可以对 Linux 操作系统上存储的文件执行的操作。在许多情况下,应该为文件和目录设置一定级别的权限才能让文件和目录生效,例如,让某个脚本变为可执行。我们简要介绍一下文件权限。

1
2
3
4
5
$ ls -l
-rw-r--r--  1 jdoe  staff  0 Mar 15 08:30 brisket.txt
-rw-r--r--  1 jdoe  staff  0 Mar 15 08:30 ground.txt
-rw-r--r--  1 jdoe  staff  0 Mar 15 08:30 ribs.txt
-rw-r--r--  1 jdoe  staff  0 Mar 15 08:30 tar_tar.txt

在此示例目录列表中,文件权限由 -rw-r--r-- 数据表示,将为目录中包含的每个文件提供此数据。在文件和目录上为 3 个帐户角色设置了权限:用户、组和其他(即其他所有人)。可以授予的权限为读 (r)、写 (w) 和执行  (x)。为了说明这一点,我们看看下表,其描述了对每个文件应用权限的方式(根据访问文件的帐户和组):

如果我们从左到右阅读 brisket.txt 文件的文件权限(并且忽略第一个 - 字符),那么文件权限如下所示:

对文件或目录的完全访问权限将表示为 rwx。在此示例中,用户 jdoe 具有读写权限,staff 组具有读权限,所有其他用户均具有读权限。

使用 chmod 更改权限

展开阅读全文

本文系作者在时代Java发表,未经许可,不得转载。

如有侵权,请联系nowjava@qq.com删除。

编辑于

关注时代Java

关注时代Java