您的位置:首页 > 运维架构 > Linux

第1 部分:Linux 基础

2010-05-28 12:55 295 查看
在本教程中,我们将给您介绍bash(标准的Linuxshell),为您展示如何充分利用如ls、cp和mv这样的标准Linux命令,并向您讲解Linux的权限和所有权模型以及更丰富的内容。在本教程结束之际,您将具有Linux基础知识方面的扎实基础,甚至还可以准备开始学习一些基本的Linux系统管理任务方面的知识。 一。关于本教程本教程所讲述的内容?欢迎光临“Linux基础知识”,这是专为LinuxProfessionalInstitute101考试准备的四部分教程中的第一部分。在本教程中,我们将给您介绍
bash
(标准的Linuxshell),为您展示如何充分利用如ls、cp和mv这样的标准Linux命令,并向您讲解Linux的权限和所有权模型以及更丰富的内容。在本教程结束之际,您将具有Linux基础知识方面的扎实基础,甚至还可以准备开始学习一些基本的Linux系统管理任务方面的知识。在本系列教程结束时(总共8部分),您将具备成为“Linux系统管理员”所必需的知识,并且如果您选择参加LPI考试,您将能够获得LinuxProfessionalInstitute颁发的LPICLevel1证书。LPI徽标是LinuxProfessionalInstitute的商标。我应该学习本教程吗?对于Linux新手,或者那些想要重新审视或改进自己对基本Linux概念(比如:复制和移动文件、创建符号和硬链接、设置文件系统对象所有权和权限以及同管道和重定向一起使用Linux的标准文本处理命令)的理解的人来说,本教程(第1部分)是理想的教材。沿着这个方向,我们将一起分享很多心得、技巧和窍门,使该教程甚至对于那些具有丰富经验的Linux老手来说都是“有血有肉”,并且是实用的。对于初学者而言,本教程的许多内容都很新颖,而更有经验的Linux用户可能会发现本教程是使他们基本的Linux技能“炉火纯青”的有效途径。
关于作者
 关于本教程内容的技术方面的问题,请通过drobbins@gentoo.org与作者DanielRobbins联系。DanielRobbins居住在新墨西哥州的Albuquerque市,他是GentooTechnologies公司的总裁/CEO,也是GentooLinux(一种面向PC的高级Linux)和Portage系统(Linux的下一代移植系统)的创始人。他还是Macmillan书籍CalderaOpenLinuxUnleashed、SuSELinuxUnleashed和SambaUnleashed的撰稿人。Daniel自二年级起就与计算机某些领域结下不解之缘,那时他首先接触的是Logo程序语言,并沉溺于PacMan游戏中。这可能是他后来成为SONYElectronicPublishing/Psygnosis的“首席图形设计师”的原因。Daniel喜欢与他的妻子Mary和他的刚出世的女儿Hadassah共享天伦之乐。二。介绍bashshell如果您使用过Linux系统,那么您知道当登录时,将会看到像这样的提示符:
