天天看点

基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识

遍历目录

cd destination

cd 命令可接受单个参数 destination ,用以指定想切换到的目录名。如果没有为 cd 命令指定目标路径,它将切换到用户主目录。

destination 参数可以用两种方式表示:一种是使用绝对文件路径,另一种是使用相对文件路径。

用户可在虚拟目录中采用绝对文件路径引用目录名。绝对文件路径定义了在虚拟目录结构中该目录的确切位置,以虚拟目录的根目录开始,相当于目录的全名。绝对文件路径总是以正斜线(/)作为起始,指明虚拟文件系统的根目录。因此,如果要指向usr目录所包含的bin目录下的用户二进制文件,可以使用如下绝对文件路径:/usr/bin

验证当前目录

pwd 命令可以显示出shell会话的当前目录,这个目录被称为当前工作目录。 pwd 命令

的用法如下:

[email protected]:/usr/bin$ pwd

2.相对文件路径 pwd

相对文件路径允许用户指定一个基于当前位置的目标文件路径。相对文件路径不以代表根目录的正斜线(/)开头,而是以目录名(如果用户准备切换到当前工作目录下的一个目录)或是一个特殊字符开始。

有两个特殊字符可用于相对文件路径中:

 单点符(.),表示当前目录;

 双点符(…),表示当前目录的父目录。

你可以使用单点符,不过对 cd 命令来说,这没有什么意义。

文件和目录列表

要想知道系统中有哪些文件,可以使用列表命令( ls )。

ls 命令最基本的形式会显示当前目录下的文件和目录

注意, ls 命令输出的列表是按字母排序的(按列排序而不是按行排序)。如果用户用的是支持彩色的终端仿真器, ls 命令还可以用不同的颜色来区分不同类型的文件。

带 -F 参数的 ls 命令轻松区分文件和目录。-F 参数在目录名后加了正斜线(/),以方便用户在输出中分辨它们。类似地,它会在可执行

文件(比如上面的my_script文件)的后面加个星号,以便用户找出可在系统上运行的文件。

基本的 ls 命令在某种意义上有点容易让人误解。它显示了当前目录下的文件和目录,但并没有将全部都显示出来。Linux经常采用隐藏文件来保存配置信息。在Linux上,隐藏文件通常是文件名以点号开始的文件。这些文件并没有在默认的 ls 命令输出中显示出来,因此我们称其为隐藏文件。

要把隐藏文件和普通文件及目录一起显示出来,就得用到 -a 参数。下面是一个带有 -a 参数的 ls 命令的例子:

基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识

所有以点号开头的隐藏文件现在都显示出来了。注意,有三个以.bash开始的文件。它们是bashshell环境所使用的隐藏文件

-R 参数是 ls 命令可用的另一个参数,叫作递归选项。它列出了当前目录下包含的子目录中

的文件。如果目录很多,这个输出就会很长。以下是 -R 参数输出的简单例子:

基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识
基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识

显示长列表

在基本的输出列表中, ls 命令并未输出太多每个文件的相关信息。要显示附加信息,另一个常用的参数是 -l 。 -l 参数会产生长列表格式的输出,包含了目录中每个文件的更多相关信息。

基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识

这种长列表格式的输出在每一行中列出了单个文件或目录。除了文件名,输出中还有其他有

用信息。输出的第一行显示了在目录中包含的总块数。在此之后,每一行都包含了关于文件(或

目录)的下述信息:

 文件类型,比如目录( d )、文件( - )、字符型文件( c )或块设备( b );

 文件的权限(参见第6章);

 文件的硬链接总数;

 文件属主的用户名;

 文件属组的组名;

 文件的大小(以字节为单位);

 文件的上次修改时间;

 文件名或目录名。

过滤输出列表

默认情况下, ls 命令会输出目录下的所有非隐藏文件。有时这个输出会显得过多,当你只需要查看单个少数文件信息时更是如此。

幸而 ls 命令还支持在命令行中定义过滤器。它会用过滤器来决定应该在输出中显示哪些文件或目录。

当用户指定特定文件的名称作为过滤器时, ls 命令只会显示该文件的信息。有时你可能不知道要找的那个文件的确切名称。 ls 命令能够识别标准通配符,并在过滤器中用它们进行模式匹配:

 问号( ? )代表一个字符;

 星号( * )代表零个或多个字符。

问号可用于过滤器字符串中替代任意位置的单个字符。

在过滤器中使用星号和问号被称为文件扩展匹配(file globbing),指的是使用通配符进行模

式匹配的过程。通配符正式的名称叫作元字符通配符(metacharacter wildcards)。除了星号和问

号之外,还有更多的元字符通配符可用于文件扩展匹配。可以使用中括号。

基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识

在这个例子中,我们使用了中括号以及在特定位置上可能出现的两种字符: a 或 i 。中括号表示一个字符位置并给出多个可能的选择。可以像上面的例子那样将待选的字符列出来,也可以指定字符范围,例如字母范围 [a – i] 。

