天天看点

linux 命令

cp:复制文件和目录。

mv:移动或重命名文件和目录。

mkdir:创建目录。

rm:移除文件和目录。

in:创建硬链接和符号链接。

这5个命令属于最常使用的Linux命令之列,可用来操作文件与目录。

坦率地说,使用图形文件管理器来执行一些由这些命令执行的任务要容易得多。使用文件管理器,我们可以将文件从一个目录拖放到另一个目录,我们可以剪切和粘贴文件,我们可以删除文件。那么,为什么还要用这些命令行程序呢?

原因就在于命令行程序具有强大的功能和灵活的操作。虽然使用图形文件管理器能轻松实现简单的文件操作,但是对于复杂的任务,使用命令行程序更容易完成。例如,怎样仅因为文件在目标目录中不存在或存在旧的版本,就将所有HTML文件从一个目录复制到目标目录里呢?要完成这个任务,使用文件管理器则相当困难,而使用命令行则很容易。

1.cp -u *.html destination

4.1  通配符

在开始使用命令之前,我们需要介绍一个使命令行如此强大的shell特性。由于shell需要经常使用文件名,因此它提供了一些特殊字符来帮助你快速指定一组文件名。这些特殊字符称为通配符。通配符(也叫文件名替换)允许用户依据字符模式选择文件名。表4-1列出了通配符以及它们所选择的对象。

表4-1  通配符

通配符 匹配项
* 匹配任意多个字符(包括0个和1个)
匹配任一单个字符(不包括0个)
[characters] 匹配任意一个属于字符集中的字符
[!characters] 匹配任意一个不属于字符集中的字符
[[:class:]] 匹配任意一个属于指定字符类中的字符

表4-2列出了最常用的字符类。

表4-2  常用的字符类

字符类
[:alnum:] 匹配任意一个字母或数字
[:alpha:] 匹配任意一个字母
[:digit] 匹配任意一个数字
[:lower:] 匹配任意一个小写字母
[:upper:] 匹配任意一个大写字母

通配符的使用使得为文件名构建复杂的筛选标准成为可能。表 4-3 列出了一些通配符模式及其匹配内容的示例。

表4-3  通配符示例

模式
所有文件

续表

形式
g* 以g开头的任一文件
b*.txt

以b开头,中间有任意多个字符,

并以.txt结尾的任一文件

Data??? 以Data开头,后面跟3个字符的任一文件
[abc]* 以abc中的任一个开头的任一文件
BACKUP.[0-9][0-9][0-9] 以BACKUP.开头,后面紧跟3个数字的任一文件
[[:upper:]]* 以大写字母开头的任一文件
[![:digit:]]* 不以数字开头的任一文件
*[[:lower:]123]

以小写字母或数字1、2、3中

的任一个结尾的任一文件

通配符可以与任一个使用文件名为参数的命令一起使用,在第7章我们会进一步讨论。

字符范围

如果你之前使用过其他的类UNIX环境或是读过该主题的相关书籍,可能遇到过[A-Z]或[a-z]形式的字符范围表示法。这些都是传统的UNIX表示法,在早期的Linux版本中仍然奏效。尽管它们仍然起作用,但使用时请务必小心,因为一旦配置不当,就会产生非预期的结果。目前,我们要避免使用它们,而是使用字符类。

通配符在GUI中也奏效

通配符相当有用,不仅仅因为它们在命令行中使用频繁,而且在于一些图形文件管理器也支持通配符操作。

在Nautilus(GNOME的文件管理器)中,你可以使用Edit->Select Pattern选择文件。仅仅输入一个用通配符表示的文件选择模式后,则当前查看的目录中,所匹配的文件就会突出显示。

在Dolphin和Konqueror(KDE的文件管理器)的一些版本中,你可以直接在地址栏输入通配符。比如,如果想要在/usr/bin目录中查找所有以小写字符u开始的文件,只需在地址栏输入/usr/bin/u*,即可显示匹配的结果。

