在 UNIX 操作系统中,一切皆文件——所有数据都被组织成文件,而所有文件又被组织成目录,这些目录最终形成一棵树状结构的文件系统。如果你使用过 UNIX,大部分时间其实都在与文件打交道,无论是创建、删除、复制、重命名,还是建立链接。这篇 UNIX 文件操作教程会带你走一遍最基本的文件操作流程,从零开始,把常用的命令和核心概念讲透。
三种基本文件类型
UNIX 中的文件可以分成三类,理解它们有助于你快速定位自己要处理的对象:
- 普通文件:最常见的文件,包含数据、文本或程序指令。本教程主要围绕这类文件展开。
- 目录:相当于 Windows 或 macOS 里的文件夹,用来存放普通文件和特殊文件。
- 特殊文件:提供对硬件(如硬盘、CD-ROM、调制解调器、以太网适配器)的访问;还有一些特殊文件类似别名或快捷方式,让你能用不同的名字访问同一个文件。
文件列表
想知道当前目录下有哪些文件和子目录?最简单的命令就是 ls。直接在终端输入:
$ ls
输出大概是这样:
$ ls
bin hosts lib res.03
ch07 hw1 pub test_results
ch07.bak hw2 res.01 users
docs hw3 res.02 work
如果觉得光看名字不够,加上 -l 选项就能看到更详细的信息(长格式):
$ ls -l
total 1962188
drwxrwxr-x 2 amrood amrood 4096 Dec 25 09:59 uml
-rw-rw-r-- 1 amrood amrood 5341 Dec 25 08:38 uml.jpg
drwxr-xr-x 2 amrood amrood 4096 Feb 15 2006 univ
drwxr-xr-x 2 root root 4096 Dec 9 2007 urlspedia
-rw-r--r-- 1 root root 276480 Dec 9 2007 urlspedia.tar
drwxr-xr-x 8 root root 4096 Nov 25 2007 usr
drwxr-xr-x 22 root root 4096 Nov 25 2007 webthumb-1.01
-rwxr-xr-x 1 root root 3192 Nov 25 2007 webthumb.php
-rw-rw-r-- 1 amrood amrood 20480 Nov 25 2007 webthumb.tar
-rw-rw-r-- 1 amrood amrood 5654 Aug 9 2007 yourfile.mid
-rw-rw-r-- 1 amrood amrood 166255 Aug 9 2007 yourfile.swf
drwxr-xr-x 11 amrood amrood 4096 May 29 2007 zlib-1.2.3
每一列的含义:
- 第一列:文件类型和权限(后面会详细讲)。
- 第二列:占用的磁盘块数。
- 第三列:文件所有者(创建该文件的 UNIX 用户)。
- 第四列:所属用户组(每个 UNIX 用户会有一个关联的组)。
- 第五列:文件大小(字节)。
- 第六列:文件创建或最后修改的日期和时间。
- 第七列:文件或目录的名称。
另外,第一列的第一个字符代表文件类型:
| 前缀 | 描述 |
|---|---|
| - | 普通文件(ASCII 文本、二进制可执行文件或硬链接) |
| b | 块特殊文件(块 I/O 设备,如物理硬盘) |
| c | 字符特殊文件(原始 I/O 设备) |
| d | 目录文件 |
| l | 符号链接文件(指向任意普通文件) |
| p | 命名管道(进程间通信) |
| s | 套接字(进程间通信) |
元字符
UNIX 里有些字符具有特殊含义,比如 * 和 ?。* 匹配零个或多个字符,? 匹配单个字符。举个例子,要列出所有以 ch 开头、以 .doc 结尾的文件:
$ ls ch*.doc
输出:
ch01-1.doc ch010.doc ch02.doc ch03-2.doc
ch04-1.doc ch040.doc ch05.doc ch06-2.doc
ch01-2.doc ch02-1.doc c
如果想只看 .doc 结尾的文件,直接用 ls *.doc 就行了。
隐藏文件
文件名以点号(.)开头的文件在 UNIX 里被视为隐藏文件。它们通常被程序(包括 shell)用来存储配置信息。常见的隐藏文件有:
.profile:Bourne shell(sh)初始化脚本.kshrc:Korn shell(ksh)初始化脚本.cshrc:C shell(csh)初始化脚本.rhosts:remote shell 配置文件
要列出隐藏文件,给 ls 加上 -a 选项:
$ ls -a
. .profile docs lib test_results
.. .rhosts hosts pub users
.emacs bin hw1 res.01 work
.exrc ch07 hw2 res.02
.kshrc ch07.bak hw3 res.03
注意:单点 . 代表当前目录,双点 .. 代表父目录。
创建文件
创建普通文件最常用的方法是使用 vi 编辑器。运行以下命令打开(或新建)一个文件:
$ vi filename
进入后按 i 键进入编辑模式,输入内容。想保存并退出时:
- 按
Esc退出编辑模式。 - 同时按
Shift + ZZ(两个大写 Z)保存并退出。
完成后,当前目录下就多了一个 filename 文件。
编辑文件
同样用 vi 编辑已有文件:
$ vi filename
进入文件后按 i 切换到编辑模式,修改内容。如果在文件里移动光标,需要先按 Esc 退出编辑模式,然后用以下键移动:
l:右移h:左移k:上移j:下移
定位后按 i 再次进入编辑模式修改。完成后同样用 Esc + Shift + ZZ 退出。
显示文件内容
用 cat 命令可以直接把文件内容输出到终端:
$ cat filename
This is unix file....I created it for the first time.....
I'm going to sa ve this content in this file.
加上 -b 选项可以显示行号:
$ cat -b filename
1 This is unix file....I created it for the first time.....
2 I'm going to sa ve this content in this file.
统计文件中字数
wc 命令能告诉你文件有多少行、多少个单词、多少个字符:
$ wc filename
2 19 103 filename
输出各列含义:
- 第一列:行数
- 第二列:单词数
- 第三列:字符数(实际文件大小)
- 第四列:文件名
你也可以一次统计多个文件:
$ wc filename1 filename2 filename3
复制文件
复制文件用 cp 命令,语法很简单:
$ cp source_file destination_file
例如:
$ cp filename copyfile
执行后当前目录会多出一个 copyfile,内容和原文件一模一样。
移动/重命名文件
mv 命令既可以移动文件,也可以重命名。语法:
$ mv old_file new_file
例如:
$ mv filename newfile
执行后原 filename 消失,取而代之的是 newfile。
删除文件
用 rm 命令删除文件,但一定要小心——被删除的文件可能包含重要信息。建议在使用 rm 时加上 -i 选项,这样每次删除前都会询问确认。
基本语法:
$ rm filename
删除多个文件:
$ rm filename1 filename2 filename3
标准 UNIX 流
每个 UNIX 程序启动时都会自动打开三个流(文件):
- stdin(标准输入,文件描述符 0):默认读取来源。
- stdout(标准输出,文件描述符 1):默认输出目标。
- stderr(标准错误,文件描述符 2):错误信息的输出通道。
文件权限
文件所有权是 UNIX 安全机制的核心。每个文件都有三个维度的权限:
- 所有者权限:文件所有者能对文件做什么。
- 组权限:与文件同组的用户可以做什么。
- 其他人权限:其他所有人能做什么。
权限表示符
用 ls -l 看到的权限字符串(例如 -rwxr-xr--)分为三组,每组三个字符,顺序固定:读(r)、写(w)、执行(x)。
- 第 2-4 位:所有者的权限。例如
rwx表示拥有读、写、执行权。 - 第 5-7 位:所属组的权限。例如
r-x表示可读、可执行,但不能写。 - 第 8-10 位:其他人的权限。例如
r--表示只能读。
文件访问模式
- 读:查看文件内容。
- 写:修改或删除文件内容。
- 执行:将文件当作程序来运行。
目录访问模式
- 读:查看目录下的文件名列表。
- 写:在目录下创建或删除文件。
- 执行:允许遍历目录(进入该目录),例如执行
ls或cd必须要有执行权限。
改变权限
chmod 命令用于修改文件或目录的权限,有两种常用方法:符号模式和绝对模式。
符号模式
用操作符 +(添加)、-(移除)、=(精确设置)来指定权限。例如,对 testfile 执行:
$ chmod o+wx testfile # 给其他人加写和执行权限
$ chmod u-x testfile # 移除所有者的执行权限
$ chmod g=rx testfile # 设置所属组为读+执行
也可以在一行内组合:
$ chmod o+wx,u-x,g=rx testfile
绝对模式(数字模式)
每个权限对应一个数字:读=4,写=2,执行=1。把三组权限的数字相加得到一个三位数,例如 755 表示所有者(7=4+2+1)拥有全部权限,所属组(5=4+1)和其他人(5=4+1)拥有读和执行权限。
例子:
$ chmod 755 testfile # -rwxr-xr-x
$ chmod 743 testfile # -rwxr---wx
$ chmod 043 testfile # ----r---wx
改变所有者和所属组
chown改变文件所有者:chown user filelistchgrp改变文件所属组:chgrp group filelist
示例:
$ chown amrood testfile
$ chgrp special testfile
注意:只有超级用户(root)才能更改不属于自己的文件的所有者,普通用户只能修改自己拥有的文件。
SUID 和 SGID 文件权限
有些程序在运行时需要特殊权限。例如普通用户不允许直接读写 /etc/shadow,但 passwd 命令可以修改密码并写入该文件——这就是因为 passwd 设置了 SUID 位。当执行 SUID 程序时,你继承了程序所有者的权限(通常是 root)。SGID 类似,只是作用在组上。
在 ls -l 的输出中,SUID 的标志是所有者执行位上的小写 s(如果执行位被设置)或大写 S(如果执行位未设置)。例如:
$ ls -l /usr/bin/passwd
-r-sr-xr-x 1 root bin 19031 Feb 7 13:47 /usr/bin/passwd*
此外,目录还有一种特殊权限叫防删除位(sticky bit)。设置了该位的目录,只有目录所有者、文件所有者或超级用户才能删除其中的文件。可以使用以下命令设置目录的 SUID 和 SGID:
$ chmod ug+s dirname
$ ls -l
drwsr-sr-x 2 root root 4096 Jun 19 06:45 dirname
以上就是 UNIX 文件系统操作的核心内容。从最基本的列出、创建、编辑,到权限管理,这些命令和概念是日常工作的基石。多动手在终端里试试,很快就能形成直觉。
