3.3. 文件操作

3.3.1. 查看文件属性

3.3.1.1. 更多关于 ls

除了文件名,ls 还可以提供很多其他信息,例如我们已经讨论过的文件类型。它还可以显示文件的权限、文件大小、inode 编号、创建日期和时间、所有者以及指向该文件的链接数。使用-a选项给 ls,通常隐藏的文件也可以显示出来。这些文件名称以点开头。一些典型的例子包括您主目录中的配置文件。当您使用某个系统一段时间后,您会注意到已经创建了数十个文件和目录,但它们不会自动列在目录索引中。除此之外,每个目录都包含一个名为点 (.) 的文件和一个名为两个点 (..) 的文件,它们与其 inode 编号结合使用,以确定目录在文件系统树结构中的位置。

您真的应该阅读关于 lsInfo 页面,因为它是一个非常常用的命令,有很多有用的选项。选项可以组合使用,就像大多数 UNIX 命令及其选项一样。一个常见的组合是 ls -al;它显示文件及其属性的长列表,以及任何符号链接指向的目标。ls -latr 显示相同的文件,只是现在按上次更改的相反顺序排列,因此最近更改的文件出现在列表的底部。这里有一些例子

krissie:~/mp3> ls
Albums/  Radio/  Singles/  gene/  index.html

krissie:~/mp3> ls -a
./   .thumbs  Radio     gene/
../  Albums/  Singles/  index.html

krissie:~/mp3> ls -l Radio/
total 8
drwxr-xr-x    2 krissie krissie  4096 Oct 30  1999 Carolina/
drwxr-xr-x    2 krissie krissie  4096 Sep 24  1999 Slashdot/

krissie:~/mp3> ls -ld Radio/
drwxr-xr-x    4 krissie krissie  4096 Oct 30  1999 Radio/

krissie:~/mp3> ls -ltr
total 20
drwxr-xr-x    4 krissie krissie  4096 Oct 30  1999 Radio/
-rw-r--r--    1 krissie krissie   453 Jan  7  2001 index.html
drwxrwxr-x   30 krissie krissie  4096 Oct 20 17:32 Singles/
drwxr-xr-x    2 krissie krissie  4096 Dec  4 23:22 gene/
drwxrwxr-x   13 krissie krissie  4096 Dec 21 11:40 Albums/

在大多数 Linux 版本中,ls 默认被别名为 color-ls。此功能允许您在不使用任何 ls 选项的情况下查看文件类型。为了实现这一点,每种文件类型都有自己的颜色。标准方案在/etc/DIR_COLORS:

表 3-5. Color-ls 默认颜色方案

颜色文件类型
蓝色目录
红色压缩文档
白色文本文件
粉色图像
青色链接
黄色设备
绿色可执行文件
闪烁的红色损坏的链接

更多信息请参见 man 页面。早期,相同的信息是通过在每个非标准文件名后添加后缀来显示的。对于单色使用(例如打印目录列表)和一般可读性,此方案仍在使用

表 3-6. ls 的默认后缀方案

字符文件类型
普通文件
/目录
*可执行文件
@链接
=套接字
|命名管道

有关 ls 命令的完整功能和特性的描述,请阅读 info coreutils ls

3.3.1.2. 更多工具

要了解更多关于我们正在处理的数据类型,我们使用 file 命令。通过应用某些测试来检查文件系统中文件的属性、魔数和语言测试,file 尝试对文件的格式做出有根据的猜测。一些例子

mike:~> file Documents/
Documents/: directory

mike:~> file high-tech-stats.pdf
high-tech-stats.pdf: PDF document, version 1.2

mike:~> file Nari-288.rm
Nari-288.rm: RealMedia file

mike:~> file bijlage10.sdw
bijlage10.sdw: Microsoft Office Document

mike:~> file logo.xcf
logo.xcf: GIMP XCF image data, version 0, 150 x 38, RGB Color

mike:~> file cv.txt
cv.txt: ISO-8859 text

mike:~> file image.png
image.png: PNG image data, 616 x 862, 8-bit grayscale, non-interlaced

mike:~> file figure
figure: ASCII text

mike:~> file me+tux.jpg
me+tux.jpg: JPEG image data, JFIF standard 1.01, resolution (DPI),
            "28 Jun 1999", 144 x 144