最初源于命令行界面的许多理念,也同样适用于图形界面。而这恰恰是使Linux系统桌面如此强大的原因之一。

4.2  mkdir-创建目录

mkdir命令是用来创建目录的,格式如下。

1.mkdir directory…       

注意表示法:本书在描述命令时,如果参数后面带有3个点号(如上所示),这表示该参数重复。因此,下面这种情况:

1.mkdir dir1       

可创建单个dir1目录,而输入:

1.mkdir dir1 dir2 dir3       

可创建3个目录,分别命名为dir1、dir2和dir3。

4.3  cp-复制文件和目录

cp命令用来复制文件和目录。它有两种不同的使用方式,如下所示。

1.cp item1 item2

将单个文件或目录item1复制到文件或目录item2中。

1.cp item…  directory

将多个项目(文件或目录)复制进一个目录中。

表4-4和表4-5列出了cp常用的选项(短选项和等价的长选项)。

表4-4  cp命令选项

选项 含义
-a,--archive

复制文件和目录及其属性,包括所有

权和权限。通常来说,复制的文件具

有用户所操作文件的默认属性

-i,--interactive

在覆盖一个已存在的文件前,提示用户

进行确认。如果没有指定该选项,cp

会默认覆盖文件

-r,--recursive

递归地复制目录及其内容。复制目录时

需要这个选项(或-a选项)

-u,--update

当将文件从一个目录复制到另一个目

录时,只会复制那些目标目录中不存在

的文件或是目标目录相应文件的更新文件

-v,--verbose

复制文件时,显示信息性消息

(informative message)

表4-5  cp命令示例

命令 结果
cp file1 file2

将file1复制到file2。如果file2存在,

则会被file1的内容覆盖。如果file2不存在,则创建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不存在,创建dir2,且包含

与dir1目录相同的内容

4.4  mv-移除和重命名文件

mv命令可以执行文件移动和文件重命名操作,这具体取决于如何使用它。在这两种情况下,完成操作之后,原来的文件名将不存在。mv的使用方法与cp基本相似。

1.mv item1 item2

将文件(或目录)item1移动(或重命名)为item2,或是

1.mv item… directory

将一个或多个条目从一个目录移动到另一个目录下。

mv命令很多选项与cp命令是共享的,如表4-6和表4-7所示。

表4-6  mv选项

覆盖一个已存在的文件之前,提示用

户确认。如果没有指定该选项,mv会默认覆盖文件

将文件从一个目录移动到另一个目录,

只移动那些目标目录中不存在的文件或

是目标目录里相应文件的更新文件

移动文件时显示信息性消息

表4-7  mv示例

mv file1 file2

将file1移到file2。如果file2存在,则会

被file1的内容覆盖。如果file2不存在,

则创建file2。无论哪一种情况,file1不再存在

mv –i file1 file2 同上,仅当file2存在时,覆盖之前通知用户确认
mv file1 file2 dir1

将file1和file2移到目录dir1下。dir1必

须已经存在

mv dir1 dir2

将目录dir1(和其内容)移到目录dir2下。

如果目录dir2不存在,创建目录dir2,将目

录dir1的内容移到dir2下,同时删除目录dir1

4.5  rm-删除文件和目录

rm命令用来移除(删除)文件和目录,如下所示。

1.rm item…

其中,item是一个或多个文件(或目录)的名称。

小心rm命令

类UNIX操作系统(如Linux)并不包含还原删除操作的命令。一旦使用rm命令,就彻底地删除了。Linux系统默认用户是明智的,并清楚自己在干什么。

rm命令与通配符在一起使用时要特别小心。来看下面这个经典的示例。假设我们只希望删除目录中的HTML文件,为此需要输入以下正确的命令:

1.rm *.html

如果不小心在*与.html之间多打了一个空格,如下所示:

1.rm * .html

