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中查出文件属性及数据存放点,再从数据块中读取数据。
文件存储结构大概如下:
其中目录项的结构如下(每个文件的目录项存储在改文件所属目录的文件内容里):
其中文件的inode结构如下(inode里所包含的文件信息可以通过stat filename查看得到):
inode简介
上面我们看到了存储设备的宏观结构。我们要深入到分区的结构,特别是文件在分区中的存储方式。文件是文件系统对数据的分割单元。文件系统用目录来组织文件,赋予文件以上下分级的结构。在硬盘上实现这一分级结构的关键,是使用inode来虚拟普通文件和目录文件对象。
一个文件除了自身的数据之外,还有一个附属信息,即文件的元数据(metadata)。这个元数据用于记录文件的许多信息,比如文件大小,拥有人,所属的组,修改日期等等。元数据并不包含在文件的数据中,而是由操作系统维护的。事实上,这个所谓的元数据就包含在inode中。我们可以用$ls -l filename来查看这些元数据。正如我们上面看到的,inode所占据的区域与数据块的区域不同。每个inode有一个唯一的整数编号(inode number)表示。
在保存元数据,inode是“文件”从抽象到具体的关键。正如上一节中提到的,inode储存由一些指针,这些指针指向存储设备中的一些数据块,文件的内容就储存在这些数据块中。当Linux想要打开一个文件时,只需要找到文件对应的inode,然后沿着指针,将所有的数据块收集起来,就可以在内存中组成一个文件的数据了。
数据块在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编号。
在存储设备中实际上存储为右图
当我们读取一个文件时,实际上是在目录中找到了这个文件的inode编号,然后根据inode的指针,把数据块组合起来,放入内存供进一步的处理。当我们写入一个文件时,是分配一个空白inode给该文件,将其inode编号记入该文件所属的目录,然后选取空白的数据块,让inode的指针指像这些数据块,并放入内存中的数据。
软连接、硬链接
软链接和硬链接是我们常见的两种概念:
硬连接:直接指向同一个inode的不同路径彼此之间称为硬链接 是给文件一个副本,同时建立两者之间的连接关系。修改其中一个,与其连接的文件同时被修改。如果删除其中任意一个其余的文件将不受影响。
软连接:也叫符号连接,他只是对源文件在新的位置建立一个“快捷(借用一下wondows常用词)”,指向另一个路径(是一个字符串),最终访问文件的权限是以哪个文件权限为准,所以,当源文件删除时,符号连接的文件将成为无源之水->仅仅剩下个文件名了,当然删除这个连接,也不会影响到源文件,但对连接文件的使用、引用都是直接调用源文件的。
具体关系可以看下图:
从图上可以看出硬链接和软链接的区别:
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
评论列表(1条)
命令演示最好使用代码格式渲染一下,可以提前预习一下bash13问,更能直观的了解bash的更多的相关特性