mike:~> file 42.zip.gz
42.zip.gz: gzip compressed data, deflated, original filename,
         `42.zip', last modified: Thu Nov  1 23:45:39 2001, os: Unix

mike:~> file vi.gif
vi.gif: GIF image data, version 89a, 88 x 31

mike:~> file slide1
slide1: HTML document text

mike:~> file template.xls
template.xls: Microsoft Office Document

mike:~> file abook.ps
abook.ps: PostScript document text conforming at level 2.0

mike:~> file /dev/log
/dev/log: socket

mike:~> file /dev/hda
/dev/hda: block special (3/0)

file 命令有一系列选项,其中包括-z选项,用于查看压缩文件。有关详细描述,请参阅 info file。请记住,file 的结果不是绝对的,它只是一种猜测。换句话说,file 可能会被欺骗。

Note为什么要对文件类型和格式如此大惊小怪?
 

很快,我们将讨论一些用于查看纯文本文件的命令行工具。当在错误类型的文件上使用这些工具时,它们将无法工作。在最坏的情况下,它们会使您的终端崩溃和/或发出很多蜂鸣声。如果这种情况发生在您身上,只需关闭终端会话并启动一个新的会话。但尽量避免这种情况,因为它通常会非常打扰其他人。

3.3.2. 创建和删除文件和目录

3.3.2.1. 制造混乱...

... 并不是一件难事。今天,几乎每个系统都联网了,所以文件自然会从一台机器复制到另一台机器。尤其是在图形环境下工作时,创建新文件轻而易举,并且通常在未经用户批准的情况下完成。为了说明这个问题,这是在一个标准的 RedHat 系统上创建的新用户目录的完整内容

[newuser@blob user]$ ls -al
total 32
drwx------   3 user 	user        4096 Jan 16 13:32 .
drwxr-xr-x   6 root     root        4096 Jan 16 13:32 ..
-rw-r--r--   1 user 	user      24 Jan 16 13:32 .bash_logout
-rw-r--r--   1 user 	user     191 Jan 16 13:32 .bash_profile
-rw-r--r--   1 user 	user     124 Jan 16 13:32 .bashrc
drwxr-xr-x   3 user 	user    4096 Jan 16 13:32 .kde
-rw-r--r--   1 user 	user    3511 Jan 16 13:32 .screenrc
-rw-------   1 user 	user      61 Jan 16 13:32 .xauthDqztLr

乍一看,“已使用”的主目录的内容看起来也不算太糟

olduser:~> ls
app-defaults/ crossover/   Fvwm@     mp3/      OpenOffice.org638/
articles/     Desktop/     GNUstep/  Nautilus/ staroffice6.0/
bin/          Desktop1/    images/   nqc/      training/
brol/         desktoptest/ Machines@ ns_imap/  webstart/
C/            Documents/   mail/     nsmail/   xml/
closed/       Emacs@       Mail/     office52/ Xrootenv.0

但是,当包含所有以点开头的文件和目录时,此目录中有 185 个项目。这是因为大多数应用程序在用户的home目录中都有自己的目录和/或文件,其中包含用户特定的设置。通常,这些文件会在您第一次启动应用程序时创建。在某些情况下,当需要创建不存在的目录时,您会收到通知,但在大多数情况下,一切都是自动完成的。

此外,新文件似乎在不断地创建,因为用户想要保存文件、保留其工作的不同版本、使用 Internet 应用程序以及将文件和附件下载到本地计算机。它不会停止。很明显,绝对需要一个方案来保持对事物的概览。

在下一节中,我们将讨论我们保持秩序的方式。我们只讨论 shell 可用的文本工具,因为图形工具非常直观,并且具有与众所周知的点击式 MS Windows 风格的文件管理器相同的外观和感觉,包括图形帮助功能和您期望从此类应用程序获得的其他功能。以下列表是 GNU/Linux 最流行的文件管理器的概述。大多数文件管理器可以从桌面管理器的菜单启动,或通过单击您的主目录图标启动,或从命令行启动,发出这些命令

这些应用程序绝对值得一试,并且通常会给 Linux 新手留下深刻印象,即使只是因为种类繁多:这些只是用于管理目录和文件的最流行的工具,并且正在开发许多其他项目。现在让我们了解一下内部原理,看看这些图形工具如何使用常见的 UNIX 命令。

3.3.2.2. 工具

3.3.2.2.1. 创建目录

保持事物井然有序的一种方法是通过创建目录和子目录(如果您愿意,也可以称为文件夹和子文件夹)来为某些文件指定特定的默认位置。这是通过 mkdir 命令完成的

richard:~> mkdir archive

richard:~> ls -ld archive
drwxrwxrwx  2 richard richard           4096 Jan 13 14:09 archive/

使用-p选项一步创建目录和子目录

richard:~> cd archive

richard:~/archive> mkdir 1999 2000 2001

richard:~/archive> ls
1999/  2000/  2001/

richard:~/archive> mkdir 2001/reports/Restaurants-Michelin/
mkdir: cannot create directory `2001/reports/Restaurants-Michelin/':
No such file or directory

