bash shell基础命令

bash shell基础命令

很多Linux发行版的默认shell是GNU bash shell。

1. 启动shell

GNU bash shell是一个程序,提供了对Linux系统的交互式访问。它是作为普通程序运行的,通常是在用户登录终端时启动。系统启动的shell程序取决于用户账户的配置。

/etc/passwd文件包含了所有系统用户账户以及每个用户的基本配置信息。

下面是从/etc/passwd文件中摘取的样例条目:

www:x:1000:1000::/home/www:/bin/bash

每个条目包含7个数据字段,字段之间用冒号分隔。系统使用字段中的数据来赋予用户账户某些特性。

将注意力放在最后一个字段上,该字段指定了用户使用的shell程序。在/etc/passwd样例条目中,用户www将/bin/bash作为自己的默认shell程序。这意味着在christine登录Linux系统后,GNU bash shell会自行启动。

2. 使用shell提示符

启动终端仿真器包或登录Linux虚拟控制台之后会看到shell CLI提示符。提示符是进入shell世界的大门。

默认的bash shell提示符是美元符号($),这个符号表明shell在等待用户输入命令。不同的Linux发行版会采用不同格式的提示符。

CentOS Linux系统的shell提示符是这样的:

[www@0x1e61 ~]$

除了作为shell的入口,提示符还能提供额外的辅助信息。在上面的例子中,提示符中显示了当前用户名www。除此之外,还包括CentOS系统的主机名0x1e61。

3. 与bash手册交互

大多数Linux发行版自带在线手册,可用于查找shell命令以及其他GNU实用工具的相关信息。熟悉手册对于使用各种Linux工具大有裨益,尤其是当你想要弄清各种命令行参数的时候。

man命令可以访问Linux系统的手册页。在man命令之后跟上想要查看的命令名,就可以显示相应的手册页。

输入命令man hostname即可进入下面页面。

注意图中hostname命令的DESCRIPTION一节。这部分内容松散,字里行间充满了技术术语。bash手册并不是按部就班的学习指南,而是作为快速参考来使用的。

4. 浏览文件系统

4.1. Linux文件系统

Linux会将文件存储在名为虚拟目录(virtual directory)的单个目录结构中。虚拟目录会将计算机中所有存储设备的文件路径都纳入单个目录结构。

Linux虚拟目录结构只包含一个称为根(root)目录的基础目录。

提示 Linux使用正斜线(/)而不是反斜线(\)来分隔文件路径中的目录。反斜线在Linux中用作转义字符,如果误用在文件路径中会造成各种各样的问题。

Linux虚拟目录中比较复杂的部分是它如何来协调管理各个存储设备。我们称在Linux系统中安装的第一块硬盘为根驱动器。根驱动器包含了虚拟目录的核心,其他目录都是从那里开始构建的。

Linux会使用根驱动器上一些特别的目录作为挂载点(mount point)挂载点是虚拟目录中分配给额外存储设备的目录。Linux会让文件和目录出现在这些挂载点目录中,即便它们位于其他物理驱动器中。

系统文件通常存储在根驱动器中,而用户文件则存储在其他驱动器中

图中展示了计算机中的两块硬盘。一块硬盘(Disk 1)与虚拟目录的根目录关联,其他硬盘可以挂载到虚拟目录结构中的任何地方。在这个例子中,另一块硬盘(Disk 2)被挂载到了/home,这是用户主目录所在的位置。

Linux文件系统结构演进自Unix文件系统。在Linux文件系统中,采用通用的目录名表示一些常见的功能。

