1. 前言

本文主要介绍以下几个常用的操纵文件和目录(本质上是对文件或目录命名的处理)的命令(同样是见名知意):

Command Meaning
cp Copy files and directories
mv Move/rename files and directories
mkdir Create directories
rm Remove files and directories
ln Create hard and symbolic link

实际上,目前的Linux发行版都有文件管理器(file manager),图形化操作很方便。但是学习命令行操作仍然很有必要,因为它更加强大(power)和灵活(flexibility)。试想这个问题:如何将存在于A文件夹中但又不存在B文件夹中的HTML文件复制到B文件夹?解决这个问题可以先了解下通配符(wildcards)。

2. 通配符(Wildcards)

通配符的使用类似于正则表达式(Regular Expression),就是使用特殊的字符来“匹配”一些字符串组合(也就是文件或目录的名称)。正是shell的这个特征让这些命令变得更加强大,shell经常用到文件名,因此其带来的好处不言而喻。

Wildcard Meaning
* Matches any characters
? Matches any single character
[characters] Matches any character that is a member of the set characters
[!characters] Matches any character that is not a member of the set characters
[[:class:]]
(常用字符组见下表)
Matches any character that is a member of the specified class
[:alnum:] Matches any alphanumeric character(字母或数字)
[:alpha:] Matches any alphabetic character(字母)
[:digit:] Matches any numeral (数字)
[:lower:] Matches any lowercase letter(小写字母)
[:upper:] Matches any uppercase letter(大写字母)

举个栗子

Pattern Matches Examples
* 任何文件 me.txt、forth.jpg
g* 任何命名以字母g开头的文件 google.html、god.png
b*.txt 任何以字母b开头后跟任意个字符并以.txt结尾的txt文件 bring_me.txt、b.jpg
Data??? 任何以data开头后跟三个字符的文件 Data123、Data_01
[abc]* 任何以abc开头的文件 a.txt、bc.jpg
BACKUP.[0-9][0-9][0-9] 任何以BACKUP.后跟三个数字的文件 BACKUP.996
[[:upper:]]* 任何大写字母开头的文件 ANY_ME.txt、D.jpg
[![:digit:]]* 任何非数字开头的文件 me.txt
2th.jpg($\times$)
*[[:lower:]123] 任何以小写字母或数字1或2或3结束的文件 me.txt
2tH.jpg($\times$)


GUI中使用

Wildcards Work In The GUI, Too

你可以在搜索框中输入/usr/bin/u*尝鲜(有些文件管理器可能需要手动开启匹配模式)

3. 具体命令

新建目录 mkdir

其语法规则是(三个句点代表参数可重复,即可以同时创建多个目录)

mkdir directory...

复制 cp

cp命令可以复制文件或目录,它有如下两种方式使用:

# 第一种
cp item1 item2
# 第二种
cp item ... directory

下面列举下cp命令的一些选项(options)

Wildcard Meaning
-a, - -archive 复制文件或目录的所有属性包括权限和用户所有权
-i, - -interactive 交互式操作,会提示是否要覆盖
-r, - -recursive 递归式操作,复制目录时必须有
-u, - -update 更新式操作,复制目录到目录时,仅复制目标目录不存在的文件或者比其“新”的文件
-v, - -verbose 提示信息显示

移动、重命名 mv

这个命令有两个功能:移动、重命名。选项(option)有-i、-u、-v

# 重命名
mv item1 item2
# 移动
mv item... directory

删除 rm

rm item...

删除命令,选项包括-i、-r、-f、-v,其中-f(force)选项表示忽略不存在的文件及忽略提示,优先级高于-i命令。

$\bullet$ Be careful with rm

Unix-like operating systems such as Linux do not have an undelete command. Once you delete something with rm, it’s gone. Linux assumes you’re smart and you know what you’re doing.

# 删除html文件
rm *.html
# 先删除所有文件,然后提示无html文件
rm * .html

$\bullet$ A useful tip:

Whenever you use wildcards with rm (besides carefully checking your typing!), test the wildcard first with ls.

创建链接 ln

命令ln用来创建硬(hard)或软(symbolic)链接。

$\bullet$ 创建硬链接:

ln file link

硬链接是Unix创建链接的原始方式。默认情况下,每个文件都有一个硬链接,它给出了文件的名称。当我们创建一个硬链接时,我们为一个文件创建一个额外的目录条目。硬链接有两个重要的限制:

  • 同分区:硬链接不能引用其自身文件系统之外的文件。这意味着链接不能引用与链接本身不在同一磁盘分区上的文件
  • 不能引用目录

硬链接与文件本身没有区别。与符号链接不同,当列出包含硬链接的目录时,不会看到该链接的任何特殊指示。当删除一个硬链接时,该链接被删除,但是文件本身的内容继续存在(也就是说,它的空间不会被释放),直到文件的所有链接都被删除。

$\bullet$ 创建软链接:

ln -s item link

创建符号链接是为了克服硬链接的限制。 它们通过创建一个特殊类型的文件来工作,该文件包含指向引用文件或目录的文本指针。 在这方面,它们的操作方式与Windows快捷方式非常相似,尽管它们比Windows功能早了许多年