richard:~/archive> mkdir -p 2001/reports/Restaurants-Michelin/

richard:~/archive> ls 2001/reports/
Restaurants-Michelin/

如果新文件需要与默认文件创建权限不同的权限,则可以在一步操作中设置新的访问权限,仍然使用 mkdir 命令,请参阅 Info 页面了解更多信息。我们将在下一节关于文件安全性的部分讨论访问模式。

目录的名称必须符合与应用于常规文件名的规则相同的规则。最重要的限制之一是您不能在一个目录中拥有两个同名的文件(但请记住,Linux 像 UNIX 一样,是一个区分大小写的操作系统)。文件名长度实际上没有限制,但通常保持在 80 个字符以内,以便可以容纳在终端的一行中。您可以在文件名中使用任何字符,尽管建议排除对 shell 具有特殊含义的字符。如有疑问,请查看 附录 C

3.3.2.2.2. 移动文件

现在我们已经正确地组织了我们的主目录,是时候使用 mv 命令清理未分类的文件了

richard:~/archive> mv ../report[1-4].doc reports/Restaurants-Michelin/

此命令也适用于重命名文件

richard:~> ls To_Do
-rw-rw-r--    1 richard richard      2534 Jan 15 12:39 To_Do

richard:~> mv To_Do done

richard:~> ls -l done
-rw-rw-r--    1 richard richard      2534 Jan 15 12:39 done

很明显,只有文件名发生了变化。所有其他属性保持不变。

有关 mv 命令的语法和特性的详细信息,请参阅 man 或 Info 页面。当遇到问题时,使用此文档应该始终是您的第一反应。您的问题的答案很可能在系统文档中。即使是经验丰富的用户每天也阅读 man 页面,因此初学者应该始终阅读它们。一段时间后,您将了解常用命令的最常见选项,但您仍然需要文档作为主要信息来源。请注意,HOWTO、FAQ、man 页面和其他来源中包含的信息正在慢慢合并到 Info 页面中,Info 页面现在是系统上最新(即随时可用)的在线文档来源。

3.3.2.2.3. 复制文件

复制文件和目录使用 cp 命令。一个有用的选项是递归复制(复制所有底层文件和子目录),使用-R选项给 cp。一般语法是

cp [-R]源文件 目标文件

以用户 newguy 为例,他想要与用户 oldguy 相同的 Gnome 桌面设置。解决问题的一种方法是将 oldguy 的设置复制到 newguy 的主目录

victor:~> cp -R ../oldguy/.gnome/ .

这会给出一些涉及文件权限的错误,但所有错误都与 newguy 无论如何都不需要的私有文件有关。我们将在下一部分讨论如何在权限真正成为问题时更改这些权限。

3.3.2.2.4. 删除文件

使用 rm 命令删除单个文件,使用 rmdir 删除空目录。(使用 ls -a 检查目录是否为空)。rm 命令还具有用于删除非空目录及其所有子目录的选项,请阅读 Info 页面了解这些相当危险的选项。

Note一个目录可以有多空?
 

目录 .(点)和 ..(点-点)不能被删除是正常的,因为它们在空目录中也是必要的,以确定目录在文件系统层次结构中的排名。