rm 命令将会删除目录中所有文件,并提示说明目录中没有叫做.html 的文件。

提示:当rm命令与通配符一起使用时,除仔细检查输入内容外,可使用ls命令预先对通配符做出测试,这将显示欲删除的文件。紧接着,你可以按下向上方向键调用之前的命令,并使用rm代替ls。

表4-8和表4-9列出了rm命令的一些常用选项。

表4-8  rm选项

删除一个已存在的文件前,提示用户确认。

如果没有指定这个选项,rm命令会默认删除文件

递归地删除目录。也就是说,如果删除

的目录有子目录的话,也要将其删除。要删

除一个目录,则必须指定该选项

-f,--force

忽略不存在的文件并无需提示确认。

该选项会覆盖--interactive选项

删除文件时显示信息性消息

表4-9  rm实例

rm file1 在不提示用户的情况下,删除file1
rm –i file1 删除file1前,提示用户确认
rm –r file1 dir1 删除file1、dir1以及它们的内容
rm –rf file1 dir1

同上,当时在file1或dir1不存在时,

rm仍会继续执行,且不提示用户

4.6  ln--创建链接

ln命令可用来创建硬链接或是符号链接。它的使用方式有两种。

1.ln file link       

用来创建硬链接,而

1.ln -s item link       

用来创建符号链接,这里的item可以是文件也可以是目录。

4.6.1  硬链接

硬链接是最初UNIX用来创建链接的方式,符号链接较之更为先进。默认情况下,每个文件有一个硬链接,该硬链接会给文件起名字。当创建一个硬链接的时候,也为这个文件创建了一个额外的目录条目。硬链接有两条重要的局限性。

硬链接不能引用自身文件系统之外的文件。也就是说,链接不能引用与该链接不在同一磁盘分区的文件。

硬链接无法引用目录。

硬链接和文件本身没有什么区别。与包含符号链接的目录列表不同,包含硬链接的目录列表没有特别的链接指示说明。当硬链接被删除时,只是删除了这个链接,但是文件本身的内容依然存在(也就是说,该空间没有释放),除非该文件的所有链接都被删除了。

因为会经常遇到它们,了解硬链接就显得特别重要。但是现在大多使用的是符号链接,下面将会有所介绍。

4.6.2  符号链接

符号链接是为了克服硬链接的局限性而创建的。符号链接是通过创建一个特殊类型的文件来起作用的,该文件包含了指向引用文件或目录的文本指针。就这点来看,符号链接与Windows系统下的快捷方式非常相似,但是,符号链接要早于Windows的快捷方式很多年。

符号链接指向的文件与符号链接自身几乎没有区别。例如,将一些东西写进符号链接里,那么这些东西同样也写进了引用文件。而当删除一个符号链接时,删除的只是符号链接而没有删除文件本身。如果先于符号链接之前删除文件,那么这个链接依然存在,但却不指向任何文件。此时,这个链接就称为坏链接。在很多实现中,ls命令会用不同的颜色来显示坏链接,比如红色,从而显示它们的存在。

链接的概念似乎很令人迷惑,但是不要害怕。我们要经常性地使用,它们慢慢的就会清晰起来。

4.7  实战演练

由于我们要做一些实际的文件操作,我们先来创建一个安全的地带,来执行文件操作命令。首先,我们需要一个工作目录。我们在主目录里创建一个目录并命名为playground。

4.7.1  创建目录

mkdir命令用来创建一个目录。为了创建playground目录,我们首先要保证当前目录是主目录,然后再创建新目录。

1.[me@linuxbox ~]$ cd        
2.[me@linuxbox ~]$ mkdir playground        
3.      

为了让我们的实战演练更有意思,我们在playground目录中新建两个目录,命名为dir1、dir2。为此,我们应先将当前的工作目录切换为playground,然后再次执行mkdir命令。

1.[me@linuxbox ~]$ cd playground        
2.[me@linuxbox playground]$ mkdir dir1 dir2       