基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识

另外,可以使用感叹号(!)将不需要的内容排除在外。

基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识

处理文件

创建文件

你总会时不时地遇到要创建空文件的情况。例如,有时应用程序希望在它们写入数据之前,

某个日志文件已经存在。这时,可用 touch 命令轻松创建空文件。

基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识

touch 命令创建了你指定的新文件,并将你的用户名作为文件的属主。注意,文件的大小是零,因为 touch 命令只创建了一个空文件。

复制文件

对系统管理员来说,在文件系统中将文件和目录从一个位置复制到另一个位置可谓家常便饭。 cp 命令可以完成这个任务。

在最基本的用法里, cp 命令需要两个参数——源对象和目标对象:

cp source destination
           

当 source 和 destination 参数都是文件名时, cp 命令将源文件复制成一个新文件,并且以

destination 命名。新文件就像全新的文件一样,有新的修改时间。

基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识

新文件 test_two 和文件 test_one 的修改时间并不一样。如果目标文件已经存在, cp 命令

可能并不会提醒这一点。最好是加上 -i 选项,强制shell询问是否需要覆盖已有文件。

基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识

本章在前面介绍了特殊符号可以用在相对文件路径中。其中的单点符(.)就很适合用于 cp命令。记住,单点符表示当前工作目录。如果需要将一个带有很长的源对象名的文件复制到当前工作目录中时,单点符能够简化该任务。

基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识

cp和cp -R功能上是等价的。不加-R或者-r的时候,只拷贝文件,不拷贝文件夹;加上后则会拷贝文件夹——包括下一级的子文件夹,以及子文件夹中的子文件夹,余此类推。

cp -r 会把所有source当作普通文件(regular文件);而cp -r 对特殊文件(管道文件,块设备文件,字符设备文件)会进行创建操作,而不是拷贝,比如FIFO文件或/dev/zero的时候, 就必须用-R, 否则, 他们没区别 。

也可以在 cp 命令中使用通配符。

基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识

该命令将所有以script结尾的文件复制到Mod_Scripts目录中。在这里,只需要复制一个文件:my_script。

重命名文件、移动文件

在Linux中,重命名文件称为移动(moving)。 mv 命令可以将文件和目录移动到另一个位置或重新命名。

基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识

注意,移动文件会将文件名从fall更改为fzll,但inode编号和时间戳保持不变。这是因为 mv

只影响文件名。

也可以使用 mv 来移动文件的位置。

基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识

和 cp 命令类似,也可以在 mv 命令中使用 -i参数 。这样在命令试图覆盖已有的文件时,你就会得到提示。

唯一变化的就是文件的位置。/home/christine目录下不再有文件fzll,因为它已经离开了原先

的位置,这就是 mv 命令所做的事情。

也可以使用 mv 命令移动文件位置并修改文件名称,这些操作只需一步就能完成。

基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识

在这个例子中,我们将文件fzll从子目录Pictures中移动到了主目录/home/christine,并将名字改为fall。文件的时间戳和inode编号都没有改变。改变的只有位置和名称。

删除文件

在Linux中,删除(deleting)叫作移除(removing) 。bash shell中删除文件的命令是 rm 。 rm命令的基本格式非常简单。

基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识

注意, -i 命令参数提示你是不是要真的删除该文件。bash shell中没有回收站或垃圾箱,文件一旦删除,就无法再找回。因此,在使用 rm 命令时,要养成总是加入 -i 参数的好习惯。

也可以使用通配符删除成组的文件。别忘了使用 -i 选项保护好自己的文件。

基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识

rm 命令的另外一个特性是,如果要删除很多文件且不受提示符的打扰,可以用 -f 参数强制删除。小心为妙!

-f, --force 忽略不存在的文件,从不给出提示。

-i, --interactive 进行交互式删除

-r, -R, --recursive 指示rm将参数中列出的全部目录和子目录均递归地删除。

友情提示:一般的删除操作用rm -i即可 。

处理目录

创建目录

在Linux中,有些命令(比如 cp 命令)对文件和目录都有效,而有些只对目录有效。创建新目录需要使用本节讲到的一个特殊命令。删除目录也很有意思,本节也会讲到。

在Linux中创建目录很简单,用 mkdir 命令即可:

基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识

系统创建了一个名为New_Dir的新目录。注意,新目录长列表是以d开头的。这表示New_Dir并不是文件,而是一个目录。

可以根据需要批量地创建目录和子目录。但是,如果你想单单靠 mkdir 命令来实现,就会得 到下面的错误消息:

基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识

要想同时创建多个目录和子目录,需要加入 -p 参数:

基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识

mkdir 命令的 -p 参数可以根据需要创建缺失的父目录。父目录是包含目录树中下一级目录的目录。

删除目录

删除目录之所以很棘手,是有原因的。删除目录时,很有可能会发生一些不好的事情。shell会尽可能防止我们捅娄子。删除目录的基本命令是 rmdir 。

