Linux 基本文件操作

LinuxBeginner
立即练习

简介

Linux 使用目录和文件组成的树状结构来组织数据。命令会在这棵树中的某个位置上执行,因此,可靠地处理文件需要先回答三个问题:我在哪里?这里有什么?我要操作的项目由哪个路径标识?

本实验将在 /home/labex/project/file-basics 中逐步练习这些概念。你将使用绝对路径和相对路径进行导航,查看可见和隐藏的条目,创建文件和目录,使用通配符选择名称,并安全地复制、移动和删除练习文件。最后,你还将学习终端快捷键,在不改变这些操作含义的情况下提高操作速度。

定位工作目录

在本步骤中,你将了解终端提示符与命令实际执行目录之间的关系。

Shell 始终有一个当前工作目录。相对路径从该目录开始解析,因此先确认当前位置可以避免许多初学者常见错误。使用该实验工作区的完整路径进入工作区:

cd /home/labex/project/file-basics

/ 开头的路径称为绝对路径。它从文件系统根目录开始,无论你从哪里开始操作,都能标识同一个位置。

输出当前工作目录:

pwd

你应该看到:

/home/labex/project/file-basics

将这个位置保存下来作为证据。> 运算符会把输出重定向到 starting-location.txt;由于输出被写入文件,这次不会显示在终端中:

pwd > starting-location.txt

读取文件,确认保存的内容:

cat starting-location.txt

终端屏幕和文件中应该显示相同的绝对路径。

使用相对路径进行导航

在本步骤中,你将使用相对路径以及特殊名称 ...,在相邻目录之间移动。

如有需要,先返回工作区:

cd /home/labex/project/file-basics

列出其中的可见条目:

ls

你应该看到 path-mapstarting-location.txt。使用相对路径进入 path-map。相对路径会从当前目录开始解析:

cd path-map
pwd

现在进入 north,并读取其中的参考文件:

cd north
cat reference.txt

输出应为 north reference。名称 .. 表示父目录,也就是当前目录上一级的位置:

cd ..

path-map 进入其子目录 south

cd south
cat reference.txt

名称 . 表示当前目录。将当前绝对路径保存到实验根目录中:使用 pwd,并将相对目标路径设置为向上返回两级:

pwd > ../../relative-location.txt

使用绝对路径直接返回实验根目录:

cd /home/labex/project/file-basics
cat relative-location.txt

保存的路径应以 /path-map/south 结尾。你已经同时使用了相对路径移动和绝对路径返回。

查看目录内容

在本步骤中,你将使用 ls 选项查看隐藏名称和文件详细信息。

在实验根目录中执行普通列表查看:

cd /home/labex/project/file-basics
ls

Linux 通常会隐藏以点号开头的名称。-a 选项表示「全部」,会将这些条目也显示出来:

ls -a

现在你应该能看到 .practice-note,以及表示当前目录的 . 和表示父目录的 ..

-l 选项会生成长格式列表,其中包含权限、所有者、大小、时间和名称:

ls -l

组合这些选项,以长格式查看所有条目:

ls -la

输出的每一行都以类型和权限字段开头。开头的 d 表示目录;开头的 - 表示普通文件。权限将在后续内容中详细学习。

保存包含隐藏条目在内的名称。ls 在这个受控工作区中已经按字母顺序显示名称,因此暂时不需要额外的排序命令:

ls -A > all-names.txt

-a 不同,-A 会省略特殊条目 ...,但保留其他隐藏名称。显示保存的结果:

cat all-names.txt

列表中应包含 .practice-notepath-map 以及前面步骤创建的文件。

创建目录和文件

在本步骤中,你将创建一个小型项目目录树,并向普通文件中写入文本。

mkdir 用于创建目录。它的 -p 选项还会创建缺少的父目录,因此一条命令就能建立嵌套路径:

cd /home/labex/project/file-basics
mkdir -p workspace/docs workspace/logs

这会创建 workspace 以及它的子目录 docslogs。查看创建结果:

find workspace -maxdepth 2 -type d

当指定名称不存在时,touch 会创建空文件。一次创建两个文件:

touch workspace/docs/guide.txt workspace/logs/app.log

向指南文件写入内容。单个 > 会使用命令输出替换目标文件的内容:

echo "Linux file practice" > workspace/docs/guide.txt

使用 >> 追加第二行;该运算符会保留已有内容:

echo "Paths make locations predictable" >> workspace/docs/guide.txt