$
您所看到的特殊的提示符可能看起来很不一样。它可能包含系统的主机名、当前的工作目录名,或者两者都有。但是不管这个特殊的提示符看起来像什么,有一件事是肯定的。打印出这个提示符的程序叫“shell”,极有可能您的特殊的shell是一个叫[code]bash
的程序。[/code]
您在运行bash吗?
您可以通过输入下面的命令来检查您是否正在运行
bash
$echo$SHELL
/bin/bash
如果上面的命令行报错或者不会类似地响应我们的示例,那么您可能正在运行一个不同于
bash
的shell。在这种情况下,本教程的大部分内容仍然适用,但是出于为101考试作准备的目的,您最好切换到
bash
。(请参阅本教程系列的第2部分,以获取关于使用
chsh
命令来改变shell的信息。)关于bashBash是“Bourne-againshell”的首字母缩写,它是大多数Linux系统缺省的shell。shell的任务是执行您的命令,使您能够与Linux系统进行交互。当您输完命令,您可以通知shell执行
exit
logout
命令,在此您将返回到登录提示符。顺便提一下,您还可以通过在
bash
提示符下按control-D来注销。使用“cd”您可能已经发现,目不转睛地盯着
bash
提示符可不是世界上最让人感到有劲的事。那么,让我们来开始用
bash
来浏览我们的文件系统。在提示符下,输入下面的命令(不包括
$
):
$cd/
我们只告诉
bash
您想在
/
(也称为根目录)中工作;系统上的所有目录形成一棵树,
/
被认为是这棵树的顶部,或者是根。
cd
设置当前您正在工作的目录,也称为“当前工作目录”。[/code]路径要看bash的当前工作目录,您可以输入:
$pwd
/
在上面的示例中,
cd
/
参数叫做路径。它告诉
cd
我们要转到什么地方。特别是,
/
参数是一个绝对路径,意味着它指定了相对于文件系统树的根的位置。[/code]绝对路径这里有几个其它的绝对路径:
/dev
/usr
/usr/bin
/usr/local/bin
您可以看到,所有绝对路径有一个共同点就是,它们都以
/
开头。通过路径
/usr/local/bin
,我们告诉
cd
进入
/
目录,接着进入这个目录之下的
usr
目录,然后再进入
local
bin
。绝对路径总是通过是否以
/
开头来判断。[/code]相对路径另一种路径叫相对路径。在Bash中,
cd
以及其它命令总是解释那些相对于当前目录的路径。相对路径绝不会以
/
开头。这样,如果我们在
/usr
中:
$cd/usr
那么,我们可以使用相对路径来转到
/usr/local/bin
目录:[/code]
$cdlocal/bin
$pwd
/usr/local/bin
使用“..”
相对路径还可以包含一个或多个..
目录。[code]..目录是指向父目录的专门目录。那么,继续前面的示例:[/code]
$pwd
/usr/local/bin
$cd..
$pwd
/usr/local
可以看到,现在我们的当前目录是
/usr/local
。我们能够“后退”到相对于我们所在的当前目录的一个目录。[/code]
此外,我们还可以将..
添加到一个现有的相对路径中,使我们可以进入与我们已在目录并排的目录,例如:
$pwd/usr/local$cd../share$pwd/usr/share相对路径示例
[/code]
[/code]
相对路径可以变得相当复杂。这里有几个示例,所有的都没有显示出结果的目标路径。请试着推断一下,输入这些命令后,您最终将会转到什么地方:
$cd/bin$cd../usr/share/zoneinfo
$cd/usr/X11R6/bin$cd../lib/X11
[/code]
$cd/usr/bin$cd../bin/../bin
[/code]
现在,试验一次,看看您的推断是否正确。:)
理解“.”
在我们结束cd
的介绍之前,我们还需要讨论一些更多的内容。首先,还有另一个叫[code].的专门的目录。它表示“当前目录”。然而该目录不为
cd
命令使用,它通常用来执行一些当前目录中的程序,如下所示:[/code]
$./myprog
在上面的示例中,驻留在当前工作目录中的
myprog
可执行文件将被执行。[/code]
cd和主目录
如果我们想要转到主目录,我们可以输入:
$cd
没有参数,cd将转到主目录,对于超级用户来说是
/root
,对于一般用户来说通常是
/home/username
。但是,如果我们想要指定一个主目录中的文件,将会怎样呢?可能我们想要将一个文件参数传给myprog命令。如果该文件在主目录中,我们可以输入:[/code]
$./myprog/home/drobbins/myfile.txt
但是,使用像这样的绝对路径并不总是很方便。幸好,我们可以使用
~
(代字符)字符来完成同样的事:[/code]
$./myprog~/myfile.txt
其他用户的主目录[/code]
[/code]
Bash将把单独的~
扩展为指向主目录,然而您还可以用它来指向其他用户的主目录。例如,如果我们想要引用fred的主目录中的名为fredsfile.txt的文件,可以输入:
$./myprog~fred/fredsfile.txt
三。使用linux命令[/code]
介绍“ls”
[/code]
[/code]
现在,我们将快速地看一看ls
命令。很可能,您已经很熟悉[code]ls,并且知道只输入ls本身将列出当前工作目录的内容:[/code]
$cd/usr$lsX11R6doci686-pc-linux-gnulibmansbinsslbingentoo-x86includelibexecportagesharetmpdistfilesi686-linuxinfolocalportage.oldsrc
[/code]
通过指定-a
选项,您可以看到目录中的所有文件,包括隐藏文件―那些以[code].开头的文件。您可以在下面的示例中看到,
ls-a
将显示
.
..
专门的目录链接:[/code]
$ls-a.bingentoo-x86includelibexecportagesharetmp..distfilesi686-linuxinfolocalportage.oldsrcX11R6doci686-pc-linux-gnulibmansbinssl长目录清单
[/code]
您还可以在ls
命令行中指定一个或多个文件或目录。如果您指定一个文件,[code]ls将只显示那个文件。如果您指定一个目录,
ls
将显示这个目录的内容。当您需要在目录清单中查看权限、所有权、修改时间和大小信息时,
-l
选项很管用。[/code][/code]
[/code]
在下面的示例中,我们使用-l
选项来显示我的/usr目录的完整的清单。
$ls-l/usrdrwxr-xr-x7rootroot168Nov2414:02X11R6drwxr-xr-x2rootroot14576Dec2708:56bindrwxr-xr-x2rootroot8856Dec2612:47distfileslrwxrwxrwx1rootroot9Dec2220:57doc->share/docdrwxr-xr-x62rootroot1856Dec2715:54gentoo-x86drwxr-xr-x4rootroot152Dec1223:10i686-linuxdrwxr-xr-x4rootroot96Nov2413:17i686-pc-linux-gnudrwxr-xr-x54rootroot5992Dec2422:30includelrwxrwxrwx1rootroot10Dec2220:57info->share/infodrwxr-xr-x28rootroot13552Dec2600:31libdrwxr-xr-x3rootroot72Nov2500:34libexecdrwxr-xr-x8rootroot240Dec2220:57locallrwxrwxrwx1rootroot9Dec2220:57man->share/manlrwxrwxrwx1rootroot11Dec807:59portage->gentoo-x86/drwxr-xr-x60rootroot1864Dec807:55portage.olddrwxr-xr-x3rootroot3096Dec2220:57sbindrwxr-xr-x46rootroot1144Dec2415:32sharedrwxr-xr-x8rootroot328Dec2600:07srcdrwxr-xr-x6rootroot176Nov2414:25ssllrwxrwxrwx1rootroot10Dec2220:57tmp->../var/tmp
清单中,第一栏显示了每一项的权限信息。我将逐位说明该信息怎样被解释。接下来的一栏列出了每个文件系统对象的链接数,这里我们一带而过,稍后我们再回过头来讨论。第三和第四栏分别列出所有者和组。第五栏列出了对象的大小。第六栏是对象的“最近修改时间”或“mtime”(建立时间)。最后一栏是对象的名称。如果文件是符号链接,您将看到后面跟有
->
以及符号链接所指向的路径。[/code]
查看目录
有时,您想要查看目录本身,而不是目录内部。对于这种情况,您可以指定-d
选项,它将告诉[code]ls查看所有目录,否则在通常情况下,ls要查看目录内部:[/code]
$ls-dl/usr/usr/bin/usr/X11R6/bin../sharedrwxr-xr-x4rootroot96Dec1818:17../sharedrwxr-xr-x17rootroot576Dec2409:03/usrdrwxr-xr-x2rootroot3192Dec2612:52/usr/X11R6/bindrwxr-xr-x2rootroot14576Dec2708:56/usr/bin
递归和索引节点清单[/code]
[/code]
您可以使用-d
来查看目录本身,而您还可以用[code]-R来完成相反的工作―不仅只查看一个目录内部,而且要递归地查看该目录内所有的目录内部!我们将不会有对应该选项的任何示例输出(因为它一般占很大的篇幅),但是为了感觉一下它是怎样工作的,您可以试几个
ls-R
ls-Rl
命令。[/code]
最后,ls的-i
选项可以用来在清单中显示文件系统对象的索引节点号:
$ls-i/usr1409X11R6314258i686-linux43090libexec13394sbin1417bin1513i686-pc-linux-gnu5120local13408share8316distfiles1517include776man23779src43doc1386info93892portage36737ssl70744gentoo-x861585lib5132portage.old784tmp理解索引节点
[/code]
[/code]
文件系统的每个对象都分配到一个独一无二的索引,叫做索引节点号。这可能看起来微不足道,但是理解索引节点对于理解许多文件系统操作来说很重要。例如,请考虑出现在每个目录中的.
和[code]..链接。为了完全理解
..
目录实际上是什么,我们将先来看一看
/usr/local
的索引节点号:[/code]
$ls-id/usr/local5120/usr/local
[/code]
/usr/local目录有一个5120索引节点号。现在,我们来看一看/usr/local/bin/..的索引节点号:
$ls-id/usr/local/bin/..5120/usr/local/bin/..
[/code]
您可以看到,/usr/local/bin/..
具有和[code]/usr/local相同的索引节点号!这就是我们抓住的问题的实质。过去,我们认为
/usr/local
是这个目录本身。现在,我们发现索引节点5120实际上是这个目录,并且我们发现了指向该索引节点的两个目录条目(叫做“链接”)。
/usr/local
/usr/local/bin/..
都链接到索引节点5120。虽然索引节点5120只在磁盘中的一地方存在,但是多个目录条目都链接到它上面。[/code]
事实上,通过使用ls-dl
命令,我们可以看到索引节点5120被引用的总次数:
$ls-dl/usr/localdrwxr-xr-x8rootroot240Dec2220:57/usr/local
[/code]
如果我们看一看从左起的第二栏,我们可以看到目录/usr/local
(索引节点5120)被引用了8次。在我的系统中,引用该索引节点的不同路径有这些:
/usr/local/usr/local/./usr/local/bin/../usr/local/games/../usr/local/lib/../usr/local/sbin/../usr/local/share/../usr/local/src/..
[/code]
mkdir
[/code]
我们来快速地看一看mkdir命令,它可以用来创建新目录。下面的示例创建了三个新目录:tic
、[code]tac和
toe
,都在
/tmp
下:[/code]
$cd/tmp$mkdirtictactoe
缺省情况下,mkdir不会为您创建父目录;邻接的上一元素的完整路径必须存在。因此,如果您想要创建目录
won/der/ful
,您将需要发出三个单独的mkdir命令:[/code]
$mkdirwon/der/fulmkdir:cannotcreatedirectory`won/der/ful':Nosuchfileordirectory$mkdirwon$mkdirwon/der$mkdirwon/der/fulmkdir-p
[/code]
[/code]
然而,mkdir有一个很方便的-p
选项,该选项告诉mkdir创建所有缺少的父目录,如下所示:
$mkdir-peasy/as/pie
总之,非常简单。要学习更多关于mkdir命令的知识,请输入
manmkdir
来阅读手册页。除
cd
(它内置在
bash
中)之外,这几乎适用于这里所涉及的所有命令(比如
manls
)。[/code]
touch
现在,我们将要快速地看一看cp
和[code]mv命令,这些命令用来复制、重命名以及移动文件和目录。为了开始该概述,我们将首先用
touch
命令在
/tmp
中创建一个文件:[/code]
$cd/tmp$touchcopyme
如果文件存在,
touch
命令将更新文件的“mtime”(请回想
ls-l
输出中的第六栏)。如果文件不存在,那么将创建一个新的空文件。现在您应该有一个大小为零的
/tmp/copyme
文件。[/code]
echo和重定向
既然文件存在,我们来把一些数据添加到文件中。我们可以使用echo
命令来完成,它带有自己参数,并且把这些参数打印到标准输出。首先,单独的echo命令是这样的:
$echo"firstfile"firstfile
[/code]
带有输出重定向的同样的echo
命令为:
$echo"firstfile">copyme
大于符号告诉shell将
echo
的输出写到名为
copyme
的文件中。如果该文件不存在,将创建这个文件;如果该文件存在,将覆盖这个文件。通过输入
ls-l
,我们可以看到
copyme
文件为10个字节长,因为它包括
firstfile
这个词和换行符:[/code]
$ls-lcopyme-rw-r--r--1rootroot10Dec2814:13copymecat和cp
[/code]
[/code]
为了在终端显示文件的内容,要使用cat
命令:
$catcopymefirstfile
[/code]
现在,我们可以使用cp
命令的基本调用来由原始的[code]copyme文件创建
copiedme
文件:[/code]
$cpcopymecopiedme
通过观察,我们发现它们确实是相互独立的文件;它们的索引节点号不同:[/code]
$ls-icopymecopiedme648284copiedme650704copymemv
[/code]
[/code]
现在,我们来用“mv”命令将“copiedme”重命名为“movedme”。其索引节点号将仍然是同一个;但是,指向该索引节点的文件名将改变。
$mvcopiedmemovedme$ls-imovedme648284movedme
只要目标文件和源文件驻留在同一文件系统上,被移动的文件的索引节点号就将仍然不变。在本教程系列的第3部分,我们将进一步看一下文件系统。[/code]
四。创建链接和删除文件
硬链接
当谈及目录条目和索引节点之间关系时,我们提到了链接这个术语。Linux实际有两种链接。到此为止我们所讨论的这种链接叫硬链接。一个给定的索引节点可以有任意数目的硬链接,该索引节点一直存在于文件系统,直到所有的硬链接消失。可以使用ln
命令来创建新的硬链接:
$cd/tmp$touchfirstlink$lnfirstlinksecondlink$ls-ifirstlinksecondlink15782firstlink15782secondlink
[/code]
您可以看到,硬链接工作于索引节点级别,指向特殊的文件。在Linux系统上,硬链接有几个局限性。第一,您只能给文件建立硬链接,而不能给目录建立硬链接。的确如此;即便.
和[code]..是系统给目录创建的硬链接,也不允许您(“root”用户也不行)创建任何您自己的硬链接。[/code]
硬链接的第二个局限性是它们不能跨文件系统。这意味着,如果您的/
和[code]/usr存在于不同的文件系统,您不能创建从
/usr/bin/bash
/bin/bash
的链接。[/code]
符号链接
实际上,符号链接(symboliclink,或“symlinks”)比硬链接更常用到。符号链接是一种专门的文件类型,在这种文件类型中,链接通过名称引用另一个文件,而不是直接引用索引节点。符号链接不阻止文件被删除;如果目标文件消失,那么符号链接仅仅是不可用,或“被破坏”。
通过将-s
选项传给[code]ln,可以创建符号链接。[/code]
$ln-ssecondlinkthirdlink$ls-lfirstlinksecondlinkthirdlink-rw-rw-r--2agriffisagriffis0Dec3119:08firstlink-rw-rw-r--2agriffisagriffis0Dec3119:08secondlinklrwxrwxrwx1agriffisagriffis10Dec3119:39thirdlink->secondlink
[/code]
ls-l
输出中,可以用三种方式区分符号链接和一般文件。第一,请注意第一栏包含一个[code]l字符的输出表明是符号链接。第二,符号链接的大小是目标文件(本例是
secondlink
)的字符数。第三,输出的最后一栏显示目标文件名。[/code]
符号链接深入
符号链接通常比硬链接更灵活。您可以给任何类型的文件系统对象(包括目录)创建符号链接。又因为符号链接的实现是基于路径的(而不是索引节点),所以创建指向另一个文件系统上的对象的符号链接是完全可行的。但是,这一事实也使符号链接理解起来很复杂。
请考虑我们想要在/tmp中创建一个指向/usr/local/bin的链接的情况。我们应该输入:
$ln-s/usr/local/binbin1$ls-lbin1lrwxrwxrwx1rootroot14Jan115:42bin1->/usr/local/bin
[/code]
或者还可以输入:
$ln-s../usr/local/binbin2$ls-lbin2lrwxrwxrwx1rootroot16Jan115:43bin2->../usr/local/bin
[/code]
您可以看到,两个符号链接都指向同一目录。但是,如果我们的第二个符号链接在任何时刻被移动到另一个目录,由于相对路径的缘故,它将遭到“破坏”。
$ls-lbin2lrwxrwxrwx1rootroot16Jan115:43bin2->../usr/local/bin$mkdirmynewdir$mvbin2mynewdir$cdmynewdir$cdbin2bash:cd:bin2:Nosuchfileordirectory
[/code]
因为/tmp/usr/local/bin
这个目录不存在,我们不能再把目录转到[code]bin2;换句话说,
bin2
现在被破坏了。[/code]
由于这个原因,有时避免用相对路径信息来创建符号链接是个好主意。但是,在许多情况下,相对的符号链接很管用。请考虑一个示例,在这个示例中您想要给/usr/bin
中的一个程序创建一个别名:
#ls-l/usr/bin/keychain-rwxr-xr-x1rootroot10150Dec1220:09/usr/bin/keychain
[/code]
作为root用户,您可能想要给“keychain”创建一个别名,比如“kc”。在这个示例中,我们有root访问权,由bash提示符改变为“#”可以证明。我们之所以需要root访问权是因为一般用户不能在/usr/bin中创建文件。作为root用户,我们可以像下面这样给keychain创建一个别名:
#cd/usr/bin#ln-s/usr/bin/keychainkc
[/code]
当这个解决方法起作用时,如果我们想要把两个文件都移到/usr/local/bin
时,它将会出现问题。
#mv/usr/bin/keychain/usr/bin/kc/usr/local/bin
因为在符号链接中,我们使用了绝对路径,而我们的
kc
符号链接仍然指向
/usr/bin/keychain
,它已不存在了―另一个被破坏的符号链接。符号链接中的相对路径和绝对路径都各具优点,您应该使用适合于您的特殊应用的路径类型。一般情况下,相对路径或绝对路径都能工作得很好。在这种情况下,下面的示例将起作用:[/code]
#cd/usr/bin#ln-skeychainkc#ls-lkclrwxrwxrwx1rootroot8Jan512:40kc->keychain
[/code]
rm
[/code]
既然我们知道怎样使用cp
、[code]mv和
ln
,现在我们该学习怎样把对象从文件系统中删除了。通常,这用
rm
命令来完成。要删除文件,只需在命令行中指定它们:[/code]
$cd/tmp$touchfile1file2$ls-lfile1file2-rw-r--r--1rootroot0Jan116:41file1-rw-r--r--1rootroot0Jan116:41file2$rmfile1file2$ls-lfile1file2ls:file1:Nosuchfileordirectoryls:file2:Nosuchfileordirectory
[/code]
rmdir
[/code]
要删除目录,您有两种选择。您可以删除目录中所有的对象,然后使用rmdir
来删除目录本身:
$mkdirmydir$touchmydir/file1$rmmydir/file1$rmdirmydir
[/code]
或者,您可以使用rm
命令的recursiveforce选项来告诉rm删除您指定的目录以及目录中包含的所有对象:
$rm-rfmydir
[/code]
一般情况下,rm-rf
是删除目录树的首选方法。在使用[code]rm-rf时要十分小心,因为它的功能可以被很好地利用,也可能会因使用不当造成恶果。:)[/code]
五。介绍通配符
介绍通配符
在您日常的Linux使用中,有很多时候您可能需要一次对多个文件系统对象执行单一操作(比如rm
)。在这些情况下,在命令行中输入许多文件通常让人感到厌烦:
$rmfile1file2file3file4file5file6file7file8
[/code]
为了解决这个问题,您可以利用Linux内置的通配符支持。这种支持也叫做“globbing”(由于历史原因),允许您通过使用通配符模式一次指定多个文件。Bash和其它Linux命令将通过在磁盘上查找并找到任何与之匹配的文件来解释这种模式。因此,如果在当前工作目录中,您有从file1
到[code]file8的文件,那么您可以输入下面的命令来删除这些文件:[/code]
$rmfile[1-8]
或者,如果您只想要删除文件名以
file
开头的所有文件,您可以输入:[/code]
$rmfile*理解不匹配
[/code]
[/code]
或者,如果您想要列出/etc
中以[code]g开头的所有文件系统对象,您可以输入:[/code]
$ls-d/etc/g*/etc/gconf/etc/ggi/etc/gimp/etc/gnome/etc/gnome-vfs-mime-magic/etc/gpm/etc/group/etc/group-
[/code]
现在,如果您指定了没有任何文件系统对象与之匹配的模式,会怎么样呢?在下面的示例中,我们试图列出/usr/bin
中以[code]asdf开头并且以
jkl
结尾的所有文件:[/code]
$ls-d/usr/bin/asdf*jklls:/usr/bin/asdf*jkl:Nosuchfileordirectory
[/code]
这里是对所发生情况的说明。通常,当我们指定一种模式时,该模式与底层系统上的一个或多个文件匹配,bash
以空格隔开的所有匹配对象的列表来替换该模式。但是,当模式不能找到匹配对象时,[code]bash将不理会参数、通配符等等,保留原样。因此,当“ls”不能找到文件
/usr/bin/asdf*jkl
时,它会报错。此处的有效的规则是:glob模式只在与文件系统中的对象匹配时才可以进行扩展。[/code]
通配符语法:*
既然我们理解了globbing如何工作,我们来复习一下通配符语法。您可以使用几个用于通配符扩展的专门的字符;这里有一个:
*
*
将与零个或多个字符匹配。这就是说“什么都可以”。例子:[/code]
/etc/g*
与/etc中以[code]g开头的所有文件匹配。
/tmp/my*1
与/tmp中以
my
开头,并且以
1
结尾的所有文件匹配。[/code]
通配符语法:?
?
?
与任何单个字符匹配。例子:
myfile?
与文件名为[code]myfile后跟单个字符的任何文件匹配。
/tmp/notes?txt
将与
/tmp/notes.txt
/tmp/notes_txt
都匹配,如果它们存在。[/code]
通配符语法:[]
[]
该通配符与?
相似,但允许指定得更确切。要使用该通配符,把您想要匹配的所有字符放在[code][]内。结果的表达式将与[]中任一字符相匹配。您也可以用
-
来指定范围,甚至还可以组合范围。例子:[/code]
myfile[12]
将与[code]myfile1和
myfile2
匹配。只要当前目录中至少有一个这样的文件存在,该通配符就可以进行扩展。
[Cc]hange[Ll]og
将与
Changelog
ChangeLog
changeLog
以及
changelog
匹配。您可以看到,与大写形式的变形匹配时,使用括弧通配符很有用。
ls/etc/[0-9]*
将列出
/etc
中以数字开头的所有文件。
ls/tmp/[A-Za-z]*
将列出
/tmp
中以大写字母或小写字母开头的所有文件。[/code]
通配符语法:[!]
[!]
除了不与括弧中的任何字符匹配外,[!]
构造与[code][]构造类似,只要不是列在
[!
]
之间的字符,它将与任何字符匹配。例子:[/code]
rmmyfile[!9]
将删除除[code]myfile9之外的名为
myfile
加一个字符的所有文件。[/code]
通配符告诫说明
这里有一些使用通配符时应该注意的告诫说明。由于bash
[code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息