目录
/bin 存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里。
/etc 存放系统管理和配置文件
/home 存放所有用户文件的根目录,是用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示
/usr 用于存放系统应用程序,比较重要的目录/usr/local 本地系统管理员软件安装目录(安装系统级的应用)。这是最庞大的目录,要用到的应用程序和文件几乎都在这个目录。
/usr/x11r6 存放x window的目录
/usr/bin 众多的应用程序
/usr/sbin 超级用户的一些管理程序
/usr/doc linux文档
/usr/include linux下开发和编译应用程序所需要的头文件
/usr/lib 常用的动态链接库和软件包的配置文件
/usr/man 帮助文档
/usr/src 源代码,linux内核的源代码就放在/usr/src/linux里
/usr/local/bin 本地增加的命令
/usr/local/lib 本地增加的库
/opt 额外安装的可选应用程序包所放置的位置。一般情况下,我们可以把tomcat等都安装到这里。
/proc 虚拟文件系统目录,是系统内存的映射。可直接访问这个目录来获取系统信息。
/root 超级用户(系统管理员)的主目录(特权阶级o
/sbin 存放二进制可执行文件,只有root才能访问。这里存放的是系统管理员使用的系统级别的管理命令和程序。如ifconfig等。
/dev 用于存放设备文件。
/mnt 系统管理员安装临时文件系统的安装点,系统提供这个目录是让用户临时挂载其他的文件系统。
/boot 存放用于系统引导时使用的各种文件
/lib 存放跟文件系统中的程序运行所需要的共享库及内核模块。共享库又叫动态链接共享库,作用类似windows里的.dll文件,存放了根文件系统程序运行所需的共享文件。
/tmp 用于存放各种临时文件,是公用的临时文件存储点。
/var 用于存放运行时需要改变数据的文件,也是某些大文件的溢出区,比方说各种服务的日志文件(系统启动日志等。)等。
/lost+found 这个目录平时是空的,系统非正常关机而留下“无家可归”的文件(windows下叫什么.chk)就在这里

常见的Linux目录名均基于文件系统层级标准(filesystem hierarchy standard,FHS)。很多Linux发行版遵循了FHS。这样一来,你就能够在任何兼容FHS的Linux系统中轻而易举地查找文件。

注意 FHS偶尔会更新。你可能会发现有些Linux发行版仍在使用旧的FHS标准,而另一些发行版则只实现了部分当前标准。要想保持与FHS标准同步,请访问其官方主页。

当你登录系统并获得shell CLI提示符后,shell会话会从你的主目录开始。主目录是分配给用户账户的一个特有目录。在创建用户账户时,系统通常会为其分配主目录

可以使用图形界面在虚拟目录中跳转。要想在CLI提示符下切换虚拟目录,需要使用cd命令

4.2. 遍历目录

在Linux文件系统中,可以使用目录切换(cd)命令来将shell会话切换到另一个目录。cd命令的语法非常简单:

cd destination

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

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

4.2.1. 绝对路径

用户可以在虚拟目录中采用绝对路径来引用目录名。

绝对路径定义了在虚拟目录结构中,该目录从根目录开始的确切位置,相当于目录的全名。

绝对路径总是以正斜线(/)作为起始,以指明虚拟文件系统的根目录。因此,如果要指向usr目录所包含的子目录bin,可以写成下面这样:

/usr/bin

绝对路径可以清晰明确地表明用户想切换到的确切位置。要用绝对路径来到达文件系统中的某个特定位置,用户只需在cd命令后指定完整的路径名即可:

[root@0x1e61 ~]# cd /usr/bin/
[root@0x1e61 bin]# 

注意,在上面的例子中,提示符开头有一个波浪号(~)。在切换到另一个目录之后,这个波浪号被bin替代了。CLI提示符正是用它来帮助你跟踪当前所在虚拟目录结构中的位置。波浪号表明shell会话当前位于你的主目录中。离开主目录之后,提示符中的目录也会随之发生变化(如果提示符已经进行了相关配置的话)。

注意 如果你的shell CLI提示符中没有显示shell会话的当前位置,那是因为没有进行相关的配置。

如果尚未配置提示符来显示当前shell会话的绝对路径,也可以使用shell命令来显示所处的位置。pwd命令可以显示出shell会话的当前目录,该目录被称为当前工作目录。pwd命令的用法如下。

[root@0x1e61 bin]# pwd
/usr/bin
[root@0x1e61 bin]# 

4.2.2. 相对路径

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

假如你位于home目录中,希望切换到Documents子目录,那么可以使用cd命令配合相对路径

[root@0x1e61 ~]# pwd
/root
[root@0x1e61 ~]# cd tool/
[root@0x1e61 tool]# pwd
/root/tool
[root@0x1e61 tool]# 

提示 可以在任何包含子目录的目录中使用带有相对路径的cd命令,也可以使用特殊字符来表示相对目录位置。

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

​ 单点号(.),表示当前目录;

​ 双点号(..),表示当前目录的父目录。

4.3 列出文件和目录

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

4.3.1 显示基本列表

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

[root@0x1e61 ~]# ls
Dockerfile  testfile  tool

注意,ls命令输出的列表是按字母排序的(按列而不是按行排序)。

基本的ls命令多少有些误导人。它显示了当前目录下的文件和子目录,但不是全部。

Linux经常使用隐藏文件来保存配置信息。在Linux中,隐藏文件通常是文件名以点号(.)开始的文件。这些文件并不会在ls命令的默认输出中出现。因此,我们称其为隐藏文件。

要想显示隐藏文件,可以使用-a选项。下面的例子是添加了-a选项的ls命令的输出:

[root@0x1e61 ~]# ls -a
.              .bash_logout   .cache   .docker     .pip              .python_history  testfile
..             .bash_profile  .config  Dockerfile  .pki              .ssh             tool
.bash_history  .bashrc        .cshrc   .local      .pydistutils.cfg  .tcshrc          .viminfo

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

-R是ls命令的另一个选项,称作递归选项,可以列出当前目录所包含的子目录中的文件。如果子目录数量众多,则输出结果会很长。这里有个-R选项输出的简单例子。-F选项用于帮助你分辨文件类型:

[root@0x1e61 ~]# ls -F -R
.:
Dockerfile  testfile/  tool/

./testfile:

./tool:
17863/  sqlmap/

./tool/17863:

注意,-R选项不仅显示了当前目录下的内容(也就是先前例子中用户主目录下的那些文件),还显示了用户主目录下所有子目录及其内容

提示 选项并不是非得像例子中那样分开输入:ls –F –R。可以将其合并:ls –FR。

4.3.2 显示长列表

在基本的输出列表中,ls命令并未显示关于每个文件的太多信息。要显示更多信息,另一个常用的选项是-l。-l选项会产生长列表格式的输出,提供目录中各个文件的详细信息:

[root@0x1e61 ~]# ls -l
total 12
-rw-r--r-- 1 root root   92 Apr  5 13:12 Dockerfile
drwxr-xr-x 2 root root 4096 Apr  5 12:50 testfile
drwxr-xr-x 4 root root 4096 Mar 17 08:42 tool

在长列表格式输出中,每一行会列出一个文件或目录。除了文件名,输出中还包括其他有用信息。

输出的第一行显示了为该目录中的文件所分配的总块数(8)。此后的每一行都包含了关于文件(或目录)的下列信息。

​ 文件类型,比如目录(d)、文件(-)、链接文件(l)、字符设备(c)或块设备(b)

​ 文件的权限

​ 文件的硬链接数

​ 文件属主

​ 文件属组

​ 文件大小(以字节为单位)

​ 文件的上次修改时间·文件名或目录名

提示 如果想查看单个文件的长列表,那么只需在ls -l命令之后跟上该文件名即可。但如果想查看目录的相关信息,而非目录所包含的内容,则除了-l选项之外,还得添加-d选项,即ls -ld Directory-Name。

4.3.3 过滤输出列表

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

过滤器就是一个字符串,可用作简单的文本匹配。你可以将其作为命令行参数,放置在选项之后使用:

[root@0x1e61 ~]# ls -l Dockerfile 
-rw-r--r-- 1 root root 92 Apr  5 13:12 Dockerfile

当指定特定的文件名作为过滤器时,ls命令只会显示该文件的信息。有时你可能不知道要找的那个文件的确切名称。

ls命令也能识别标准通配符(wildcard),并在过滤器中用其来进行模式匹配:

​ 问号(?)代表任意单个字符;

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

[root@0x1e61 /]# ls -l ?in
lrwxrwxrwx. 1 root root 7 Jan  9 20:46 bin -> usr/bin
[root@0x1e61 ~]# ls -l t*1
-rw-r--r-- 1 root root 0 Apr  8 23:39 test-1

在过滤器中使用星号和问号被称作通配符匹配(globbing,是指使用通配符进行模式匹配的过程。通配符正式的名称叫作元字符通配符(metacharacter wildcard)。除了星号和问号,还有更多的元字符通配符可做文件匹配之用。也可以试试方括号:

[root@0x1e61 ~]# ls -l t[eb]st-1
-rw-r--r-- 1 root root 0 Apr  8 23:39 test-1
[root@0x1e61 ~]# ls -l test-[123]
-rw-r--r-- 1 root root 0 Apr  8 23:39 test-1
-rw-r--r-- 1 root root 0 Apr  8 23:39 test-2
-rw-r--r-- 1 root root 0 Apr  8 23:39 test-3

方括号代表单个字符位置并给出了该位置上的多个可能的选择。

也可以像上面那样将可能的字符逐一列出,也可以指定字符范围,比如字母范围[a–z]:

[root@0x1e61 ~]# ls -l [a-z]*-*
-rw-r--r-- 1 root root 0 Apr  8 23:39 test-1
-rw-r--r-- 1 root root 0 Apr  8 23:39 test-2
-rw-r--r-- 1 root root 0 Apr  8 23:39 test-3

还可以使用惊叹号(!)将不需要的内容排除在外:

[root@0x1e61 ~]# ls -l test-[!1]
-rw-r--r-- 1 root root 0 Apr  8 23:39 test-2
-rw-r--r-- 1 root root 0 Apr  8 23:39 test-3

5. 处理文件

5.1 创建文件

使用touch命令轻松创建空文件:

[root@0x1e61 ~]# touch test_1
[root@0x1e61 ~]# ls -l test_1
-rw-r--r-- 1 root root 0 Apr  8 23:46 test

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

touch命令还可用来改变文件的修改时间。该操作不会改变文件内容:

[root@0x1e61 ~]# ls -l test_1 
-rw-r--r-- 1 root root 0 Apr  8 23:46 test_1
[root@0x1e61 ~]# touch test_1
[root@0x1e61 ~]# ls -l test_1 
-rw-r--r-- 1 root root 0 Apr  8 23:48 test_1

test_1 的修改时间从原先的23:46被更新为23:48。

5.2 复制文件

将文件和目录从文件系统的一个位置复制到另一个位置可谓是系统管理员的日常操作。cp命令就可以完成这项任务。

cp命令最基本的用法需要两个参数,即源对象和目标对象:cp source destination。

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

新文件在形式上就像全新的文件一样,有新的修改时间:

[root@0x1e61 ~]# cp test_1 test_2
[root@0x1e61 ~]# ls -l test_*
-rw-r--r-- 1 root root 0 Apr  8 23:48 test_1
-rw-r--r-- 1 root root 0 Apr  8 23:50 test_2

新文件test_two和文件test_one的修改时间并不一样。如果目标文件已经存在,则cp命令可能并不会提醒你这一点。

最好加上-i选项,强制shell询问是否需要覆盖已有文件

[root@0x1e61 ~]# ls -l test_*
-rw-r--r-- 1 root root 0 Apr  8 23:48 test_1
-rw-r--r-- 1 root root 0 Apr  8 23:50 test_2
[root@0x1e61 ~]# cp -i test_1 test_2
cp: overwrite ‘test_2’? n

如果不回答y,则停止文件复制。也可以将文件复制到现有目录中:

[root@0x1e61 ~]# cp -i test_1 a/b/
[root@0x1e61 ~]# ls -l a/b/
total 0
-rw-r--r-- 1 root root 0 Apr  8 23:56 test_1

新文件现在位于b目录中,文件名和原先一样。

注意 先前的例子在目标目录名尾部加上了一个正斜线(/)。这表明 b 是一个目录而非文件。这有助于表明目的,而且在复制单个文件时非常重要。如果没有使用正斜线,同时子目录 b 又不存在,就会产生麻烦。在这种情况下,试图将一个文件复制到 子目录反而会创建名为 test 的文件,更是连错误消息都不会有。因此,记得在目标目录名尾部加上正斜线。

cp命令的-R选项威力强大。可以用它在单个命令中递归地复制整个目录的内容:

[root@0x1e61 ~]# cp -R a/ test
[root@0x1e61 ~]# ls -l test
total 4
drwxr-xr-x 3 root root 4096 Apr  9 08:44 a
-rw-r--r-- 1 root root    0 Apr  8 23:53 test_1

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

5.3 使用命令行补全

命令行补全(也称为制表键补全。制表键补全允许你在输入文件名或目录名的时候,按一下制表键,让shell帮你将内容补充完整

5.4 链接文件

链接文件是Linux文件系统的一个优势。如果需要在系统中维护同一文件的两个或多个副本,可以使用单个物理副本加多个虚拟副本(链接)的方法代替创建多个物理副本。链接是目录中指向文件真实位置的占位符

在Linux中有两种类型的文件链接。

​ 符号链接

​ 硬链接

符号链接(也称为软链接)是一个实实在在的文件,该文件指向存放在虚拟目录结构中某个地方的另一个文件。这两个以符号方式链接在一起的文件彼此的内容并不相同。

要为一个文件创建符号链接,原始文件必须事先存在。然后可以使用ln命令以及-s选项来创建符号链接:

[root@0x1e61 ~]# ls -l test_1
-rw-r--r-- 1 root root 0 Apr  8 23:48 test_1
[root@0x1e61 ~]# 
[root@0x1e61 ~]# ln -s test_1 test_4
[root@0x1e61 ~]# ls -l test_[14]
-rw-r--r-- 1 root root 0 Apr  8 23:48 test_1
lrwxrwxrwx 1 root root 6 Apr  9 08:57 test_4 -> test_1

在上面的例子中,注意符号链接文件名 test_4 位于ln命令的第二个参数的位置。长列表(ls -l)中显示的符号文件名后的->符号表明该文件是链接到文件 test_1 的一个符号链接。

另外,还要注意符号链接文件与数据文件的文件大小。符号链接文件 test_4 只有6个字节,而test_1 有0个字节。这是因为 test_4 仅仅只是指向 test_1 而已。它们的内容并不相同,是两个完全不同的文件。

另一种证明链接文件是一个独立文件的方法是查看inode编号。文件或目录的inode编号是内核分配给文件系统中的每一个对象的唯一标识。要查看文件或目录的inode编号,可以使用ls命令的-i选项:

[root@0x1e61 ~]# ls -i test_[14]
394130 test_1  394136 test_4

硬链接创建的是一个独立的虚拟文件,其中包含了原始文件的信息以及位置。但是两者就根本而言是同一个文件。要想创建硬链接,原始文件也必须事先存在,只不过这次使用ln命令时不需要再加入额外的选项了:

[root@0x1e61 ~]# ls -l test_1
-rw-r--r-- 1 root root 0 Apr  8 23:48 test_1
[root@0x1e61 ~]# ln test_1 test_5
[root@0x1e61 ~]# ls -li test_[15]
394130 -rw-r--r-- 2 root root 0 Apr  8 23:48 test_1
394130 -rw-r--r-- 2 root root 0 Apr  8 23:48 test_5

注意,以硬链接相连的文件共享同一个inode编号。这是因为两者其实就是同一个文件。另外,彼此的文件大小也一模一样。

只能对处于同一存储设备的文件创建硬链接。要想在位于不同存储设备的文件之间创建链接,只能使用符号链接。也就是说,硬链接不能跨文件系统,而符号链接可以跨文件系统。

硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。

5.5 文件重命名

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

[root@0x1e61 ~]# ls -li test_?
394130 -rw-r--r-- 2 root root 0 Apr  8 23:48 test_1
394131 -rw-r--r-- 1 root root 0 Apr  8 23:50 test_2
394136 lrwxrwxrwx 1 root root 6 Apr  9 08:57 test_4 -> test_1
394130 -rw-r--r-- 2 root root 0 Apr  8 23:48 test_5
[root@0x1e61 ~]# 
[root@0x1e61 ~]# mv test_5 test_6
[root@0x1e61 ~]# ls -li test_?
394130 -rw-r--r-- 2 root root 0 Apr  8 23:48 test_1
394131 -rw-r--r-- 1 root root 0 Apr  8 23:50 test_2
394136 lrwxrwxrwx 1 root root 6 Apr  9 08:57 test_4 -> test_1
394130 -rw-r--r-- 2 root root 0 Apr  8 23:48 test_6

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

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

[root@0x1e61 ~]# mv test_6 test/
[root@0x1e61 ~]# ls -l test/
total 4
drwxr-xr-x 3 root root 4096 Apr  9 08:44 a
-rw-r--r-- 1 root root    0 Apr  8 23:53 test_1
-rw-r--r-- 2 root root    0 Apr  8 23:48 test_6

提示 和cp命令类似,你也可以在mv命令中使用-i选项。这样在mv试图覆盖已有的文件时会发出询问。

可以使用mv命令在移动文件的同时进行重命名:

[root@0x1e61 ~]# mv test_2 test/test_7
[root@0x1e61 ~]# ls -l test/
total 4
drwxr-xr-x 3 root root 4096 Apr  9 08:44 a
-rw-r--r-- 1 root root    0 Apr  8 23:53 test_1
-rw-r--r-- 2 root root    0 Apr  8 23:48 test_6
-rw-r--r-- 1 root root    0 Apr  8 23:50 test_7

也可以使用mv命令移动整个目录及其内容:

[root@0x1e61 ~]# ls -l test
total 4
drwxr-xr-x 3 root root 4096 Apr  9 08:44 a
-rw-r--r-- 1 root root    0 Apr  8 23:53 test_1
-rw-r--r-- 2 root root    0 Apr  8 23:48 test_6
-rw-r--r-- 1 root root    0 Apr  8 23:50 test_7
[root@0x1e61 ~]# mv test test2/
[root@0x1e61 ~]# ls -l test
ls: cannot access test: No such file or directory
[root@0x1e61 ~]# ls -l test2
total 4
drwxr-xr-x 3 root root 4096 Apr  9 08:44 a
-rw-r--r-- 1 root root    0 Apr  8 23:53 test_1
-rw-r--r-- 2 root root    0 Apr  8 23:48 test_6
-rw-r--r-- 1 root root    0 Apr  8 23:50 test_7

目录内容没有变化。只有目录名发生了改变。

6. 管理目录

在Linux中,有些命令(比如cp命令)对文件和目录都有效,有些命令则只对目录有效。

6.1 创建目录

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

[root@0x1e61 ~]# mkdir New_dir 
[root@0x1e61 ~]# ls -ld New_dir
drwxr-xr-x 2 root root 4096 Apr  9 09:36 New_dir

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

可以根据需要“批量”地创建目录和子目录。为此,要使用mkdir命令的-p选项:

[root@0x1e61 ~]# mkdir -p New_dir/a/b
[root@0x1e61 ~]# ls -R New_dir/
New_dir/:
a

New_dir/a:
b

New_dir/a/b:
[root@0x1e61 ~]# 

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

6.2 删除目录

删除目录的基本命令是rmdir:

[root@0x1e61 ~]# rmdir New_dir/a/

rmdir: failed to remove ‘New_dir/a/’: Directory not empty

在默认情况下,rmdir命令只删除空目录。

要想删除这个目录,需要先把目录中的东西删掉,然后才能在空目录中使用rmdir命令:

[root@0x1e61 ~]# rmdir New_dir/a/b/
[root@0x1e61 ~]# rmdir New_dir/a
[root@0x1e61 ~]# ls -R New_dir/
New_dir/:
[root@0x1e61 ~]# 

rmdir并没有-i选项可以用来询问是否要删除目录。这也是为什么说rmdir只能删除空目录是件好事。

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

[root@0x1e61 ~]# ls -R New_dir/
New_dir/:
a  b

New_dir/a:

New_dir/b:
[root@0x1e61 ~]# rm -ir New_dir/
rm: descend into directory ‘New_dir/’? y
rm: remove directory ‘New_dir/b’? y
rm: remove directory ‘New_dir/a’? y
rm: remove directory ‘New_dir/’? n 
[root@0x1e61 ~]# ls -R New_dir/
New_dir/:

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

[root@0x1e61 ~]# ls -FR New_dir/
New_dir/:
testfile
[root@0x1e61 ~]# rm -iR New_dir/
rm: descend into directory ‘New_dir/’? y
rm: remove regular empty file ‘New_dir/testfile’? y
rm: remove directory ‘New_dir/’? n
[root@0x1e61 ~]# ls -FR New_dir/
New_dir/:
[root@0x1e61 ~]# 

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

可以加 -f 即使原档案属性设为唯读,亦直接删除,无需逐一确认。

注意 对于rm命令,-r选项和-R选项的效果是一样的,都可以递归地删除目录中的文件。shell命令很少会对相同的功能使用大小写不同的选项。一口气删除目录树的最终解决方案是使用rm -rf命令。该命令不声不响,能够直接删除指定目录及其所有内容。当然,这肯定是一个非常危险的命令,所以务必谨慎使用,并再三检查你要进行的操作是否符合预期。

7. 查看文件内容

有几个命令可以直接查看文件的内容,不需要调用其他文本编辑器

7.1 查看文件类型

在显示文件内容之前,应该先了解文件类型。如果你尝试显示二进制文件,那么屏幕上会出现各种乱码,甚至会把你的终端仿真器挂起。

file命令是一个方便的小工具,能够探测文件的内部并判断文件类型:

[root@0x1e61 ~]# file .bashrc 
.bashrc: ASCII text

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

下面例子中的文件就是一个目录。因此,以后可以使用file命令作为另一种区分目录的方法:

[root@0x1e61 ~]# file New_dir
New_dir: directory

第三个file命令的例子中展示的是一个符号链接文件。注意,file命令甚至能够告诉你它链接到了哪个文件:

[root@0x1e61 ~]# file test_1
test_1: symbolic link to `test_2'

最后一个例子是二进制可执行程序。file命令能够确定该程序编译时所面向的平台以及需要何种类型的库。如果有从未知来源处获得的二进制文件,那么这会是一个非常有用的特性:

[root@0x1e61 ~]# file /usr/bin/ls
/usr/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=c8ada1f7095f6b2bb7ddc848e088c2d615c3743e, stripped

7.2 查看整个文件

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

1. cat命令

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

[root@0x1e61 ~]# cat test
hello,world
[root@0x1e61 ~]# 

没什么特别的,就是文本文件的内容而已。

-n选项会给所有的行加上行号:

[root@0x1e61 ~]# cat -n test
     1  hello,world
     2  hello,world
     3  hello,world
     4  hello,world
     5  hello,world
     6
     7

这个功能在检查脚本时会很方便。如果只想给有文本的行加上行号,可以用-b选项:

[root@0x1e61 ~]# cat -nb test
     1  hello,world
     2  hello,world
     3  hello,world
     4  hello,world
     5  hello,world


对大文件来说,cat命令多少有些烦人。文件内容会在屏幕上一闪而过。

2. more命令

cat命令的主要缺点是其开始运行之后你无法控制后续操作。为了解决这个问题,开发人员编写了more命令。

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

注意,在图的屏幕底部,more命令显示了一个标签,说明你仍然处于more应用程序中,以及当前在文本文件中所处的位置。这是more命令的提示符。

more命令是一个分页工具。和在手册页中浏览方法一样,你可以使用空格键向前翻页,或是使用Enter键逐行向前查看。结束之后,按q键退出。more命令只支持文本文件中基本的移动。

3. less命令

less命令还可以在完成整个文件的读取之前显示文件的内容(上下移动查看)。cat命令和more命令则无法做到这一点。less命令的操作和more命令基本一样,一次显示一屏的文件文本。除了支持和more命令相同的命令集,它还包括更多的选项。

提示 less命令能够识别上下箭头键以及上下翻页键(假设你的终端配置正确)。在查看文件内容时,这赋予了你全面的控制权。

7.3 查看部分文件

你要查看的数据经常位于文本文件的开头或末尾。如果数据是在一个大型文件的开头,那就只能干等着cat或more载入整个文件。如果数据是在文件末尾(比如日志文件),则需翻过成千上万行的文本才能看到最后那部分。好在Linux有专门的命令可以解决这两个问题。

1. tail命令

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

作为演示,我们创建一个包含15行文本的文本文件。使用cat命令显示该文件的全部内容如下:

[root@0x1e61 ~]# cat test
hello,world1
h1ello,world2
hello,world3
hello,world4
hello,world5
hello,world6
hello,world7
hello,world8
hello,world9
hello,world10
hello,world10
hello,world10
hello,world10
hello,world10
123

现在可以看看使用tail命令浏览文件最后10行的效果:

[root@0x1e61 ~]# tail test
hello,world6
hello,world7
hello,world8
hello,world9
hello,world10
hello,world10
hello,world10
hello,world10
hello,world10
123

可以向tail命令中加入-n选项来修改所显示的行数。在下面的例子中,通过加入-n 2,使得tail命令只显示文件的最后两行:

[root@0x1e61 ~]# tail -n 2 test
hello,world10
123

tail命令有一个非常酷的特性:-f选项,该选项允许你在其他进程使用此文件时查看文件的内容。tail命令会保持活动状态并持续地显示添加到文件中的内容。这是实时监测系统日志的绝佳方式。

2. head命令

head命令会显示文件开头若干行(文件的“头部”)。在默认情况下,它会显示文件前10行的文本:

[root@0x1e61 ~]# head test
hello,world1
h1ello,world2
hello,world3
hello,world4
hello,world5
hello,world6
hello,world7
hello,world8
hello,world9

与tail命令类似,head命令也支持-n选项,以便指定想要显示的内容。这两个命令也允许简单地在连字符后面直接输入想要显示的行数:

[root@0x1e61 ~]# head -n 3 test
hello,world1
h1ello,world2
hello,world3

文件的开头部分通常不会改变,因此head命令并没有tail命令那样的-f选项。head命令是一种查看文件起始部分内容的便捷方法。

posted @ 2023-04-14 18:18  0x1e61  阅读(49)  评论(0编辑  收藏  举报