3.3 bash手册
表3-3 Linux man 页面格式
节 | 描述 |
Name | 显示命令的名称和简介 |
Synopsis | 显示命令的格式 |
Description | 描述每个命令的选项 |
Author | 提供该命令开发人员的信息 |
Reportting Bugs | 提供提交bug报告的途径 |
Copyright | |
See Also |
3-4 浏览文件系统
3.4.1 Linux 文件系统
目录 | 用途 |
/ | 虚拟目录的根目录,通常不会在这里存储文件 |
/bin | 二进制目录,存放许多GNU用户级的工具 |
/boot | 启动目录,存放启动文件 |
/dev | 设备目录,Linux在这里创建设备节点 |
/etc | 系统配置文件目录 |
/home | 主目录,Linux在这里创建用户目录 |
/lib | 库目录,存放系统和应用程序的库文件 |
/media | 媒体目录,存放可移动媒体设备挂载点的地方 |
/mnt | 挂载目录,另一个存放可移动媒体设备挂载点的地方 |
/opt | 可选目录,通常用于存放可选的软件包 |
/root | 根主目录 |
/sbin | 系统二进制目录,存放许多GNU管理员级工具 |
/tmp | 临时目录,可以在该目录中创建和删除临时工作文件 |
/usr | 用户安装软件的目录 |
/var | 可变目录,用以存放经常变化的文件,比如日志文件 |
1.绝对文件路径
2.相对文件路径
- 单点符(.),表示当前目录;
- 双点符(..),表示当前目录的父目录。
可用多个双点符来向上切换目录。比如用户现在在主目录(/home/jingpan),
想切换到/etc/目录,可以输入如下命令:
[root@localhost jingpan]# cd ../../etc
[root@localhost etc]#
3-5 文件和目录列表
带-F参数的ls命令来轻松的区分文件和目录。使用-F参数可以得到如下输出:
[root@localhost jingpan]# ls -F
awk* centos74.xml ch5/ nginx-1.12.2/ 模板/ 文档/ 桌面/
boot/ centos7.xml c_v/ rpm_check.txt 视频/ 下载/
c/ c_example/ linux_c/ 公共的/ 图片/ 音乐/
-F参数在目录名后加了正斜线(/),以方便用户在输出中分辨它们。类似地,它会在可执行
文件(比如上面的awk文件)的后面加个星号,以便用户找出可在系统上运行的文件。
-R参数是ls命令的另一个参数。它列出了当前目录下包含的目录中的文件。如果有很多个目录
,这个输出会很长。这里有个简单的采用-R参数获得的输出:
[root@localhost test]# ls -F -R
.:
file1 test1/ test2/
./test1:
file1 file2
./test2:
注意,首先-R参数显示了当月前目录下的内容:一个主文件(file1)和两个目录(test1和test2).
然后-R遍历了这两个目录,列出了目录下的主文件。test1目录下有两个文件(file1 和file2),而
test2目录下没有文件。如果 在test1或test2目录下还有更深的子目录,-R参数将会继续遍历
这些目录。如你所见,对于大型目录结构来说,这个输出可能会很长很长。
-u 参数 输出文件最后访问时间而非最后修改时间
[jingpan@localhost linux]$ ls -l test1
-rw-rw-r-- 1 jingpan jingpan 0 1月 30 14:39 test1
[jingpan@localhost linux]$ ls -lu test1
-rw-rw-r-- 1 jingpan jingpan 0 1月 30 14:41 test1
[jingpan@localhost linux]$
最后修改时间为14:39,最后访问时间为14:41
3-6 处理文件
3-6.1 创建文件
touch命令
-a 参数,更改访问时间
[jingpan@localhost linux]$ touch -a test1 [jingpan@localhost linux]$ ls -lu test1 -rw-rw-r-- 1 jingpan jingpan 0 1月 30 14:55 test1
-m 参数,更改修改时间
[jingpan@localhost linux]$ touch -m test1 [jingpan@localhost linux]$ ls -l test1 -rw-rw-r-- 1 jingpan jingpan 0 1月 30 14:57 test1
-t 参数,指定特定时间
[jingpan@localhost linux]$ touch -t 201112251200 test1 [jingpan@localhost linux]$ ls -l 总用量 0 -rw-rw-r-- 1 jingpan jingpan 0 12月 25 2011 test1 [jingpan@localhost linux]$ ls -ul 总用量 0 -rw-rw-r-- 1 jingpan jingpan 0 12月 25 2011 test1
3.6.2 复制文件
cp命令
-R 递归地复制整个目录内容
[jingpan@localhost linux]$ cp -R dir1 dir2^C [jingpan@localhost linux]$ ls -l 总用量 8 drwxrwxr-x 2 jingpan jingpan 4096 1月 30 15:06 dir1 drwxrwxr-x 2 jingpan jingpan 4096 1月 30 15:07 dir2 -rw-rw-r-- 1 jingpan jingpan 0 1月 30 14:57 test1 -rw-rw-r-- 1 jingpan jingpan 0 1月 30 15:00 test2 -rw-rw-r-- 1 jingpan jingpan 0 1月 30 14:57 test3
[jingpan@localhost linux]$ cp -f test* dir2 [jingpan@localhost linux]$ ls -al dir2 总用量 8 drwxrwxr-x 2 jingpan jingpan 4096 1月 30 15:07 . drwxrwxr-x 4 jingpan jingpan 4096 1月 30 15:06 .. -rw-rw-r-- 1 jingpan jingpan 0 1月 30 15:06 file1 -rw-rw-r-- 1 jingpan jingpan 0 1月 30 15:06 file2 -rw-rw-r-- 1 jingpan jingpan 0 1月 30 15:06 file3 -rw-rw-r-- 1 jingpan jingpan 0 1月 30 15:06 file4 -rw-rw-r-- 1 jingpan jingpan 0 1月 30 15:06 file5 -rw-rw-r-- 1 jingpan jingpan 0 1月 30 15:11 test1 -rw-rw-r-- 1 jingpan jingpan 0 1月 30 15:11 test2 -rw-rw-r-- 1 jingpan jingpan 0 1月 30 15:11 test3
-f参数用来强制覆盖dir2目录中已有的test1 文件,而不会提示用户。
3-6.3 链接文件
硬链接会创建一个独立文件,其中包含了源文件的信息以及位置。引用硬链接文件等
同于引用了源文件:
[jingpan@localhost linux]$ cp -l test1 test4 [jingpan@localhost linux]$ ls -il 总用量 8 24642507 drwxrwxr-x 2 jingpan jingpan 4096 1月 30 15:06 dir1 24642513 drwxrwxr-x 2 jingpan jingpan 4096 1月 30 15:07 dir2 24642504 -rw-rw-r-- 2 jingpan jingpan 0 1月 30 14:57 test1 24642505 -rw-rw-r-- 1 jingpan jingpan 0 1月 30 15:00 test2 24642506 -rw-rw-r-- 1 jingpan jingpan 0 1月 30 14:57 test3 24642504 -rw-rw-r-- 2 jingpan jingpan 0 1月 30 14:57 test4
-l参数创建了一个指向文件test1的硬链接test4。在文件列表中可以看出,文件test1
和test4的索引节点号相同的,这表明,实际上它们是同一个文件。还要注意,链接计数
(列表输出的第3列)表明现在两个文件都有两个链接了。
-s 参数会创建一个符号链接,或者称为软链接:
[jingpan@localhost linux]$ cp -s test1 test5 [jingpan@localhost linux]$ ls -il test* 24642504 -rw-rw-r-- 1 jingpan jingpan 11 1月 30 15:33 test1 24642505 -rw-rw-r-- 1 jingpan jingpan 0 1月 30 15:00 test2 24642506 -rw-rw-r-- 1 jingpan jingpan 0 1月 30 14:57 test3 24642496 -rw-rw-r-- 1 jingpan jingpan 0 1月 30 15:35 test4 24642522 lrwxrwxrwx 1 jingpan jingpan 5 1月 30 15:36 test5 -> test1
在复制链接文件时要注意,如果用cp命令来复制一个链接到另一个源文件的文件,那么你复制的其实是源文件的另一份副本,而不是链接文件。
3.6.4 重命令文件
在Linux中,重命令文件称为移动(moving)。mv命令就是将文件和目录移动到另外一个位置的。
[root@localhost test]# ls -il
总用量 0
67334628 -rw-r--r--. 2 root root 0 12月 3 22:16 file1
67334634 -rw-r--r--. 1 root root 0 12月 3 22:23 file2
67334635 -rw-r--r--. 1 root root 0 12月 3 22:16 file3
67334628 -rw-r--r--. 2 root root 0 12月 3 22:16 file4
67334637 lrwxrwxrwx. 1 root root 5 12月 3 22:17 file5 -> file1
[root@localhost test]# mv file2 file6
[root@localhost test]# ls -il file*
67334628 -rw-r--r--. 2 root root 0 12月 3 22:16 file1
67334635 -rw-r--r--. 1 root root 0 12月 3 22:16 file3
67334628 -rw-r--r--. 2 root root 0 12月 3 22:16 file4
67334637 lrwxrwxrwx. 1 root root 5 12月 3 22:17 file5 -> file1
67334634 -rw-r--r--. 1 root root 0 12月 3 22:23 file6
注意,移动文件会改变文件名,但保持同样的索引节点号和时间戳。移动一个有
软链接指向的文件会带来麻烦:
[root@localhost test]# mv file1 file8
[root@localhost test]# ls -il file*
67334635 -rw-r--r--. 1 root root 0 12月 3 22:16 file3
67334628 -rw-r--r--. 2 root root 0 12月 3 22:16 file4
67334637 lrwxrwxrwx. 1 root root 5 12月 3 22:17 file5 -> file1
67334634 -rw-r--r--. 1 root root 0 12月 3 22:23 file6
67334628 -rw-r--r--. 2 root root 0 12月 3 22:16 file8
[root@localhost test]# mv file8 file1
采用硬链接的file4文件依然有同样的索引节点号,这样完全没有问题,但file5文件指向了
一个无效文件,它已不再是一个有效链接。
也可以用mv命令来移动目录
[root@localhost test]# mv dir1 dir2
整个目录里的内容都没有变化。唯一改变的是目录名字。因此,mv命令运行起来比cp命令快很多。
3.6.5 删除文件
rm命令
[root@localhost test]# rm -i file2
rm:是否删除普通空文件 "file2"?y
[root@localhost test]# ls -il
总用量 0
33568491 drwxr-xr-x. 2 root root 71 12月 3 22:41 dir1
101977071 drwxr-xr-x. 2 root root 71 12月 3 22:35 dir2
67334628 -rw-r--r--. 2 root root 0 12月 3 22:29 file1
67334635 -rw-r--r--. 1 root root 0 12月 3 22:16 file3
67334628 -rw-r--r--. 2 root root 0 12月 3 22:29 file4
67334637 lrwxrwxrwx. 1 root root 5 12月 3 22:17 file5 -> file1
注意,命令提示你是不是要真的删除该文件。bash shell 中没有回收站或者垃圾箱,所以文件一旦删除,就无法再找回了。
这里有一段关于删除链接文件的小故事:
[root@localhost test]# rm file1
rm:是否删除普通文件 "file1"?y
[root@localhost test]# cat file4
hello
[root@localhost test]# cat file5
cat: file5: 没有那个文件或目录
[root@localhost test]# ls -il
总用量 4
33568491 drwxr-xr-x. 2 root root 71 12月 3 22:41 dir1
101977071 drwxr-xr-x. 2 root root 71 12月 3 22:35 dir2
67334635 -rw-r--r--. 1 root root 0 12月 3 22:16 file3
67334634 -rw-r--r--. 1 root root 6 12月 6 03:55 file4
67184297 lrwxrwxrwx. 1 root root 5 12月 6 03:55 file5 -> file1
文件file1含有一个指向它的硬链接file4和一个指向它的软链接file5,而它被删除了。注意观
察发生了什么。两个链接文件依然都在,尽管file1文件已经消失了(在支持彩色的终端上能看到
file5文件这时已经变成了红色了)。当你查看硬链接file4文件内容时,它依然显示了文件的内容。
当你查看软件file5文件内容时,bash表明它已经不复存在了。
rm命令的另外一个特性是,如果你要删除很多文件而不想被提示符烦到,可以用-f参数来强制删除。
小心为妙!
3.7 处理目录
3.7.1 创建目录
mkdir命令
3.7.2 删除目录
rmdir和rm命令
删除目录的基本命令是rmdir
[root@localhost test]# mkdir dir3
[root@localhost test]#
[root@localhost test]# rmdir dir3
[root@localhost test]# rmdir dir1
rmdir: 删除 "dir1" 失败: 目录非空
[root@localhost test]# rmdir --ignore-fail-on-non-empty dir1
默认情况下,rmdir命令只删除空目录。在dir1目录中有一个文件,所以rmdir没有删除它。
老朋友rm命令也可以在处理目录上帮我们一把。如果你在用它时不带参数,你可以会有点失望:
[root@localhost test]# rm dir1
rm: 无法删除"dir1": 是一个目录
但如果你真想删除一个目录,可以用-r参数来递归地删除目录中的文件,最后删除目录自身:
[root@localhost test]# rm -r dir2
rm:是否进入目录"dir2"? y
rm:是否删除普通空文件 "dir2/file1"?y
rm:是否删除普通空文件 "dir2/file3"?y
rm:是否删除普通空文件 "dir2/file4"?y
rm:是否删除普通空文件 "dir2/file5"?y
rm:是否删除普通空文件 "dir2/file6"?y
rm:是否删除目录 "dir2"?y
这种方法虽然可行,但很难用。你依然要确认每个文件是否要被删除。如果该目录有很多个文件和子目录,
将会非常琐碎。省心而惯用的终极办法是使用rm命令,并加上参数-r和-f
[root@localhost test]# rm -rf dir2
就这么简单。没有警告,也没有一大堆问题,仅需一个shell提示符。当然,这个方法是非常 危险的,尤其是当你作为root用户登录时;尽量保守地采用这种做法,在使用之前再三检查, 确认你真的要这样做。
3.8 查看文件内容
3.8.1 查看文件统计信息
stat 命令可以提供文件系统上某个文件的所有状态信息:
[root@localhost test]# stat file4
文件:"file4"
大小:6 块:8 IO 块:4096 普通文件
设备:fd00h/64768d Inode:67334634 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:admin_home_t:s0
最近访问:2017-12-06 03:56:32.257023236 +0800
最近更改:2017-12-06 03:55:09.525470604 +0800
最近改动:2017-12-06 03:56:22.264672294 +0800
创建时间:-
stat命令的结果显示了几乎所有你想知道的关于被检查文件的信息,甚至连存储该文件的设备的主设备和次
设备编号都有。
3.8.2 查看文件类型
尽管stat命令提供了几乎所有的信息,但依然有一项重要信息它没提供--文件类型。在尝试打开一个1KB大小的文件之前,了斛一下这个文件是什么类型的也会大有裨益。如果打开了一个二进制文件,你会在屏幕上看到各种乱码,甚至会忠你的终端模拟器扶起。
[root@localhost test]# file file4
file4: ASCII text
[root@localhost test]# file myscript
myscript: Bourne-Again shell script, ASCII text executable
[root@localhost test]# file find
find: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=74b4eaedafaf96ab3244c568dc0c9a90de2cc7d6, stripped
file命令将文件分成3类。
文本文件:包含可打印字符的文件
可执行文件:可在系统上运行的文件
数据文件:包含不可打印二进制字符,又不能在系统上运行的文件。
第一个例子显示了一个文本文件。file命令不光判断出该文件包含文本,还判断出了文本的字
符编码。第二个例子显示了一个文本脚本文件。虽然文件是文本的,却是个脚本文件,可以在
系统上运行。最后一个例子是一个二进制的要执行程序。file命令判断出了文件在编译时面向的
平台,以及它需要哪种类型的库。如果你有从未知源获得的二进制文件,这会是个非常有用的特性。
3.8.3 查看整个文件
如果手头一个很大的文本,你可能会想看看是什么内容。在Linux上有3个不同的命令可以完成这个任务
1.cat命令
cat命令是显示文本文件中所有数据的得力工具:
没什么特别的,只是文本文件的内容。这里还有一些可以和cat命令一起用的参数,可以会对你有所帮助。[root@localhost test]# cat test1 hello This is a test file That we'll use to test the cat command.
-n参数会给所有的行加上行号:这个功能在检查脚本时会很有用。如果你只想给有文本的行加上行号,可以用-b参数:[root@localhost test]# cat -n test1 1 hello 2 3 This is a test file 4 5 6 That we'll use to test the cat command.
[root@localhost test]# cat -b test1 1 hello 2 This is a test file 3 That we'll use to test the cat command.
如果需要将多个空白行压缩到单个空白行,可用-s参数:[root@localhost test]# cat -s test1 hello This is a test file That we'll use to test the cat command.
最后,如果不想让制表符出现,可以-T参数:-T参数会用^I字符组合去替换文本的所有制表符。[root@localhost test]# cat -T test1 hello This is a test file That we'll use to^Itest the cat command.
对于大型文件来说,cat命令会有点烦琐。文件的文本会在显示屏上一晃而过。好在这里有一个
解决这个问题的简单办法。
2.more 命令more命令会显示文本文件的内容,但会在显示每页数据之后停下来。
3.less命令
d 键与b键
man less
d or ^D
Scroll forward N lines, default one half of the screen size. If N is specified, it becomes the new default for subsequent d and u commands.
b or ^B or ESC-v
Scroll backward N lines, default one window (see option -z below). If N is more than the screen size, only the final screenful is displayed.3.8.4 查看部分文件
通常用户要查看的数据要么在文本文件的开头,要么在文本文件的末尾。如果这些数据是在一个大型文件中,那你就得等cat或more加载完整个文件之后才能看到内容。如果数据是在文件的末尾(比如日志文件),你可
能需要翻成千上万行的文本才能到最后的内容。好在Linux 有解决这个问题的专用命令。
1.tail命令
tail命令会显示文件末尾部分内容。默认情况下它会显文件的末尾10行。
-f参数是tail命令的一个突出的特性,它允许你在其他进程使用该文件时查看文件的内容。tail命令会保持活动状态
并不断显示添加到文件中的内容。这是实时监测系统日志的绝妙方式。
2.head 命令
尽管不及tail命令那么知名,head命令依然可以如你所愿:它会显示文件开关那些的内容。
默认情况下,它会显示文件前十行的文本。类似于tail命令,它也支持-c和-n参数,这样就可以指定想要显示的内容了。
通常文件的开关不会改变,head命令不支持-f参数特性。head命令是不知道文件内容而想知道大致内容时的利器,而无需加载全部文件。