默认情况下, rmdir 命令只删除空目录。因为我们在New_Dir目录下创建了一个文件my_file,所以 rmdir 命令拒绝删除目录。

要解决这一问题,得先把目录中的文件删掉,然后才能在空目录上使用 rmdir 命令。

基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识
基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识

rmdir 并没有 -i 选项来询问是否要删除目录。这也是为什么说 rmdir 只能删除空目录还是有好处的原因。

也可以在整个非空目录上使用 rm 命令。使用 -r 选项使得命令可以向下进入目录,删除其中的文件,然后再删除目录本身。

基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识

这种方法同样可以向下进入多个子目录,当需要删除大量目录和文件时,这一点尤为有效。

基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识
基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识

这种方法虽然可行,但很难用。注意,你依然要确认每个文件是否要被删除。如果该目录有很多个文件和子目录,这将非常琐碎。

一口气删除目录及其所有内容的终极大法就是使用带有 -r 参数和 -f 参数的 rm 命令

rm -rf 命令既没有警告信息,也没有声音提示。这肯定是一个危险的工具,尤其是在拥有超级用户权限的时候。务必谨慎使用,请再三检查你所要进行的操作是否符合预期。

基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识

在上面的例子中,我们使用了 tree 工具。它能够以一种美观的方式展示目录、子目录及其中的文件。如果需要了解目录结构,尤其是在删除目录之前,这款工具正好能派上用场。不过它可能并没有默认安装在你所使用的Linux发行版中。

查看文件内容

在显示文件内容之前,应该先了解一下文件的类型。如果打开了一个二进制文件,你会在屏幕上看到各种乱码,甚至会把你的终端仿真器挂起。file 命令是一个随手可得的便捷工具。它能够探测文件的内部,并决定文件是什么类型的:

基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识

上面例子中的文件是一个text(文本)文件。 file 命令不仅能确定文件中包含的文本信息,还能确定该文本文件的字符编码,ASCII。

下面的例子展示了 file 命令对脚本文件的返回结果。尽管这个文件是ASCII text,但因为它是一个脚本文件,所以可以在系统上执行(运行):

基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识

查看整个文件

如果手头有一个很大的文本文件,你可能会想看看里面是什么内容。在Linux上有3个不同的命令可以完成这个任务。

一、cat 命令

cat 命令是显示文本文件中所有数据的得力工具。

基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识

-n 参数会给所有的行加上行号。

基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识

这个功能在检查脚本时很有用。如果只想给有文本的行加上行号,可以用 -b 参数。

基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识

最后,如果不想让制表符出现,可以用 -T 参数。

基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识

二、more命令

cat 命令的主要缺陷是:一旦运行,你就无法控制后面的操作。为了解决这个问题,开发人员编写了 more 命令。

more 命令会显示文本文件的内容,但会在显示每页数据之后停下来。 我们输入命令 more /etc/bash.bashrc 生成如图所显示的内容。

基本BASH SHELL脚本命令——切换目录以及处理文件和目录的基本知识

屏幕的底部, more 命令显示了一个标签,其表明你仍然在 more 程序中以及你现在在这个文本文件中的位置。这是 more 命令的提示符。

more 命令是分页工具。在本章前面的内容里,当使用 man 命令时,分页工具会显示所选的bash手册页面。和在手册页中前后移动一样,你可以通过按空格键或回车键以逐行向前的方式浏览文本文件。浏览完之后,按q键退出。

三、less命令

从名字上看,它并不像 more 命令那样高级。但是, less 命令的命名实际上是个文字游戏(从俗语“less is more”得来),它实为 more 命令的升级版。它提供了一些极为实用的特性,能够实现在文本文件中前后翻动,而且还有一些高级搜索功能。

查看部分文件

通常你要查看的数据要么在文本文件的开头,要么在文本文件的末尾。如果这些数据是在大型文件的起始部分,那你就得等 cat 或 more 加载完整个文件之后才能看到。如果数据是在文件的末尾(比如日志文件),那可能需要翻过成千上万行的文本才能到最后的内容。好在Linux有解决这两个问题的专用命令。

tail 命令

tail 命令会显示文件最后几行的内容(文件的“尾部”)。默认情况下,它会显示文件的末尾10行。

可以向 tail 命令中加入 -n 参数来修改所显示的行数。

-f 参数是 tail 命令的一个突出特性。它允许你在其他进程使用该文件时查看文件的内容。tail 命令会保持活动状态,并不断显示添加到文件中的内容。这是实时监测系统日志的绝妙方式。

head 命令

head 命令,顾名思义,会显示文件开头那些行的内容。默认情况下,它会显示文件前10行的文本:

类似于 tail 命令,它也支持 -n 参数,这样就可以指定想要显示的内容了。这两个命令都允许你在破折号后面输入想要显示的行数:

文件的开头通常不会改变,因此 head 命令并像 tail 命令那样支持 -f 参数特性。 head 命令是一种查看文件起始部分内容的便捷方法