马哥教育网络班22期第二周课程练习1-未闻花名

1、Linux管理文件和目录的命令

命令 功能 命令 功能
pwd 显示当前目录 ls 查看目录下的内容
cd 改变所在目录 cat 显示文件的内容
grep 在文件中查找某字符 cp 复制文件
touch 创建文件 mv 移动文件
rm 删除文件 rmdir 删除目录

1.1 pwd命令

该命令的英文解释为print working directory(打印工作目录)。输入pwd命令,Linux会输出当前目录。

1.2 cd命令

cd命令用来改变所在目录。

cd /      转到根目录中 
cd ~     转到/home/user用户目录下 
cd /usr 转到根目录下的usr目录中————-绝对路径 
cd test 转到当前目录下的test子目录中——-相对路径

1.3 ls命令

ls命令用来查看目录的内容。

选项 含义
-a 列举目录中的全部文件,包括隐藏文件
-l 列举目录中的细节,包括权限、所有者、组群、大小、创建日期、文件是否是链接等
-f 列举的文件显示文件类型
-r 逆向,从后向前地列举目录中内容
-R 递归,该选项递归地列举当前目录下所有子目录内的内容
-s 大小,按文件大小排序
-h 以人类可读的方式显示文件的大小,如用K、M、G作单位
ls -l examples.doc 列举文件examples.doc的所有信息

1.4 cat命令

cat命令可以用来合并文件,也可以用来在屏幕上显示整个文件的内容。

cat snow.txt 该命令显示文件snow.txt的内容,ctrl+D退出cat。

1.5 grep命令

grep命令的最大功能是在一堆文件中查找一个特定的字符串。

grep money test.txt

以上命令在test.txt中查找money这个字符串,grep查找是区分大小写的。

1.6 touch命令

touch命令用来创建新文件,他可以创建一个空白的文件,可以在其中添加文本和数据。

touch newfile 该命令创建一个名为newfile的空白文件。

1.7 cp命令

cp命令用来拷贝文件,要复制文件,输入命令:

cp <source filename> <target filename>

cp t.txt Document/t    该命令将把文件t.txt复制到Document目录下,并命名为t。

选项 含义
-i 互动:如果文件将覆盖目标中的文件,他会提示确认
-r 递归:这个选项会复制整个目录树、子目录以及其他
-v 详细:显示文件的复制进度

1.8 mv命令

mv命令用来移动文件。

选项 说明
-i 互动:如果选择的文件会覆盖目标中的文件,他会提示确认
-f 强制:它会超越互动模式,不提示地移动文件,属于很危险的选项
-v 详细:显示文件的移动进度

mv t.txt Document    把文件t.txt 移动到目录Document中。

1.9 rm命令

rm命令用来删除文件。

选项 说明
-i 互动:提示确认删除
-f 强制:代替互动模式,不提示确认删除
-v 详细:显示文件的删除进度
-r 递归:将删除某个目录以及其中所有的文件和子目录

rm t.txt   该命令删除文件t.txt

1.10 rmdir命令

rmdir命令用来删除目录

2、Linux下一条命令或一个进程执行完成会返回一个一个状态码。

0   ===   成功执行

非0 ===  执行过程中出现异常或非正常退出

在Shell脚本中 最后执行的一条命令将决定整个shell脚本的状态. 此外 shell的内部命令exit也可以随时终止shell脚本的执行,返回Shell脚本的状态码

当shell脚本执行结束前 的最后一个命令是不带参数的exit ,那么 shell脚本的最终返回值 就是 exit 语句前一条语句的返回值,根据这个值可以判断脚本成功执行与否。

 $? 可以查看 最后一条命令的返回值 该变量可以在shell 脚本中的任何地方使用.

#! /bin/bash
echo "please input the branch you want to compare"
read $MY_BRANCH
for i in $(cat list);do        
    git-diff --quiet $MY_BRANCH $i    [--quiet 选项的意思是不要输出比较后各个diff出来的结果]    
    if [ $? -eq 0 ]        [$? 就是上一条命令执行的状态码]        
    then              
        echo $i        
    fi
done

波浪线展开

1.当他用在一个单词的开头,它会展开指定用户的主目录名

echo ~xiaohui
输出 /home/xiaohui

2.如果没有指定用户名,则是当前用户的主目录

echo ~
输出  /home/mylinuxusername

算术表达式展开

echo $(($((5**2))*3))  注意**是去幂,另外使用$需要两层$(())
输出 75