需要注意的是,mkdir命令可以接受多个参数,从而允许我们用一个命令创建两个目录。

4.7.2  复制文件

接下来,让我们在创建的目录中放入一些数据。这一过程可通过文件复制来完成。通过使用cp命令,我们可以将/ect目录中的passwd文件复制到当前工作目录里。

1.[me@linuxbox playground]$ cp /etc/passwd .       

注意我们是如何使用当前工作目录的快捷方式的,即在命令末尾加单个句点。如果我们此时执行ls命令,将会看到我们的文件。

1.[me@linuxbox playground]$ ls -l        
2.total 12        
3.drwxrwxr-x 2 me me 4096 2012-01-10 16:40 dir1        
4.drwxrwxr-x 2 me me 4096 2012-01-10 16:40 dir2        
5.-rw-r--r-- 1 me me 1650 2012-01-10 16:07 passwd        

现在让我们使用-v选项,重复操作复制命令,来看看结果如何。

1.[me@linuxbox playground]$ cp -v /etc/passwd .        
2.'/etc/passwd' -> './passwd'        

cp命令再次执行复制操作,但是,这一次显示了一条简洁的信息来指明它正在执行什么操作。需要注意的是,在没有任何警告的情况下,cp命令覆盖了第一次的复制内容。cp命令会假定用户清楚自己当前的操作。加上-i(交互式)选项可以获得警告信息。

1.[me@linuxbox playground]$ cp -i /etc/passwd .        
2.cp: overwrite './passwd'?        

通过在提示符下输入y,文件就会被重写;任何其他的字符(比如,n)会使cp命令保留该文件。

4.7.3  移动和重命名文件

现在,passwd这个名字似乎没有那么有趣,而我们毕竟是在进行实战演练,因此我们给它改个名字。

1.[me@linuxbox playground]$ mv passwd fun       

现在传送fun文件,这是通过将重命名的文件移动到各个目录,然后再移动回当前目录来实现的:

1.[me@linuxbox playground]$ mv fun dir1       

首先移到目录dir1下,然后:

1.[me@linuxbox playground]$ mv dir1/fun dir2       

将文件从目录dir1移到dir2,然后:

1.[me@linuxbox playground]$ mv dir2/fun .       

再将文件fun重新移到当前工作目录下。下面来看mv命令的效果。首先,再次将数据文件移到目录dir1。

1.[me@linuxbox playground]$ mv fun dir1       

然后将目录dir1移到dir2并且使用ls命令进行确认。

1.[me@linuxbox playground]$ mv dir1 dir2        
2.[me@linuxbox playground]$ ls -l dir2        
3.total 4        
4.drwxrwxr-x 2 me me 4096 2012-01-11 06:06 dir1        
5.[me@linuxbox playground]$ ls -l dir2/dir1        
6.total 4        
7.-rw-r--r-- 1 me me 1650 2012-01-10 16:33 fun       

注意,因为目录dir2已经存在,mv命令将目录dir1移到dir2。如果dir2不存在,mv将dir1重命名为dir2。最后,我们将所有东西放回原处。

1.[me@linuxbox playground]$ mv dir2/dir1 .        
2.[me@linuxbox playground]$ mv dir1/fun .        

4.7.4  创建硬链接

现在,我们试着创建一些链接。首先是创建硬链接,我们先按照如下方式创建一些指向数据文件的链接:

1.[me@linuxbox playground]$ ln fun fun-hard        
2.[me@linuxbox playground]$ ln fun dir1/fun-hard        
3.[me@linuxbox playground]$ ln fun dir2/fun-hard       

目前有4个文件fun的实例。来看一下playground目录。

