第3章基本的shell

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命令是显示文本文件中所有数据的得力工具:
[root@localhost test]# cat test1
hello

This is a test file


That we'll use to       test the cat command.
没什么特别的,只是文本文件的内容。这里还有一些可以和cat命令一起用的参数,可以会对你有所帮助。
-n参数会给所有的行加上行号:
[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.
这个功能在检查脚本时会很有用。如果你只想给有文本的行加上行号,可以用-b参数:
[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参数:
[root@localhost test]# cat -T test1
hello

This is a test file


That we'll use to^Itest the cat command.
-T参数会用^I字符组合去替换文本的所有制表符。
对于大型文件来说,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命令是不知道文件内容而想知道大致内容时的利器,而无需加载全部文件。




猜你喜欢

转载自blog.csdn.net/tjjingpan/article/details/79178898