花括号展开

创建多个文本字符串

echo Front-{A,B,C}-Back 
输出 Front-A-Back Front-B-Back  Front-C-Back
echo Number_{1..5} 
输出Number_1 Number_2 Number_3 Number_4 Number_5
echo a{A{1,2},B{3,4}}b  
输出aA1b aA2b aB3b aB4Bb

参数展开

1.展开用户名

echo $USER 
输出mylinuxname

3、文件展开练习

mkdir -p /tmp/{a,b}{c,d} 

mkdir -p /tmp/mylinux/{bin,boot/grub,dev,etc/rc.d/init.d,sysconfig/network-scripts,lib/modules,lib64,proc,sbin,sys,tmp,user/local/{bin,sbin},var/{lock,log,run}}

4、文件存储结构

Linux正统的文件系统(如ext2、ext3)一个文件由目录项、inode和数据块组成。

目录项:包括文件名和inode节点号。

Inode:又称文件索引节点,是文件基本信息的存放地和数据块指针存放地。

数据块:文件的具体内容存放地。

Linux正统的文件系统(如ext2、3等)将硬盘分区时会划分出目录块、inode Table区块和data block数据区域。一个文件由一个目录项、inode和数据区域块组成。Inode包含文件的属性(如读写属性、owner等,以及指向数据块的指针),数据区域块则是文件内容。当查看某个文件时,会先从inode table中查出文件属性及数据存放点,再从数据块中读取数据。

文件存储结构大概如下:

马哥教育网络班22期第二周课程练习1-未闻花名

其中目录项的结构如下(每个文件的目录项存储在改文件所属目录的文件内容里):


马哥教育网络班22期第二周课程练习1-未闻花名

其中文件的inode结构如下(inode里所包含的文件信息可以通过stat filename查看得到):

马哥教育网络班22期第二周课程练习1-未闻花名

inode简介

上面我们看到了存储设备的宏观结构。我们要深入到分区的结构,特别是文件在分区中的存储方式。文件是文件系统对数据的分割单元。文件系统用目录来组织文件,赋予文件以上下分级的结构。在硬盘上实现这一分级结构的关键,是使用inode来虚拟普通文件和目录文件对象。

一个文件除了自身的数据之外,还有一个附属信息,即文件的元数据(metadata)。这个元数据用于记录文件的许多信息,比如文件大小,拥有人,所属的组,修改日期等等。元数据并不包含在文件的数据中,而是由操作系统维护的。事实上,这个所谓的元数据就包含在inode中。我们可以用$ls -l filename来查看这些元数据。正如我们上面看到的,inode所占据的区域与数据块的区域不同。每个inode有一个唯一的整数编号(inode number)表示。

在保存元数据,inode是“文件”从抽象到具体的关键。正如上一节中提到的,inode储存由一些指针,这些指针指向存储设备中的一些数据块,文件的内容就储存在这些数据块中。当Linux想要打开一个文件时,只需要找到文件对应的inode,然后沿着指针,将所有的数据块收集起来,就可以在内存中组成一个文件的数据了。

马哥教育网络班22期第二周课程练习1-未闻花名

                                     数据块在1, 32, 0, …

inode并不是组织文件的唯一方式。最简单的组织文件的方法,是把文件依次顺序的放入存储设备,DVD就采取了类似的方式。但果有删除操作,删除造成的空余空间夹杂在正常文件之间,很难利用和管理。

复杂的方式可以使用链表,每个数据块都有一个指针,指向属于同一文件的下一个数据块。这样的好处是可以利用零散的空余空间,坏处是对文件的操作必须按照线性方式进行。如果想随机存取,那么必须遍历链表,直到目标位置。由于这一遍历不是在内存进行,所以速度很慢。

FAT系统是将上面链表的指针取出,放入到内存的一个数组中。这样,FAT可以根据内存的索引,迅速的找到一个文件。这样做的主要问题是,索引数组的大小与数据块的总数相同。因此,存储设备很大的话,这个索引数组会比较大。

inode既可以充分利用空间,在内存占据空间不与存储设备相关,解决了上面的问题。但inode也有自己的问题。每个inode能够存储的数据块指针总数是固定的。如果一个文件需要的数据块超过这一总数,inode需要额外的空间来存储多出来的指针。

inode事例