1.[me@linuxbox playground]$ ls -l        
2.total 16        
3.drwxrwxr-x 2 me  me  4096 2012-01-14 16:17 dir1        
4.drwxrwxr-x 2 me  me  4096 2012-01-14 16:17 dir2        
5.-rw-r--r-- 4 me  me  1650 2012-01-10 16:33 fun        
6.-rw-r--r-- 4 me  me  1650 2012-01-10 16:33 fun-hard       

可以注意到,在列表中,文件fun和fun-hard的第二个字段都是4,这是文件fun存在的硬链接数目。你要记得,由于文件名是由链接创建的,所以一个文件通常至少有一个链接。那么,我们是如何知道fun和fun-hard实际上是同一个文件的呢?这种情况下,ls命令无济于事。虽然从第5个字段得知fun和fun-hard文件大小相同,但是我们的列表并没有提供可靠的方式来确认它们是否是同一个文件。要解决这个问题,必须做进一步研究。

提到硬链接时,可以想象文件是由两部分组成的,即包含文件内容的数据部分和包含文件名的名称部分。创建硬链接时,实际上是创建了额外的名称,这些名称都指向同一数据部分。系统分配了一系列的盘块给所谓的索引节点(inode),该节点随后与文件名称部分建立关联。因此,每个硬链接都指向包含文件内容的具体索引节点。

ls命令有一种方式可以显示上述信息。它是通过在命令中加上-i选项来实现的。

1.[me@linuxbox playground]$ ls -li        
2.total 16        
3.12353539 drwxrwxr-x 2 me  me  4096 2012-01-14 16:17 dir1        
4.12353540 drwxrwxr-x 2 me  me  4096 2012-01-14 16:17 dir2        
5.12353538 -rw-r--r-- 4 me  me  1650 2012-01-10 16:33 fun        
6.12353538 -rw-r--r-- 4 me  me  1650 2012-01-10 16:33 fun-hard       

在这个列表中,第一个字段就是索引节点号,可以看到,fun和fun-hard共享同一个索引节点号,这就证实它们是相同的文件。

4.7.5  创建符号链接

只所以创建符号链接,是为了克服硬链接的两大不足,即硬链接无法跨越物理设备,也无法引用目录,只能引用文件。符号链接是一种特殊类型的文件,它包含了指向目标文件或目录的文本指针。

创建符号链接与创建硬链接相似,如下所示。

1.[me@linuxbox playground]$ ln -s fun fun-sym        
2.[me@linuxbox playground]$ ln -s ../fun dir1/fun-sym        
3.[me@linuxbox playground]$ ln -s ../fun dir2/fun-sym       

第一个命令相当直接,我们只是在ln命令中添加-s选项,就可以创建符号链接而不是硬链接。但是,接下来的两个命令是干什么的呢?牢记一点,创建符号链接时,同时也创建一个文本来描述目标文件在哪里与与符号链接有关联。如果看看ls命令的输出就更容易明白了。

1.[me@linuxbox playground]$ ls -l dir1        
2.total 4        
3.-rw-r--r-- 4 me  me  1650 2012-01-10 16:33 fun-hard        
4.lrwxrwxrwx 1 me  me      6 2012-01-15 15:17 fun-sym -> ../fun       

在目录dir1中,fun-sym的列表显示它是一个符号链接,这是通过第1个字段中的首字符"l"来确认的,并且它也指"../fun",这也是正确的。相对于fun-sym的实际位置,文件fun在它的上一级目录。还要注意到,符号链接文件的长度是6,这是"../fun"字符串中字符的数目,而不是它所指向的文件的长度。

创建符号链接时,可以使用绝对路径名,如下所示:

1.[me@linuxbox playground]$ ln -s /home/me/playground/fun dir1/fun-sym       

也可以使用相对路径,如前面的示例所示。因为相对路径允许包含符号链接的目录被重命名和/或移动,而且不会破坏链接,因此更可取一些。

除了普通文件之外,符号链接也可以引用目录。

