本文主要是介绍Linux命令行-第3章@暗恋bash shell命令④目录处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Linux命令行-第3章@暗恋bash shell命令④目录处理
- 第 3章 基本的bash shell命令
- 3.7 处理目录
- 3.7.1 创建目录
- 3.7.2 删除目录
- 3.8 查看文件内容
- 3.8.1 查看文件类型
- 3.8.2 查看整个文件
- 3.8.3 查看部分文件
- 3.9 小结
第 3章 基本的bash shell命令
本章内容
使用shell
bash手册
浏览文件系统
文件和目录列表
管理文件和目录
查看文件内容
例如bash手册、tab键自动补全以及显示文件内容,带你逐步了解怎样用bash shell提供的多数Linux发行版的默认shell都是GNU bash shell①。本章将介绍bash shell的一些基本特性,基本命令来操作Linux文件和目录。如果你已经熟悉了Linux环境中的这些基本操作,可以直接跳过本章,从第4章开始了解更多的高级命令。
3.7 处理目录
在Linux中,有些命令(比如cp命令)对文件和目录都有效,而有些只对目录有效。创建新目录需要使用本节讲到的一个特殊命令。删除目录也很有意思,本节也会讲到。
3.7.1 创建目录
在Linux中创建目录很简单,用mkdir命令即可:
$ mkdir New_Dir
$ ls -ld New_Dir
drwxrwxr-x 2 christine christine 4096 May 22 09:48 New_Dir $
系统创建了一个名为New_Dir的新目录。注意,新目录长列表是以d开头的。这表示New_Dir并不是文件,而是一个目录。
可以根据需要批量地创建目录和子目录。但是,如果你想单单靠mkdir命令来实现,就会得到下面的错误消息:
$ mkdir New_Dir/Sub_Dir/Under_Dir
mkdir: cannot create directory 'New_Dir/Sub_Dir/Under_Dir': No such file or directory
$
要想同时创建多个目录和子目录,需要加入-p参数:
$ mkdir -p New_Dir/Sub_Dir/Under_Dir $
$ ls -R New_Dir
New_Dir:
Sub_Dir
New_Dir/Sub_Dir:
Under_Dir New_Dir/Sub_Dir/Under_Dir: $
mkdir命令的-p参数可以根据需要创建缺失的父目录。父目录是包含目录树中下一级目录的目录。
当然,完事之后,你得知道怎么样删除目录,尤其是在把目录建错地方的时候。
3.7.2 删除目录
删除目录之所以很棘手,是有原因的。删除目录时,很有可能会发生一些不好的事情。shell会尽可能防止我们捅娄子。删除目录的基本命令是rmdir。
$ touch New_Dir/my_file $ ls -li New_Dir/
total 0
294561 -rw-rw-r-- 1 christine christine 0 May 22 09:52 my_file $
$ rmdir New_Dir
rmdir: failed to remove 'New_Dir': Directory not empty
$
默认情况下,rmdir命令只删除空目录。因为我们在New_Dir目录下创建了一个文件my_file,所以rmdir命令拒绝删除目录。
要解决这一问题,得先把目录中的文件删掉,然后才能在空目录上使用rmdir命令。
$ rm -i New_Dir/my_file
rm: remove regular empty file 'New_Dir/my_file'? y
$
$ rmdir New_Dir
$
$ ls -ld New_Dir
ls: cannot access New_Dir: No such file or directory
rmdir并没有-i选项来询问是否要删除目录。这也是为什么说rmdir只能删除空目录还是有好处的原因。
也可以在整个非空目录上使用rm命令。使用-r选项使得命令可以向下进入目录,删除其中的文件,然后再删除目录本身。
$ ls -l My_Dir
total 0
-rw-rw-r-- 1 christine christine 0 May 22 10:02 another_file $
$ rm -ri My_Dir
rm: descend into directory 'My_Dir'? y
rm: remove regular empty file 'My_Dir/another_file'? y
rm: remove directory 'My_Dir'? y
$
$ ls -l My_Dir
ls: cannot access My_Dir: No such file or directory
$
这种方法同样可以向下进入多个子目录,当需要删除大量目录和文件时,这一点尤为有效。
$ ls -FR Small_Dir
Small_Dir:
a_file b_file c_file Teeny_Dir/ Tiny_Dir/
Small_Dir/Teeny_Dir: e_file
Small_Dir/Tiny_Dir:
d_file
$
$ rm -ir Small_Dir
rm: descend into directory 'Small_Dir'? y
rm: remove regular empty file 'Small_Dir/a_file'? y rm: descend into directory 'Small_Dir/Tiny_Dir'? y
rm: remove regular empty file 'Small_Dir/Tiny_Dir/d_file'? y
rm: remove directory 'Small_Dir/Tiny_Dir'? y
rm: descend into directory 'Small_Dir/Teeny_Dir'? y
rm: remove regular empty file 'Small_Dir/Teeny_Dir/e_file'? y rm: remove directory 'Small_Dir/Teeny_Dir'? y
rm: remove regular empty file 'Small_Dir/c_file'? y
rm: remove regular empty file 'Small_Dir/b_file'? y
rm: remove directory 'Small_Dir'? y
$
$ ls -FR Small_Dir
ls: cannot access Small_Dir: No such file or directory
$
这种方法虽然可行,但很难用。注意,你依然要确认每个文件是否要被删除。如果该目录有很多个文件和子目录,这将非常琐碎。
说明 对rm命令而言,-r参数和-R参数的效果是一样的。-R参数同样可以递归地删除目录中的
文件。shell命令很少会就相同的功能采用不同大小写的参数。
一口气删除目录及其所有内容的终极大法就是使用带有-r参数和-f参数的rm命令。
$ tree Small_Dir
Small_Dir
├─ a_file
├─ b_file
├─ c_file
├─ Teeny_Dir
│ └─ e_file
└─ Tiny_Dir └─ d_file 2 directories, 5 files
$
$ rm -rf Small_Dir
$
$ tree Small_Dir
Small_Dir [error opening dir]
0 directories, 0 files $
rm -rf命令既没有警告信息,也没有声音提示。这肯定是一个危险的工具,尤其是在拥有超级用户权限的时候。务必谨慎使用,请再三检查你所要进行的操作是否符合预期。
说明 在上面的例子中,我们使用了tree工具。它能够以一种美观的方式展示目录、子目录及其中的文件。如果需要了解目录结构,尤其是在删除目录之前,这款工具正好能派上用场。不过它可能并没有默认安装在你所使用的Linux发行版中。请参阅第9章,学习如何安装软件。
在前面几节中,你看到了如何管理文件和目录。到此为止,除了如何查看文件内容,我们已经讲述了你所需要的有关文件的全部知识。
3.8 查看文件内容
Linux中有几个命令可以查看文件的内容,而不需要调用其他文本编辑器(参见第10章)。本节将演示一些可以帮助查看文件内容的命令。
3.8.1 查看文件类型
在显示文件内容之前,应该先了解一下文件的类型。如果打开了一个二进制文件,你会在屏幕上看到各种乱码,甚至会把你的终端仿真器挂起。
file命令是一个随手可得的便捷工具。它能够探测文件的内部,并决定文件是什么类型的:
$ file my_file
my_file: ASCII text $
上面例子中的文件是一个text(文本)文件。file命令不仅能确定文件中包含的文本信息,还能确定该文本文件的字符编码,ASCII。
下面例子中的文件就是一个目录。因此,以后可以使用file命令作为另一种区分目录的方法:
$ file New_Dir
New_Dir: directory $
第三个file命令的例子中展示了一个类型为符号链接的文件。注意,file命令甚至能够告诉你它链接到了哪个文件上:
$ file sl_data_file
sl_data_file: symbolic link to 'data_file' $
下面的例子展示了file命令对脚本文件的返回结果。尽管这个文件是ASCII text,但因为它是一个脚本文件,所以可以在系统上执行(运行):
$ file my_script
my_script: Bourne-Again shell script, ASCII text executable $
最后一个例子是二进制可执行程序。file命令能够确定该程序编译时所面向的平台以及需要何种类型的库。如果你有从未知源处获得的二进制文件,这会是个非常有用的特性:
$ file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24,
[...]
$
现在你已经学会了如何快速查看文件类型,接着就可以开始学习文件的显示与浏览了。
3.8.2 查看整个文件
如果手头有一个很大的文本文件,你可能会想看看里面是什么内容。在Linux上有3个不同的命令可以完成这个任务。
1. cat命令
cat命令是显示文本文件中所有数据的得力工具。
$ cat test1 hello
This is a test file.
That we'll use to test the cat command. $
没什么特别的,就是文本文件的内容而已。这里还有一些可以和cat命令一起用的参数,可能对你有所帮助。
-n参数会给所有的行加上行号。
$ cat -n test1 1 hello 2 3 This is a test file. 4 5 6 That we'll use to test the cat command. $
这个功能在检查脚本时很有用。如果只想给有文本的行加上行号,可以用-b参数。
9
$ cat -b test1 1 hello
2 This is a test file.
10 11 12 13 14
3 That we’ll use to test the cat command. $
最后,如果不想让制表符出现,可以用-T参数。
$ cat -T test1 hello
This is a test file. That we'll use to^Itest the cat command. $
-T参数会用^I字符组合去替换文中的所有制表符。
对大型文件来说,cat命令有点繁琐。文件的文本会在显示器上一晃而过。好在有一个简单办法可以解决这个问题。
2. more命令
cat命令的主要缺陷是:一旦运行,你就无法控制后面的操作。为了解决这个问题,开发人员编写了more命令。more命令会显示文本文件的内容,但会在显示每页数据之后停下来。我们输入命令more /etc/bash.bashrc生成如图3-3中所显示的内容。
图3-3 使用more命令显示文本文件
注意图3-3中屏幕的底部,more命令显示了一个标签,其表明你仍然在more程序中以及你现在在这个文本文件中的位置。这是more命令的提示符。
more命令是分页工具。在本章前面的内容里,当使用man命令时,分页工具会显示所选的bash手册页面。和在手册页中前后移动一样,你可以通过按空格键或回车键以逐行向前的方式浏览文本文件。浏览完之后,按q键退出。
more命令只支持文本文件中的基本移动。如果要更多高级功能,可以试试less命令。
3. less命令
从名字上看,它并不像more命令那样高级。但是,less命令的命名实际上是个文字游戏(从俗语“less is more”得来),它实为more命令的升级版。它提供了一些极为实用的特性,能够实现在文本文件中前后翻动,而且还有一些高级搜索功能。
less命令的操作和more命令基本一样,一次显示一屏的文件文本。除了支持和more命令相同的命令集,它还包括更多的选项。
窍门 要想查看less命令所有的可用选项,可以输入man less浏览对应的手册页。也可以这样
查看more命令选项的参考资料。
其中一组特性就是less命令能够识别上下键以及上下翻页键(假设你的终端配置正确)。在查看文件内容时,这给了你全面的控制权。
3.8.3 查看部分文件
通常你要查看的数据要么在文本文件的开头,要么在文本文件的末尾。如果这些数据是在大型文件的起始部分,那你就得等cat或more加载完整个文件之后才能看到。如果数据是在文件的末尾(比如日志文件),那可能需要翻过成千上万行的文本才能到最后的内容。好在Linux有解决这两个问题的专用命令。
1. tail命令
tail命令会显示文件最后几行的内容(文件的“尾部”)。默认情况下,它会显示文件的末尾10行。
出于演示的目的,我们创建了一个包含20行文本的文本文件。使用cat命令显示该文件的全部内容如下:
$ cat log_file
line1
line2
line3
line4
line5
Hello World - line 6
line7
line8
line9
line10
line11
Hello again - line 12 line13
line14
line15
Sweet - line16
line17
line18
line19
Last line - line20
$
现在你已经看到了整个文件,可以再看看使用tail命令浏览文件最后10行的效果:
$ tail log_file
line11
Hello again - line 12 line13
line14
line15
Sweet - line16
line17
line18
line19
Last line - line20 $
可以向tail命令中加入-n参数来修改所显示的行数。在下面的例子中,通过加入-n 2使tail命令只显示文件的最后两行:
$ tail -n 2 log_file line19
Last line - line20
$
-f参数是tail命令的一个突出特性。它允许你在其他进程使用该文件时查看文件的内容。tail命令会保持活动状态,并不断显示添加到文件中的内容。这是实时监测系统日志的绝妙方式。
2. head命令
head命令,顾名思义,会显示文件开头那些行的内容。默认情况下,它会显示文件前10行的文本:
$ head log_file
line1
line2
line3
line4
line5
Hello World - line 6 line7
line8
line9
line10
$
类似于tail命令,它也支持-n参数,这样就可以指定想要显示的内容了。这两个命令都允许你在破折号后面输入想要显示的行数:
$ head -5 log_file line1
line2
line3
line4
line5
$
文件的开头通常不会改变,因此head命令并像tail命令那样支持-f参数特性。head命令是一种查看文件起始部分内容的便捷方法。
3.9 小结
本章涵盖了在shell提示符下操作Linux文件系统的基础知识。一开始我们讨论了bash shell,之后介绍了怎样和shell交互。命令行界面(CLI)采用提示符来表明你可以输入命令。bash shell提供了很多可用以创建和操作文件的工具。在开始操作文件之前,很有必要先了解一下Linux怎么存储文件。本章讨论了Linux虚拟目录的基础知识,然后展示了Linux如何引用存储设备。在描述了Linux文件系统之后,还带你逐步了解了如何使用cd命令在虚拟目录里切换目录。
在介绍如何进入指定目录后,我们又演示了怎样用ls命令列出目录中的文件和子目录。ls命令有很多参数可用来定制输出内容。可以通过ls命令获得有关文件和目录的信息。
touch命令非常有用,可以创建空文件和变更已有文件的访问时间或修改时间。本章还介绍了如何使用cp命令将已有文件复制到其他位置。另外还逐步介绍了如何链接文件,给出了一种简单的方法可以实现在两个位置上拥有同一个文件且不用生成单独的副本。ln命令提供了这种链接功能。
接着我们讲了怎样用mv命令重命名文件(在Linux中称为移动文件),以及如何用rm命令删除文件(在Linux中称为移除文件),还介绍了怎样用mkdir和rmdir命令对目录执行相同的任务。
最后,本章以如何查看文件的内容作结。cat、more和less命令可以非常方便地查看文件全部内容,而且tail和head命令还可查看文件中的一小部分内容。
下章将继续讨论bash shell的命令,并了解更多管理Linux系统时经常用到的高级系统管理命令。
这篇关于Linux命令行-第3章@暗恋bash shell命令④目录处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!