在Linux中,我们通过解析路径,根据沿途的目录文件来找到某个文件。目录中的条目除了所包含的文件名,还有对应的inode编号。当我们输入$cat /var/test.txt时,Linux将在根目录文件中找到var这个目录文件的inode编号,然后根据inode合成var的数据。随后,根据var中的记录,找到text.txt的inode编号,沿着inode中的指针,收集数据块,合成text.txt的数据。整个过程中,我们参考了三个inode:根目录文件,var目录文件,text.txt文件的inodes。

在Linux下,可以使用$stat filename,来查询某个文件对应的inode编号。

马哥教育网络班22期第二周课程练习1-未闻花名  马哥教育网络班22期第二周课程练习1-未闻花名

            在存储设备中实际上存储为右图

当我们读取一个文件时,实际上是在目录中找到了这个文件的inode编号,然后根据inode的指针,把数据块组合起来,放入内存供进一步的处理。当我们写入一个文件时,是分配一个空白inode给该文件,将其inode编号记入该文件所属的目录,然后选取空白的数据块,让inode的指针指像这些数据块,并放入内存中的数据。

软连接、硬链接

软链接和硬链接是我们常见的两种概念:

硬连接:直接指向同一个inode的不同路径彼此之间称为硬链接 是给文件一个副本,同时建立两者之间的连接关系。修改其中一个,与其连接的文件同时被修改。如果删除其中任意一个其余的文件将不受影响。

软连接:也叫符号连接,他只是对源文件在新的位置建立一个“快捷(借用一下wondows常用词)”,指向另一个路径(是一个字符串),最终访问文件的权限是以哪个文件权限为准,所以,当源文件删除时,符号连接的文件将成为无源之水->仅仅剩下个文件名了,当然删除这个连接,也不会影响到源文件,但对连接文件的使用、引用都是直接调用源文件的。

具体关系可以看下图:

马哥教育网络班22期第二周课程练习1-未闻花名

从图上可以看出硬链接和软链接的区别:

1:硬链接原文件和新文件的inode编号一致。而软链接不一样。

2:对原文件删除,会导致软链接不可用,而硬链接不受影响。

3:对原文件的修改,软、硬链接文件内容也一样的修改,因为都是指向同一个文件内容的。

硬链接:

1、只能对文件创建,不能应用于目录

2、不能跨文件系统

3、创建硬链接会增加文件系统被链接的次数

符号链接:

1、可应用于目录

2、可以跨文件系统

3、不会增加被链接文件的链接次数

4、其大小为指定的路径所包含的字符个数

stat filename 查看时间戳

5、指令:alias
设置指令的别名

语法:#  alias name='command line'

参数:
-p:    打印出现有的别名(唯一的参数)
若不加任何参数,则列出目前所有的别名设置

用法:
# alias cp='cp -i'
这样就可以用cp来代替cp -i,而且cp -i这条命令依旧有效

查看alias:
列出目前所有的别名设置。
# alias    或    # alias -p

查看具体一条指令的别名
# alias cp

别名永久化:
alias的作用仅在该次登入的操作,即输入一次alias后,这个修改只在当前的Shell生效。如果重新开启一个 Shell,或者重新登录,则这些alias将无法使用。好在linux中提供alias永久化的方法:
<1>.若要每次登入就自动生效别名,则把别名加在/etc/profile或~/.bashrc中。然后# source ~/.bashrc
<2>.若要让每一位用户都生效别名,则把别名加在/etc/bashrc最后面,然后# source /etc/bashrc

重新设置别名:
alias重置的方法与第一次设置的时候一样
# alias cp='cp -i'

删除别名:
格式:unalias name

#  unalias cp

在bash脚本编写中,我们时常需要引用变量与替换命令,为规范操作,现对其做简单的总结说明。

引用

引用就是指将字符串用引用符号括起来,以防止特殊字符被shell脚本解释为其他意义。引用时屏蔽特殊字符的特殊意义,而将其解释为字面意义。

引用符、名称、意义说明表