在 Linux 上,就像在 UNIX 上一样,没有回收站 - 至少对于 shell 来说是这样,尽管有很多用于图形使用的解决方案。因此,一旦删除,文件就真的消失了,并且通常无法恢复,除非您有备份,或者您真的很快并且有一个非常好的系统管理员。为了保护初学者免受这种恶意行为的影响,可以使用-i选项激活 rmcpmv 命令的交互行为。在这种情况下,系统不会立即响应请求。相反,它会要求确认,因此需要额外单击 Enter 键才能造成损害

mary:~> rm -ri archive/
rm: descend into directory `archive'? y
rm: descend into directory `archive/reports'? y
rm: remove directory `archive/reports'? y
rm: descend into directory `archive/backup'? y
rm: remove `archive/backup/sysbup200112.tar'? y
rm: remove directory `archive/backup'? y
rm: remove directory `archive'? y

我们将在 第 7 章 中讨论如何使此选项成为默认选项,该章讨论了自定义您的 shell 环境。

3.3.3. 查找文件

3.3.3.1. 使用 shell 功能

在移动文件的示例中,我们已经看到了 shell 如何一次操作多个文件。在该示例中,shell 自动找出用户在方括号 “[""]" 之间的要求是什么意思。shell 可以替换数字范围以及大写或小写字符。它还可以用星号替换任意数量的字符,用问号仅替换一个字符。

所有类型的替换都可以同时使用;shell 在这方面非常合乎逻辑。Bash shell 例如,对于像 ls dirname/*/*/*[2-3] 这样的表达式没有问题。

在其他 shell 中,星号通常用于最大限度地减少打字工作量:人们会输入 cd dir* 而不是 cd directory。然而,在 Bash 中,这是没有必要的,因为 GNU shell 具有一个名为文件名完成的功能。这意味着您可以键入命令(任何位置)或文件(在当前目录中)的前几个字符,如果不存在混淆的可能性,shell 将会找出您的意思。例如,在一个包含许多文件的目录中,您可以通过键入 ls A 并按两次 Tab 键,而不是按 Enter 键来检查是否有任何以字母 A 开头的文件。如果只有一个以 “A” 开头的文件,则该文件将立即显示为 ls(或任何 shell 命令,就此而言)的参数。

3.3.3.2. Which

查找文件的一个非常简单的方法是使用 which 命令,在用户搜索路径中列出的目录中查找所需的文件。当然,由于搜索路径仅包含包含可执行程序的目录的路径,因此 which 不适用于普通文件。which 命令在排除 “Command not Found” 问题时非常有用。在下面的示例中,用户 tina 无法使用 acroread 程序,而她的同事在同一系统上没有任何问题。问题类似于上一部分中的PATH问题:Tina 的同事告诉她,他可以在/opt/acroread/bin中看到所需的程序,但此目录不在她的路径中

tina:~> which acroread
/usr/bin/which: no acroread in (/bin:/usr/bin:/usr/bin/X11)

可以通过给出要运行的命令的完整路径,或通过重新导出PATH变量的内容来解决该问题

tina:~> export PATH=$PATH:/opt/acroread/bin

tina:~> echo $PATH
/bin:/usr/bin:/usr/bin/X11:/opt/acroread/bin

使用 which 命令还可以检查命令是否是另一个命令的别名

gerrit:~> which -a ls
ls is aliased to `ls -F --color=auto'
ls is /bin/ls

如果这在您的系统上不起作用,请使用 alias 命令

tille@www:~/mail$ alias ls
alias ls='ls --color'

3.3.3.3. Find 和 locate

这些是真正的工具,用于搜索搜索路径中未列出的其他路径。find 工具(源自 UNIX)非常强大,这可能是语法稍微困难的原因。但是,GNU find 解决了语法问题。此命令不仅允许您搜索文件名,还可以接受文件大小、上次更改日期和其他文件属性作为搜索条件。最常见的用途是查找文件名

find<路径> -name <搜索字符串>

这可以解释为 “在给定路径中包含的所有文件和子目录中查找,并打印名称中包含搜索字符串的文件名”(不在其内容中)。

find 的另一个应用是搜索特定大小的文件,如下例所示,用户 peter 想要查找当前目录或其子目录中所有大于 5 MB 的文件

peter:~> find . -size +5000k
psychotic_chaos.mp3

