Linux 文件系统导航命令
详解 pwd、ls 和 cd
第一章——引言
在上一期视频中,我们介绍了 Linux 文件系统的目录结构。
我们了解到,Linux 把所有文件和目录组织成一棵统一的目录树。
这棵目录树的最顶端,是根目录。
根目录使用一个正斜杠表示:
|
1 2 |
/ |
在根目录下面,有许多重要的系统目录,例如:
home
etc
var
usr
tmp
以及其他许多目录。
但是,了解 Linux 的目录结构,只是第一步。
要真正使用 Linux,我们还必须知道,怎样在这棵目录树中移动。
我们需要回答三个最基本的问题:
我现在在哪里?
当前目录中有什么?
怎样移动到另一个目录?
Linux 提供了三个最重要的导航命令:
pwd
ls
以及 cd
pwd 命令告诉我们当前所在的位置。
ls 命令显示当前位置周围有哪些文件和目录。
cd 命令则把我们移动到另一个目录。
在本期视频中,我们将学习这些命令的使用方法。
我们还会介绍:
绝对路径。
相对路径。
用户主目录。
父目录。
隐藏文件。
Tab 自动补全。
名称中带有空格的目录。
以及 Linux 初学者经常遇到的一些错误。
看完本期视频后,你将能够更加自信地在 Linux 文件系统中移动。
第二章——当前工作目录
当你打开终端时,Shell 已经位于某个目录之中。
这个位置叫作:
当前工作目录。
你可以把它理解为,你当前在 Linux 目录树中的位置。
例如,你的当前工作目录可能是:
|
1 2 |
/home/alex |
也可能是:
|
1 2 |
/etc |
或者:
|
1 2 |
/var/log |
凡是使用相对文件名或相对路径的命令,都会从当前工作目录开始查找。
例如,假设你当前所在的目录是:
|
1 2 |
/home/alex |
然后执行:
|
1 2 |
ls Documents |
Linux 会从当前目录出发,解释 Documents 这个名称。
在这个例子中,它实际表示:
|
1 2 |
/home/alex/Documents |
这就是为什么,知道自己当前位于哪个目录非常重要。
当一个命令找不到文件或目录时,你首先应该问的问题通常是:
我现在究竟在哪里?
第三章——使用 pwd 查看当前位置
用于显示当前工作目录的命令是:
|
1 2 |
pwd |
pwd 的完整含义是:
Print Working Directory
也就是:
打印当前工作目录。
运行:
|
1 2 |
pwd |
终端可能会显示:
|
1 2 |
/home/alex |
这表示你当前位于用户 Alex 的主目录中。
假设你进入 Documents 目录:
|
1 2 |
cd Documents |
然后再次运行:
|
1 2 |
pwd |
输出可能是:
|
1 2 |
/home/alex/Documents |
pwd 命令在你连续进入多个目录以后,尤其有用。
例如:
|
1 2 3 4 5 |
cd projects cd website cd images pwd |
输出可能是:
|
1 2 |
/home/alex/projects/website/images |
当你在 Linux 文件系统中迷路时,运行:
|
1 2 |
pwd |
它会告诉你当前所在的准确位置。
第四章——使用 ls 列出文件
知道自己在哪里以后,下一个问题就是:
当前目录中有什么?
用于列出目录内容的命令是:
|
1 2 |
ls |
ls 来自英文单词:
List
也就是:
列出。
运行:
|
1 2 |
ls |
你可能会看到:
|
1 2 3 4 5 6 7 |
Desktop Documents Downloads Music Pictures Videos |
这些是当前工作目录中的可见文件和目录。
ls 命令不会把你移动到这些目录中。
它只是显示这些名称。
你也可以在不进入某个目录的情况下,查看那个目录中的内容。
例如:
|
1 2 |
ls /etc |
这个命令会显示 /etc 目录中的内容。
但是,你当前的工作目录不会发生变化。
你可以运行:
|
1 2 |
pwd |
确认自己的位置仍然没有改变。
这个区别非常重要:
ls 用来查看一个目录。
cd 用来进入一个目录。
第五章——常用的 ls 选项
最基本的 ls 命令只显示文件和目录的名称。
但是,配合不同选项,ls 可以显示更多信息。
第一个非常实用的选项是:
|
1 2 |
ls -l |
这里的小写字母 l,表示:
Long listing format
也就是:
长格式列表。
它会显示:
文件权限。
文件所有者。
所属用户组。
文件大小。
修改时间。
以及文件名。
一行输出可能是:
|
1 2 |
-rw-r--r-- 1 alex alex 2048 Jun 20 10:30 notes.txt |
现在不必理解其中的每一个字段。
我们会在后面的文件权限视频中详细解释。
目前只需要记住:
|
1 2 |
ls -l |
比普通的 ls 显示更多详细信息。
另一个重要选项是:
|
1 2 |
ls -a |
这里的小写字母 a 表示:
All
也就是:
显示全部文件。
它会把隐藏文件和隐藏目录也显示出来。
在 Linux 中,名称以点开头的文件,通常会被当作隐藏文件。
例如:
|
1 2 3 4 5 |
.bashrc .profile .config .ssh |
普通的 ls 通常不会显示这些名称。
如果要同时显示详细信息和隐藏文件,可以使用:
|
1 2 |
ls -la |
另一个常用命令是:
|
1 2 |
ls -lh |
这里的小写字母 h 表示:
Human-readable
也就是:
以人类容易阅读的格式显示。
它会让文件大小更容易理解。
Linux 不再只显示一串字节数,而可能显示:
|
1 2 3 4 |
4K 12M 2G |
还可以把这些选项组合起来:
|
1 2 |
ls -lah |
这个命令会显示:
长格式列表。
隐藏文件。
以及容易阅读的文件大小。
对初学者来说,最常用的形式包括:
|
1 2 3 4 5 6 |
ls ls -l ls -a ls -la ls -lh |
第六章——使用 cd 切换目录
用于移动到另一个目录的命令是:
|
1 2 |
cd |
cd 的完整含义是:
Change Directory
也就是:
切换目录。
假设当前目录中有一个名为 Documents 的目录。
要进入它,可以运行:
|
1 2 |
cd Documents |
然后运行:
|
1 2 |
pwd |
你可能会看到:
|
1 2 |
/home/alex/Documents |
这说明当前工作目录已经发生了改变。
如果要进入一个系统目录,可以使用完整路径:
|
1 2 |
cd /var/log |
现在运行:
|
1 2 |
pwd |
就会显示:
|
1 2 |
/var/log |
cd 命令只能用于目录。
不能使用 cd 进入普通文件。
例如:
|
1 2 |
cd notes.txt |
如果 notes.txt 是一个普通文件,这个命令会失败。
Shell 可能会显示:
|
1 2 |
Not a directory |
意思是:
它不是一个目录。
第七章——绝对路径
Linux 路径主要分为两种:
绝对路径。
和相对路径。
绝对路径从根目录开始。
根目录使用一个正斜杠表示:
|
1 2 |
/ |
下面这些都是绝对路径:
|
1 2 |
/etc |
|
1 2 |
/var/log |
|
1 2 |
/home/alex/Documents |
|
1 2 |
/usr/local/bin |
因为绝对路径从根目录开始,所以无论你当前位于什么地方,它所指向的位置都不会改变。
例如:
|
1 2 |
cd /etc |
始终会进入 /etc 目录。
无论你当前位于:
|
1 2 |
/home/alex |
还是:
|
1 2 |
/tmp |
或者:
|
1 2 |
/var/log |
路径 /etc 永远表示同一个目录。
绝对路径清楚、准确,不容易产生歧义。
它经常用于:
系统管理。
配置文件。
Shell 脚本。
以及技术文档。
第八章——相对路径
相对路径不会以正斜杠开头。
它从当前工作目录开始。
假设你当前的位置是:
|
1 2 |
/home/alex |
并且这个目录中有一个名为 Documents 的目录。
你可以运行:
|
1 2 |
cd Documents |
进入它。
这就是一个相对路径。
Linux 会从:
|
1 2 |
/home/alex |
开始查找。
然后寻找:
|
1 2 |
Documents |
最后到达的完整位置是:
|
1 2 |
/home/alex/Documents |
你也可以使用绝对路径:
|
1 2 |
cd /home/alex/Documents |
这两个命令最终进入同一个目录。
它们之间的区别,在于路径从哪里开始。
绝对路径从根目录开始。
相对路径从当前工作目录开始。
相对路径也可以包含多个目录名称。
例如:
|
1 2 |
cd projects/website/images |
Linux 会从当前目录开始。
先进入 projects。
然后进入 website。
最后进入 images。
相对路径通常更短,输入速度也更快。
但是,它的含义取决于你当前所在的位置。
这就是为什么 pwd 和 cd 经常需要配合使用。
第九章——一个点和两个点
Linux 提供了两个特殊的目录名称。
一个点表示:
当前目录。
写作:
|
1 2 |
. |
两个点表示:
父目录,也就是上一级目录。
写作:
|
1 2 |
.. |
假设当前目录是:
|
1 2 |
/home/alex/Documents |
运行:
|
1 2 |
cd .. |
就会向上移动一级。
新的位置是:
|
1 2 |
/home/alex |
再次运行:
|
1 2 |
cd .. |
现在的位置变成:
|
1 2 |
/home |
你也可以在一条命令中向上移动两级:
|
1 2 |
cd ../.. |
一个点经常用来表示当前目录中的某个文件。
例如:
|
1 2 |
./script.sh |
意思是:
运行当前目录中的 script.sh 文件。
你也可能看到这样的路径:
|
1 2 |
cd ./projects |
它表示:
进入当前目录中的 projects 目录。
在这种情况下,./ 可以省略。
下面这个命令通常表示相同的意思:
|
1 2 |
cd projects |
两个点在目录导航中更加常用。
例如,假设你当前位于:
|
1 2 |
/home/alex/Documents |
现在你想进入 Downloads 目录。
Documents 和 Downloads 都位于 /home/alex 下面。
你可以运行:
|
1 2 |
cd ../Downloads |
它的意思是:
先回到上一级目录。
然后进入 Downloads 目录。
第十章——用户主目录
每一个普通 Linux 用户,通常都有自己的主目录。
对于名为 Alex 的用户,主目录可能是:
|
1 2 |
/home/alex |
波浪号代表当前用户的主目录。
它写作:
|
1 2 |
~ |
要返回用户主目录,可以运行:
|
1 2 |
cd ~ |
也可以直接运行不带任何路径的 cd:
|
1 2 |
cd |
这通常也会返回当前用户的主目录。
波浪号还可以与其他目录名称组合使用。
例如:
|
1 2 |
cd ~/Documents |
对于用户 Alex 来说,它表示:
|
1 2 |
/home/alex/Documents |
另一个非常实用的命令是:
|
1 2 |
cd - |
它会返回上一个工作目录。
例如:
|
1 2 3 4 |
cd /var/log cd /etc cd - |
最后一条命令会把你带回:
|
1 2 |
/var/log |
再次运行:
|
1 2 |
cd - |
又可能返回:
|
1 2 |
/etc |
这个命令非常适合在两个目录之间来回切换。
这里还需要区分两个重要位置:
|
1 2 |
/ |
和:
|
1 2 |
/root |
单独的正斜杠,是整个文件系统的根目录。
而 /root 通常是 root 用户的主目录。
它们不是同一个目录。
第十一章——隐藏文件和隐藏目录
在 Linux 中,名称以点开头的文件和目录,通常会被当作隐藏项目。
例如:
|
1 2 3 4 5 6 |
.bashrc .profile .config .cache .ssh |
这些文件并不是秘密文件。
它们只是不会出现在普通的目录列表中。
运行:
|
1 2 |
ls |
通常看不到它们。
运行:
|
1 2 |
ls -a |
Linux 就会把它们显示出来。
许多隐藏文件用于保存用户配置。
例如:
|
1 2 |
.bashrc |
可能保存 Bash 的配置。
|
1 2 |
.ssh |
可能保存 Secure Shell,也就是 SSH 的配置和密钥。
|
1 2 |
.config |
可能保存应用程序设置。
隐藏目录的使用方法,与普通目录完全相同。
例如:
|
1 2 |
cd ~/.config |
会进入当前用户主目录中的隐藏 .config 目录。
名称开头的点,只会影响它是否出现在普通列表中。
它并不会让这个文件或目录无法访问。
第十二章——空格和 Tab 自动补全
Linux 文件名和目录名中可以包含空格。
假设有一个目录名叫:
|
1 2 |
My Projects |
下面这个命令无法正确工作:
|
1 2 |
cd My Projects |
Shell 会把空格当作参数分隔符。
因此,它会把 My 和 Projects 当成两个不同的参数。
一种解决方法是使用引号:
|
1 2 |
cd "My Projects" |
另一种方法是使用反斜杠转义空格:
|
1 2 |
cd My\ Projects |
这两个命令都指向同一个目录。
Tab 自动补全可以让这个过程更简单。
假设目录名是:
|
1 2 |
Documents |
你可以先输入:
|
1 2 |
cd Doc |
然后按下 Tab 键。
如果只有一个名称匹配,Shell 可能会自动补全为:
|
1 2 |
cd Documents/ |
假设当前目录中同时存在:
|
1 2 3 |
Documents Downloads |
输入:
|
1 2 |
cd Do |
可能还不足以确定具体是哪一个目录。
再次按 Tab,Shell 可能会显示两个候选名称。
Tab 自动补全非常实用。
它可以减少输入量。
防止拼写错误。
并帮助你处理很长的文件名。
在处理名称中的空格时,它也可能自动加入转义符。
例如,它可能自动补全为:
|
1 2 |
My\ Projects/ |
Tab 自动补全并不是一条单独的 Linux 命令。
它是 Shell 提供的一项功能。
第十三章——一次完整的目录导航示例
现在,我们把前面介绍的命令组合起来,完成一次简单的终端操作。
首先,查看当前所在的位置:
|
1 2 |
pwd |
假设输出是:
|
1 2 |
/home/alex |
然后列出当前目录中可见的内容:
|
1 2 |
ls |
接下来,显示包含隐藏文件在内的详细列表:
|
1 2 |
ls -la |
进入 Documents 目录:
|
1 2 |
cd Documents |
确认当前位置:
|
1 2 |
pwd |
列出文件,并用容易阅读的方式显示文件大小:
|
1 2 |
ls -lh |
回到上一级目录:
|
1 2 |
cd .. |
然后进入 Downloads 目录:
|
1 2 |
cd Downloads |
使用上一目录命令返回 Documents:
|
1 2 |
cd - |
现在使用绝对路径,直接进入系统目录:
|
1 2 |
cd /var/log |
列出目录内容:
|
1 2 |
ls -lh |
返回用户主目录:
|
1 2 |
cd |
最后,再次确认当前位置:
|
1 2 |
pwd |
输出应该类似:
|
1 2 |
/home/alex |
完整的操作流程是:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
pwd ls ls -la cd Documents pwd ls -lh cd .. cd Downloads cd - cd /var/log ls -lh cd pwd |
这个简单练习包含了:
查看当前位置。
列出文件。
进入目录。
向上移动。
使用绝对路径。
使用相对路径。
返回上一个目录。
以及返回用户主目录。
第十四章——为什么 cd 是 Shell 内建命令
大多数初学者并不需要了解 cd 是如何实现的。
但是,这个小知识可以帮助我们理解 Shell 的工作原理。
许多 Linux 命令,都是独立的可执行程序。
例如:
|
1 2 |
ls |
以及:
|
1 2 |
cat |
它们通常是存放在文件系统中的可执行文件。
但是,cd 不一样。
它通常直接内建在 Shell 中。
在 Bash 中,可以使用下面的命令检查:
|
1 2 |
type cd |
Shell 可能会显示:
|
1 2 |
cd is a shell builtin |
意思是:
cd 是一条 Shell 内建命令。
为什么 cd 必须内建在 Shell 中?
因为每一个进程,都有自己的当前工作目录。
假设 cd 是一个普通的外部程序。
Shell 会启动这个程序,并把它作为一个子进程运行。
这个子进程可以改变自己的工作目录。
但是,它不能永久改变父进程,也就是 Shell 的工作目录。
当这个子程序结束后,Shell 仍然会停留在原来的目录中。
因此,必须由 Shell 自己完成目录切换。
这就是为什么 cd 是一条 Shell 内建命令。
你不需要了解这些知识,也可以正常使用 cd。
但是,它揭示了一个重要概念:
当前工作目录属于一个正在运行的进程。
第十五章——初学者常见错误
第一个常见错误,是忘记 Linux 文件名区分大小写。
下面三个名称完全不同:
|
1 2 3 4 |
Documents documents DOCUMENTS |
如果目录名是 Documents,那么下面这个命令可能会失败:
|
1 2 |
cd documents |
第二个错误,是混淆正斜杠和反斜杠。
Linux 路径通常使用正斜杠:
|
1 2 |
/home/alex/Documents |
Windows 路径经常使用反斜杠。
在普通 Linux 路径中,不应该写成:
|
1 2 |
\home\alex\Documents |
第三个错误,是混淆 / 和 /root。
根目录是:
|
1 2 |
/ |
root 用户的主目录是:
|
1 2 |
/root |
第四个错误,是尝试使用 cd 进入一个普通文件。
如果 notes.txt 不是目录,下面的命令会失败:
|
1 2 |
cd notes.txt |
第五个错误,是忘记给包含空格的名称加引号。
下面这个命令可能会失败:
|
1 2 |
cd My Projects |
正确写法是:
|
1 2 |
cd "My Projects" |
第六个错误,是误以为 ls 会进入某个目录。
下面这个命令:
|
1 2 |
ls /etc |
只会显示 /etc 中的内容。
它不会进入 /etc。
如果要进入这个目录,应该运行:
|
1 2 |
cd /etc |
最后一个错误,是在使用相对路径之前,没有检查当前所在的位置。
假设你运行:
|
1 2 |
cd Documents |
然后看到:
|
1 2 |
No such file or directory |
首先运行:
|
1 2 |
pwd |
然后运行:
|
1 2 |
ls |
你可能只是位于错误的目录中。
结论
Linux 文件系统导航,主要围绕三个核心命令展开。
第一个命令是:
|
1 2 |
pwd |
它回答的问题是:
我在哪里?
第二个命令是:
|
1 2 |
ls |
它回答的问题是:
这里有什么?
第三个命令是:
|
1 2 |
cd |
它回答的问题是:
我要去哪里?
绝对路径从根目录开始。
相对路径从当前工作目录开始。
一个点表示当前目录。
两个点表示父目录。
波浪号表示当前用户的主目录。
cd - 会返回上一个工作目录。
隐藏文件和隐藏目录的名称以点开头。
名称中包含空格时,需要使用引号或者转义字符。
Tab 自动补全可以让目录导航更快,也更准确。
最重要的规律是:
|
1 2 3 4 5 6 |
pwd —— 我在哪里? ls —— 这里有什么? cd —— 我要去哪里? |
一旦理解了这些命令和路径概念,Linux 目录导航就会变得简单而且有规律。
你不再需要在文件系统中盲目移动。
你始终知道自己的位置。
可以查看周围有哪些文件和目录。
也可以准确选择下一步要去哪里。
在下一期视频中,我们将学习怎样创建和管理文件与目录。
我们将介绍:
|
1 2 3 4 5 6 7 |
touch mkdir cp mv rm rmdir |
这些命令可以帮助我们:
创建文件和目录。
复制文件。
移动文件。
重命名文件。
以及删除文件和目录。