读取整个文件:

cat workspace/docs/guide.txt

你应该按原有顺序看到两行内容。空的 app.log 也已经存在,稍后将用于练习通配符。

使用通配符选择名称

在本步骤中,你将创建多组文件,并根据文件名模式选择它们。

进入日志目录:

cd /home/labex/project/file-basics/workspace/logs

大括号展开会在命令运行前生成多个字面名称。创建编号日志文件:

touch app{1..3}.log worker{1..2}.log notes.txt

Shell 会将 {1..3} 展开为 1 2 3,因此 app{1..3}.log 会变成三个参数。

通配符有所不同:它会匹配已经存在的名称。* 可以匹配任意长度的字符序列:

ls *.log

输出会包含所有以 .log 结尾的名称,但不包括 notes.txt

? 通配符恰好匹配一个字符。只列出带编号的 app 日志:

ls app?.log

Shell 会按字母顺序展开文件名模式。printf 会将展开后的每个名称分别打印在单独一行,> 则保存这些行:

printf '%s\n' *.log > matched-logs.txt
cat matched-logs.txt

保存的列表应包含 app.logapp1.logapp2.logapp3.logworker1.logworker2.log。如果将 *.log 放在引号中,就会阻止通配符展开,因此这里特意不加引号。

安全地复制、移动和删除文件

在本步骤中,你将先比较 cpmvrm 的作用,然后在后续挑战中使用它们。

返回工作区目录:

cd /home/labex/project/file-basics/workspace

cp SOURCE DESTINATION 会创建另一个文件,同时保留源文件不变。为指南文件创建备份:

cp docs/guide.txt docs/guide-backup.txt

确认两个文件的内容完全相同。cmp 会逐字节比较两个文件;如果文件匹配,它不会输出任何内容;如果出现错误消息,则表示两个文件不同:

cmp docs/guide.txt docs/guide-backup.txt

mv SOURCE DESTINATION 会移动或重命名项目。将备份移动到工作区根目录,并为它指定一个更清晰的名称:

mv docs/guide-backup.txt archived-guide.txt

分别列出这两个位置:

ls docs
ls

你应该在 docs 下看到 guide.txt,并在当前目录中看到 archived-guide.txt

rm 会永久删除指定的文件;终端通常没有回收站。只删除可丢弃的 notes 文件:

rm logs/notes.txt

再次列出该目录,使删除结果清晰可见:

ls logs

其中不应再出现 notes.txt。原始指南文件和移动后的副本仍然可用,只有明确指定的可丢弃文件被删除。

使用终端快捷键提高效率

在本步骤中,你将练习四个终端控制操作,减少输入量,并帮助处理持续运行的命令。

先进入文档目录:

cd /home/labex/project/file-basics/workspace/docs

运行一个稍后会重复使用的命令:

cat guide.txt

按一次向上方向键(Up Arrow)。上一条 cat guide.txt 命令应重新出现在命令行提示符处。按 Enter 键再次运行它。命令历史调取功能可以避免重复输入,而且在执行前仍然可以编辑调取出的命令行。

接下来输入 cat g,但不要按 Enter 键,然后按 Tab 键。由于只有 guide.txt 与之匹配,Shell 应该会自动补全文件名。按 Enter 键运行补全后的命令。

现在启动一个会持续等待的命令:

tail -f /dev/null

tail -f 会持续跟踪文件并等待新数据。/dev/null 不会提供有用的行,因此该命令看起来会静默停留。按 Ctrl+C 发送中断信号并返回命令行提示符。当需要停止前台命令时,这是通常采用的第一种响应方式。

Ctrl+L 清除屏幕上显示的旧输出。与 clear 一样,这不会删除文件或命令历史。

返回命令行提示符后,创建一个完成标记:

echo "Shortcuts practiced" > /home/labex/project/file-basics/shortcuts-complete.txt
cat /home/labex/project/file-basics/shortcuts-complete.txt

看到该标记,说明你已经在交互式练习后成功恢复了命令行提示符。

总结

你学习了工作目录和路径如何控制文件操作。你使用绝对路径和相对路径进行导航,查看隐藏条目和元数据,创建目录树和文本文件,使用通配符选择名称,并比较复制、移动和永久删除的区别。你还练习了调取命令历史、Tab 补全、Ctrl+CCtrl+L。下一个实验将介绍当遇到不熟悉的命令或选项时,如何查找可靠的帮助信息。