如果您深入研究 man 页面,您将看到 find 还可以对找到的文件执行操作。一个常见的例子是删除文件。最好先在没有-exec选项的情况下进行测试,以确保选择了正确的文件,之后可以重新运行该命令以删除选定的文件。下面,我们搜索以.tmp:

peter:~>  find . -name "*.tmp" -exec rm {} \;

peter:~>

Tip结尾的文件
 

优化!

此命令将根据找到的符合要求的文件次数调用 rm。在最坏的情况下,这可能是数千甚至数百万次。这对您的系统来说是一个相当大的负载。

更实际的工作方式是使用管道 (|) 和 xargs 工具,并将 rm 作为参数。这样,只有当命令行已满时才会调用 rm 命令,而不是为每个文件都调用。有关使用 I/O 重定向来简化日常任务的更多信息,请参阅 第 5 章

稍后(根据 man 页面,在 find 出现 20 年后的 1999 年),开发了 locate。此程序更易于使用,但比 find 更受限制,因为其输出基于每天仅更新一次的文件索引数据库。另一方面,在 locate 数据库中搜索比 find 使用的资源更少,因此几乎可以立即显示结果。大多数 Linux 发行版现在都使用 slocate,即安全增强的 locate,locate 的现代版本,它可以防止用户获得他们无权读取的输出。root 的主目录中的文件就是一个例子,这些文件通常不向公众开放。想要找到了解 C shell 的人的用户可以发出命令 locate .cshrc,以显示所有拥有 C shell 的自定义配置文件的用户。假设用户 rootjenny 正在运行 C shell,那么只会显示文件/home/jenny/.cshrc

billy:~> ls -l /usr/bin/locate
lrwxrwxrwx 1 root slocate  7 Oct 28 14:18 /usr/bin/locate -> slocate*

,而不会显示 root 主目录中的文件。在大多数系统上,locate 是指向 slocate 程序的符号链接

tina:~> locate acroread
/usr/share/icons/hicolor/16x16/apps/acroread.png
/usr/share/icons/hicolor/32x32/apps/acroread.png
/usr/share/icons/locolor/16x16/apps/acroread.png
/usr/share/icons/locolor/32x32/apps/acroread.png
/usr/local/bin/acroread
/usr/local/Acrobat4/Reader/intellinux/bin/acroread
/usr/local/Acrobat4/bin/acroread

用户 tina 可以使用 locate 来查找她想要的应用程序不包含名称bin的目录不能包含程序 - 它们不包含可执行文件。还剩下三种可能性。在/usr/local/bin

tina:~> file /usr/local/bin/acroread
/usr/local/bin/acroread: symbolic link to ../Acrobat4/bin/acroread

tina:~> file /usr/local/Acrobat4/bin/acroread
/usr/local/Acrobat4/bin/acroread: Bourne shell script text executable

tina:~> file /usr/local/Acrobat4/Reader/intellinux/bin/acroread
/usr/local/Acrobat4/Reader/intellinux/bin/acroread: ELF 32-bit LSB 
executable, Intel 80386, version 1, dynamically linked (uses 
shared libs), not stripped

中的文件是 tina 想要的:它是指向启动实际程序的 shell 脚本的链接的目录不能包含程序 - 它们不包含可执行文件。还剩下三种可能性。在为了使路径尽可能短,以便系统不必在用户每次想要执行命令时搜索太长时间,我们将的目录不能包含程序 - 它们不包含可执行文件。还剩下三种可能性。在添加到路径中,而不是其他目录,其他目录仅包含一个特定程序的二进制文件,而

也包含其他有用的程序。

同样,有关 findlocate 的完整特性的描述,请参阅 Info 页面。

3.3.3.4. grep 命令

3.3.3.4.1. 常规行过滤

jerry:~> grep -a find .bash_history
find . -name userinfo
man find
find ../ -name common.cfg

Tip一个简单但功能强大的程序 grep 用于过滤输入行并将某些模式返回到输出。 grep 程序有成千上万个应用程序。在下面的示例中,jerry 使用 grep 来查看他是如何使用 find 完成某件事的
 

搜索历史