引用符 名称 意义说明
'' 单引号 称全引用或弱引用,引用所有的字符;单引号中字符除单引号本身之外都解释为字面意义,单引号不具备引用变量的功能。。单引号用于保持引号内所有字符的字面值,即使引号内的\和回车也不例外。
"" 双引号 称部分引用或强引用,引用除美元符号($)、反引号(`)和反斜线(\)之外的所有字符。即在双引号中保持美元符号($)、反引号(`)和反斜线(\)符号的特殊含义,如"$变量名"表示以变量值替换变量名。利用双引号引用变量能够防止字符串分割,保留变量中的空格。
反引符 shell把反引符中的内容解释为系统命令
\ 反斜杠 转意符,屏蔽下一个字符的特殊意义,Linux常用的特殊字符有$、*、`、+、^、&、|、"、?

举例:

# test="x  y       z";echo '$test'

# $test              #不会转意,单引号只把其里面的字符的字面意义直接进行输出

#  test="x  y      z";echo $test   

#  x  y  z           #引用变量值,但不保留变量中的空格

#  test="x  y      z";echo “$test”
#  x  y      z       #引用变量值,并保留变量中的空格

注意:一个变量的值可以作为某个长字符串中的一部分.如果它在长字符串的末尾,就可直接引用,如果在开头或中间,应该用花括号将该变量括起来。
举例:

# test="xyz";echo test$test
# testxyz          #正常输出

# test="xyz";echo $testtest

#不会有任何输出,因shell会去引用变量testtest的值,可该变量并没有定义赋值

# test="xyz";echo ${test}test

# xyztest          #正常输出

命令替换
    命令替换是指将命令的标准输出作为值赋给某个变量,bash Shell定义了两种形式进行命令的替换,两种形式的语法格式如下:
    方式一: `Linux命令`
    方式二: $(Linux命令)
举例:

# echo `pwd`
# /tmp          #引用pwd命令的执行结果并输出

注意:尽管$()和反引号在命令替换上是等价的,但是,$()形式的命令替换是可以嵌套的。bash Shell中,反引号与$()在处理双反斜线符号时存在区别。

#echo \\
#\             #输出转义符
#echo `echo \\`
#              #输出空白行
##echo $(echo \\)
#\             #输出单斜线

6-12、正则练习

ls /var/ | egrep  "^l.*[0-9]{1,}.*[a-z]$"

ls /etc/ | egrep  "^[0-9]{1,}.*[^(0-9)]{1,}$" 

ls /etc/ | egrep -o "^[^A-Za-z][A-Za-z].*"

touch /tmp/tfile-`date +%F-%H-%M-%S`

ls /etc/  | egrep ^p.*[^0-9]$  | xargs -i cp /etc/{} /tmp/mytest1

ls /etc/ | egrep ".*\.d$" | xargs -i cp -r /etc/{} /tmp/mytest2

ls /etc/ | egrep "^[lmn].*\.conf$" | xargs -i cp  /etc/{} /tmp/mytest3

原创文章,作者:未闻花名,如若转载,请注明出处:http://www.178linux.com/40854

(0)
未闻花名未闻花名
上一篇 2016-08-29
下一篇 2016-08-29

相关推荐

  • 第四周:/etc/passwd、/etc/group文件熟悉及配合grep使用正则表达式

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。 [root@wlm ~]# useradd tuser1 [root@wlm ~]# cp -r etc/skel/ /home/tuser1/…

    Linux干货 2016-10-13
  • 正则表达式之一grep

    grep :文本过滤( 模式:pattern) 工具 包括:grep, egrep, fgrep (不 支持正则表达式 搜索) 用法格式: grep [OPTIONS] PATTERN [FILE…]            &n…

    2017-02-27
  • DNS

    简介     DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号5…

    Linux干货 2016-11-15
  • 自制linux和编译内核

    自制linux:(1)  分区并创建文件系统  fdisk /dev/sdb分两个必要的分区  /dev/sdb1 对应/boot /dev/sdb2 对应根  /mkfs.ext4 /dev/sdb1mkfs.ext4 /dev/sdb2  挂载bootmkdir /mnt/boot 子目录必须为bootm…

    Linux干货 2017-04-02
  • 文件查找命令之find

    文件查找命令之find   特点:实时查找,精确查找,由于find是全磁盘文件查找所有查找速度要比locate略慢一些。   find查找功能强大,下面主要介绍find查找条件的一个重要特性–德·摩根定律     德·摩根定律      非(A &&B)=(非A…

    Linux干货 2016-08-16
  • bash脚本编程class2

    bash脚本class2—循环语句的使用      一.三种循环语句以及其具体使用方法   我们知道,在shell脚本编程过程中,为了实现逻辑关系的运算,有三种执行命令的顺序:顺序执行,选择执行,循环执行。通过if,case这类语句可以实现条件筛选后执行命令,这次课程中所学的主要知识点为循环语句的三种使用方式:for,…

    Linux干货 2016-08-19

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-29 22:30

    命令演示最好使用代码格式渲染一下,可以提前预习一下bash13问,更能直观的了解bash的更多的相关特性