Top

D2:学习Shell之二

操作文件和目录

本节涉及以下命令:

通配符

wildcard也称为globbing,允许根据字符模式选择文件名。
通配符 含义
* 匹配任意字符
? 匹配任意单个字符
[characters] 匹配characters集合中的任意字符
[!characters] 匹配不属于[characters]集合中的任意字符
[[:class:]] 匹配作为指定class成员的任意字符
下表列出了最常用的字符类:
字符类 含义
[:alnum:] 匹配任意字母数字字符
[:alpha:] 匹配任意字母字符
[:digit:] 匹配任意数字
[:lower:] 匹配任意小写字母
[:upper:] 匹配任意大写字母
下表是例子:
范例 匹配
* 所有文件
g* 所有以g开头的文件
b*.txt 所有以b开头,且以.txt结尾的文件
Data??? 所有以Data开头,后面跟三个字符的所有文件
[abc]* 所有以a或b或c开头的文件
BACKUP.[0-9][0-9][0-9] 所有以BACKUP.开头并跟着三个数字的文件
[[:upper:]]* 所有以一个大写字母开头的文件
[![:digit:]]* 所有以非数字开头的文件
*[[:lower:]123] 所有以一个小写字母或1或2或3结尾的文件
通配符可以与任何接受文件名作为参数的命令一起使用。

旧版本的类Unix环境可能会使用[a-z]和[A-Z]作为字符范围,新版本中也可以这样用,但是既有可能产生非预期的结果。建议使用字符类。

mkdir——创建目录

mkdir命令用于创建目录,使用格式为:
mkdir directory ...
以上省略号代表该参数可以重复使用,比如:
mkdir dir1 dir2 dir3

cp——复制文件和目录

cp命令用于复制文件或目录。有两种不同的用法,第一种使用格式为:
cp item1 item2
以上复制单个文件或目录item1到item2。
而以下命令格式将多个项目(文件或目录)复制到一个目录中:
cp item ... directory

有用的选项和示例

下表为cp命令常用的选项:
选项 长选项 含义
-a --archive 复制文件和目录及其所有属性,包括所有权和权限。
通常情况下,副本采用执行复制的用户的默认属性。
-i --interactive 覆盖现有文件之前,提示用户进行确认。
如果未指定此选项,cp将以静默方式覆盖文件。
-r --recursive 递归复制目录及其内容。
复制目录时需要此选项(或-a选项)。
FreeBSD中类似功能的选项为-R
-u --update 将文件从一个目录复制到另一个目录时,只复制目标目录中不存在或比现有相应文件更新的文件。
FreeBSD中无此选项
-v --verbose 在执行复制时显示信息性消息。
举例:
命令 结果
cp file1 file2 复制file1到file2。
如果file2存在,则它会被file1覆盖。
如果file2不存在,则会被创建。
cp -i file1 file2 与上面命令相同,不同之处在于,如果file2存在,则在覆盖它之前会提示用户。
cp file1 file2 dir1 将file1和file2复制到dir1目录中。
dir1目录必须已经存在。
cp dir1/* dir2 使用通配符,将dir1中所有文件复制到dir2中。
dir2目录必须已经存在。
cp -r dir1 dir2 将dir1目录中所有文件(包括子目录及子目录中所有文件)都复制到dir2中。
如果dir2不存在,则会自动创建它。

mv——移动和重命名文件

mv命令执行文件移动和重命名,具体取决于使用方式。无论哪种情况,操作后原始文件名都不再存在。
mv命令的使用方式与cp大致相同:
mv item1 item2
以上将item1重命名未item2。
mv item ... directory
以上将一个或多个item移动到directory中。

有用的选项和示例

mv命令常用选项与cp相似,但没有-r选项。

rm——删除文件和目录

rm命令的使用格式为:
rm item ...

有用的选项和示例

选项 长选项 含义
-i --interactive 删除指定文件之前提示用户确认。
如果未指定此选项,rm将以静默方式删除文件。
-r --recursive 递归删除目录。
这意味着,如果要删除的目录有子目录,也要删除它们。
要删除目录,必须指定此选项。
-f --force 忽略不存在的文件,不要提示。
这会覆盖-i选项。
-v --verbose 执行删除操作时显示信息性消息。
慎用rm命令。
类Unix系统没有undelete命令,这意味着一旦用rm命令删除了一些东西,它们就消失了。
使用通配符时要格外小心。建议先使用ls命令先测试一下通配符,这将使你看到将要被删除的文件,然后再用rm替换掉ls

ln——创建链接

ln命令用于创建硬链接或符号链接。以下方式创建硬链接:
ln file link
以下方式创建符号链接:
ln -s item link
以上item可以是文件或目录。

硬链接

硬链接是Unix创建链接的原始方式,而符号链接更为现代。
默认情况下,每个文件都有一个指定文件名的硬链接。当我们创建硬连接时,我们会为一个文件创建一个额外的目录条目。
硬链接有两个重要的限制:
  1. 硬链接不能引用自身文件系统之外的文件。
  2. 这意味着链接不能引用与链接本身不在同一磁盘分区上的文件。
  3. 硬链接不能引用目录。
硬链接与文件本身无法区分。与符号链接不同,当我们列出包含硬链接的目录时,不会看到链接的特殊指示。
实际上更像是复制了一份,删除源文件,硬链接还在,且其内容与原源文件相同。
删除硬链接时,文件本身的内容将继续存在。

符号链接

创建符号链接是为了克服硬链接的限制。
符号链接的工作原理是创建一种特殊类型的文件,其中包含指向引用文件或目录的文本指针。
这与Windows中的快捷方式基本相同。

删除被引用的文件后,符号链接将无法使用。虽然链接还在,但不会指向任何内容。
如果又新建了与原源文件同名的文件,则此时符号链接将指向此新文件。
如果创建的是一个与原源文件同名的文件夹,符号链接则指向此文件夹。