thomas ~> ^R 
(reverse-i-search)`find': find `/home/thomas` -name *.xml

在这些情况下,bash 中的搜索功能也很有用,通过同时按下 Ctrl+R 来激活,例如在我们想要检查我们上次是如何再次执行 find 的示例中在搜索提示符下键入您的搜索字符串。您键入的字符越多,搜索范围就越受限制。这将读取此 shell 会话的命令历史记录(当您退出该会话时,该历史记录将写入到您的主目录中的.bash_history

)。显示您搜索字符串的最新出现位置。如果您想查看包含相同字符串的先前命令,请再次键入 Ctrl+R

有关更多信息,请参阅 bashInfo 页面。所有稍微像样的 UNIX 系统都有一个在线词典。Linux 也是如此。词典是名为words的文件中的已知单词列表,位于/usr/share/dict

william:~> grep pinguin /usr/share/dict/words

william:~> grep penguin /usr/share/dict/words
penguin
penguins

Tip中。要快速检查单词的正确拼写,不需要图形应用程序
 

词典 vs. 单词列表

某些发行版提供 dict 命令,该命令提供的功能比仅在列表中搜索单词更多。

lisa:~> grep gdbruyne /etc/passwd
gdbruyne:x:981:981:Guy Debruyne, tel 203234:/home/gdbruyne:/bin/bash

谁是我的隔壁主目录的所有者?嘿,那里有他的电话号码!

serge:~/mail> grep -i arno *
sent-mail: To: <Arno.Hintjens@celeb.com>
sent-mail: On Mon, 24 Dec 2001, Arno.Hintjens@celeb.com wrote:

Arno 的电子邮件地址又是什么?

findlocate 通常与 grep 结合使用,以定义一些严肃的查询。有关更多信息,请参阅关于 I/O 重定向的 第 5 章

3.3.3.4.2. 特殊字符

对 shell 具有特殊含义的字符必须进行转义Bash 中的转义字符是反斜杠,就像在大多数 shell 中一样;这消除了以下字符的特殊含义。shell 知道很多特殊字符,其中最常见的是 /、.、? 和 *。完整的列表可以在 Info 页面和 shell 文档中找到。

例如,假设您想要显示文件 “*” 而不是目录中的所有文件,您必须使用\*

less \*

对于包含空格的文件名也是如此cat This\ File

3.3.4. 更多查看文件内容的方式

3.3.4.1. 概述

除了 cat(实际上它所做的只是将文件发送到标准输出)之外,还有其他工具可以查看文件内容。

当然,最简单的方法是使用图形工具而不是命令行工具。在介绍中,我们已经看到了办公应用程序 OpenOffice.org 的一瞥。其他示例包括 GIMP(从命令行使用 gimp 启动),GNU 图像处理程序;xpdf 用于查看可移植文档格式文件 (PDF);GhostView (gv) 用于查看 PostScript 文件;Mozilla/FireFoxlinks(文本模式浏览器)、KonquerorOpera 和许多其他用于 Web 内容的浏览器;XMMS、CDplay 和其他用于多媒体文件内容的程序;AbiWordGnumericKOffice 等,用于各种办公应用程序等等。Linux 应用程序有数千个;要列出所有这些应用程序需要几天时间。

相反,我们继续专注于 shell 或文本模式应用程序,它们构成了所有其他应用程序的基础。这些命令最适用于包含文本的文件的文本环境。如有疑问,请先使用 file 命令进行检查。

那么,让我们看看我们有哪些有用的文本工具可以查看文件内部。

Note字体问题
 

诸如我们现在将要讨论的纯文本工具,通常在处理 “纯”文本文件时会遇到问题,因为这些文件中使用的字体编码。特殊字符,例如带重音符号的字母字符、中文字符以及来自使用不同字符集(而不是默认的 en_US 编码)的语言的其他字符等等,然后会以错误的方式显示或被不可读的乱码替换。这些问题在 第 7.4 节 中讨论。

3.3.4.2. less is more

毫无疑问,当您在 UNIX 环境中工作时,迟早会听到有人说这句话。一点 UNIX 历史可以解释这一点

  • 首先是 cat。输出以不可控制的方式流式传输。

  • 然后是 pg,它可能仍然可以在较旧的 UNIX 系统上找到。此命令一次将文本输出一页。

  • more 程序是 pg 的修订版本。此命令在每个 Linux 系统上仍然可用。

  • less 是 more 的 GNU 版本,具有允许突出显示搜索字符串、向后滚动等额外功能。语法非常简单

    例如,假设您想要显示文件 “*” 而不是目录中的所有文件,您必须使用less

    文件名

更多信息位于 Info 页面中。

您现在已经了解了分页器,因为它们用于查看 man 页面。

3.3.4.3. head 和 tail 命令

tony:~> tail -10 .bash_history 
locate configure | grep bin
man bash
cd
xawtv &
grep usable /usr/share/dict/words 
grep advisable /usr/share/dict/words 
info quota
man quota
echo $PATH
frm

这两个命令分别显示文件的前/后 n 行。要查看输入的最后十个命令tail 也可以类似地工作。tail 命令有一个方便的功能,可以持续显示不断变化的文件中的最后 n 行。-f

选项通常被系统管理员用来检查日志文件。更多信息位于系统文档文件中。

3.3.5. 链接文件

3.3.5.1. 链接类型

  • 既然我们对文件及其在文件系统中的表示形式有了更多了解,那么理解链接(或快捷方式)就轻而易举了。链接只不过是将两个或多个文件名与同一组文件数据匹配的一种方式。有两种方法可以实现这一点

    硬链接:将两个或多个文件名与同一个 inode 关联。硬链接在硬盘上共享相同的数据块,同时它们继续表现为独立的文件。

  • 有一个直接的缺点:硬链接不能跨越分区,因为 inode 编号在一个给定的分区内是唯一的。

软链接或符号链接(或简称:symlink):一个指向另一个文件的小文件。符号链接包含目标文件的路径,而不是硬盘上的物理位置。由于此系统中未使用 inode,因此软链接可以跨越分区。

两种链接类型的行为相似,但并不相同,如下图所示

图 3-2. 硬链接和软链接机制

请注意,删除符号链接的目标文件会使链接失效。

每个常规文件原则上都是一个硬链接。硬链接不能跨越分区,因为它们引用 inode,并且 inode 编号在一个给定的分区内是唯一的。可以认为存在第三种链接,即用户空间链接,它类似于 MS Windows 中的快捷方式。这些是包含元数据的文件,这些元数据只能由图形文件管理器解释。对于内核和 shell 来说,这些只是普通文件。它们可能以 .desktop.lnk 后缀结尾;可以在:

[dupont@boulot .gnome-desktop]$ cat La\ Maison\ Dupont
[Desktop Entry]
Encoding=Legacy-Mixed
Name=La Maison Dupont
Type=X-nautilus-home
X-Nautilus-Icon=temp-home
URL=file:///home/dupont

~/.gnome-desktop

[lena@venus Desktop]$ cat camera
[Desktop Entry]
Dev=/dev/sda1
FSType=auto
Icon=memory
MountPoint=/mnt/camera
Type=FSDevice
X-KDE-Dynamic-Device=true

中找到一个示例。此示例来自 KDE 桌面

使用图形环境的功能可以很容易地创建这种链接。如果您需要帮助,您的系统文档应该是您的首选资源。

在下一节中,我们将研究如何使用命令行创建 UNIX 风格的符号链接。

3.3.5.2. 创建符号链接

符号链接对于初学者来说特别有趣:它们很容易看到,您无需担心分区。制作链接的命令是 ln。为了创建符号链接,您需要使用选项一步创建目录和子目录

-s制作链接的命令是 ln。为了创建符号链接,您需要使用 选项。 ln -s 目标文件 链接名

在下面的示例中,用户 freddy 在其主目录的子目录中创建了一个链接,指向系统另一部分的目录

freddy:~/music> ln -s /opt/mp3/Queen/ Queen

freddy:~/music> ls -l
lrwxrwxrwx  1 freddy  freddy  17 Jan 22 11:07 Queen -> /opt/mp3/Queen

符号链接始终是非常小的文件,而硬链接的大小与原始文件的大小相同。

符号链接的应用非常广泛。它们通常用于节省磁盘空间,复制文件以满足期望文件位于另一个位置的新程序的安装要求,它们用于修复突然必须在新环境中运行的脚本,并且通常可以节省大量工作。系统管理员可能会决定将用户的主目录移动到新位置,disk2例如,但如果他希望一切都像以前一样工作,例如/etc/passwd文件,他将以最小的努力从/home创建一个指向新位置的符号链接/disk2/home.