1.[me@linuxbox playground]$ ln -s dir1 dir1-sym        
2.[me@linuxbox playground]$ ls -l        
3.total 16        
4.drwxrwxr-x 2 me  me  4096 2012-01-15 15:17 dir1        
5.lrwxrwxrwx 1 me  me      4 2012-01-16 14:45 dir1-sym -> dir1        
6.drwxrwxr-x 2 me  me  4096 2012-01-15 15:17 dir2        
7.-rw-r--r-- 4 me  me  1650 2012-01-10 16:33 fun        
8.-rw-r--r-- 4 me  me  1650 2012-01-10 16:33 fun-hard        
9.lrwxrwxrwx 1 me  me      3 2012-01-15 15:15 fun-sym -> fun        

4.7.6  移除文件和目录

前面讲到,使用rm命令可以删除文件和目录。那么我们就用它来清空playground目录。首先,我们删除目录中的一个硬链接。

1.[me@linuxbox playground]$ rm fun-hard        
2.[me@linuxbox playground]$ ls -l        
3.total 12        
4.drwxrwxr-x 2 me  me  4096 2012-01-15 15:17 dir1        
5.lrwxrwxrwx 1 me  me      4 2012-01-16 14:45 dir1-sym -> dir1        
6.drwxrwxr-x 2 me  me  4096 2012-01-15 15:17 dir2        
7.-rw-r--r-- 3 me  me  1650 2012-01-10 16:33 fun        
8.lrwxrwxrwx 1 me  me      3 2012-01-15 15:15 fun-sym -> fun       

不出所料,文件file-hard被删除了,文件fun的链接数相应的也由4变成了3,如目录列表的第二个字段所示。接下来,我们删除文件fun,为了好玩,我们还会加上-i选项,看看执行了哪些操作。

1.[me@linuxbox playground]$ rm -i fun        
2.rm: remove regular file 'fun'?       

在提示符下输入字符y,文件就被删除了。现在看一下ls命令的输出。注意fin-sym文件发生了什么变化?由于它是一个符号链接,且指向的文件现在已经不存在,所以链接也就破坏了。

1.[me@linuxbox playground]$ ls -l        
2.total 8        
3.drwxrwxr-x 2 me  me  4096 2012-01-15 15:17 dir1        
4.lrwxrwxrwx 1 me  me      4 2012-01-16 14:45 dir1-sym -> dir1        
5.drwxrwxr-x 2 me  me  4096 2012-01-15 15:17 dir2        
6.lrwxrwxrwx 1 me  me      3 2012-01-15 15:15 fun-sym -> fun       

大多数Linux发行版会配置ls命令,来显示破坏的链接。在Fedora系统中,破坏的链接是以闪烁的红色来显示的!受破坏的链接并不危险,但是会相当混乱麻烦。如果试图调用破坏的链接,将会看到如下情况:

1.[me@linuxbox playground]$ less fun-sym        
2.fun-sym: No such file or directory       

稍微清理一下。我们准备删除符号链接。

1.[me@linuxbox playground]$ rm fun-sym dir1-sym        
2.[me@linuxbox playground]$ ls -l        
3.total 8        
4.drwxrwxr-x 2 me  me  4096 2012-01-15 15:17 dir1        
5.drwxrwxr-x 2 me  me  4096 2012-01-15 15:17 dir2       

有关符号链接,需要记住一点,即大部分文件操作是以链接目标为对象的,而非链接本身。而rm命令是个例外。当删除一个链接的时候,链接本身被删除,但是目标文件依旧存在。

1.[me@linuxbox playground]$ cd        
2.[me@linuxbox ~]$ rm -r playground       

GNOME和KDE中的文件管理器提供了一种自动创建符号链接的简单方法。在GNOME环境下,拖拽文件时同时按住Ctrl-Shift键将会新建链接文件,而不是执行复制(移动)操作。在KDE环境下,无论什么时候放下(drop)一个文件都会弹出一个小菜单,它提供了复制、移动或创建链接文件等选项。

继续阅读