在Linux操作系统中,文件的概念包括文件的组织和管理、操作系统中文件的表示,以及文件存储的过程等。
一、文件系统结构
Linux文件系统的结构层次鲜明,就像一棵倒立的树。文件系统结构从一个主目录开始,称为根目录。根目录下可以有任意多个文件和子目录,并且可以按任意的方式组织在一起。
-
根目录 /
根目录位于分层文件系统的最顶层,用斜线 / 表示。它包含一些标准文件和目录,因此可以说它包含了所有的目录和文件。
cd /
-
bin
也被称为二进制目录,包含了系统管理员和普通用户使用的重要的Linux命令的二进制(可执行)程序。
cd /bin
-
lib
存放重要的库文件,其他的库文件则大部分存储在/usr/lib下。
cd /lib
-
home
存放所有普通系统用户的默认工作目录(用户主目录)。
cd /home
-
root
大多数Linux系统中,/root目录是系统管理员的目录,普通用户没有权限访问/root目录。 -
tmp
存放临时性的文件
cd /tmp
-
usr
它是Linux文件系统中最大的目录之一,存放了可以在不同主机间共享的只读数据。
cd /usr
二、基本操作
熟悉了文件的系统结构,下面将详细介绍一下在Linux系统中文件目录的表示方法以及一些基本的操作命令。
1、文件或目录的表示方法
Linux下的文件或者目录通过路径来表示,路径有两种表示方式:
- 绝对路径:从根目录开始。
- 相对路径:从当前工作目录开始。
当用户登录Linux或者在Ubuntu上打开一个终端后,首先进入一个特殊目录,称为“用户主目录”。Linux规定可以用符号“~”表示当前登录用户的“用户主目录”。当前工作目录可以用“.”表示,当前工作目录的父目录可以用“..”表示。
2、命令
下面介绍Linux下目录操作和文件操作命令的使用,包括目录创建、删除和查看,以及文件的查看、复制、删除和比较等。这些操作都是文件的基本操作,掌握它们有助于快速管理文件系统。
2.1 查看当前所在目录的绝对路径 pwd
使用pwd命令可以确定当前所在目录的绝对路径。
xuqing@master: ~ $ pwd
执行此命令的输出结果为"/home/xuqing",这也是当前用户的主目录。
2.2 创建新目录 mkdir
用mkdir命令创建一个新目录,注意是新建目录而不是文档,其语法格式如下:
mkdir [选项] <目录名>
- -m,对新建的目录设置权限
-
-p,创建存在中间路径的目录
例如:创建一个目录名为information的目录
mkdir information
例如:若需要在information目录下创建A,在A目录下创建B,可执行下列命令。
mkdir information/A/B -p
2.2.1 创建文件
- touch file创建文件或者是可以改变文件的修改时间
2.3 改变目录 cd
cd命令用于改变目录,其语法格式如下:
cd [目录名]
- cd,进入用户主目录;
- cd ~,进入用户主目录;
- cd -,返回进入此目录之前所在的目录;
- cd ..,返回上级目录;
- cd ../,返回上级目录;
2.4 列目录内容 ls
ls命令的语法格式如下:
ls [选项] [目录或文件]
- -a,显示指定目录下的所有子目录与文件,包括隐藏文件;
- -l,采用长格式来显示文件的详细信息;
- -r,将目录的内容清单以字母顺序的逆序显示;
- -R,将目标目录以及子目录都显示出来;
-
-t,按时间信息排序;
ls -l /usr
显示结果如下:
drwxr-xr-x 2 xuqing xuqing 4096 Dec 8 23:18 Documents
drwxr-xr-x:文件属性,第一位是文件类型,d表示目录文件,-表示普通文件,剩下9位为文件权限;
2:连接数;
xuqing:所有者;
xuqing:所有者所在的组;
4096:文件字节大小;
Dec 8 23:18:最近一次修改时间;
Documents:文件名;
2.5 列目录内容 ll
ll命令能以长格式的方式显示所有文件。
2.5.1 查看文件完整内容 cat
cat命令用于查看完整的文件内容,注意cat命令是针对的文档,这个要跟目录区分开来,其语法格式如下:
cat [option] <file>
- -E,在每一行的末尾显示符号$;
- -n,显示每一行的行号,包括空行;
-
-b,显示每一行的行号,不包括空行;
cat -n /etc/passwd
2.5.2 查看多于一页的文件内容 more 或 less
命令more或less来分页显示文件,其中more的语法格式如下:
more [option] <file>
- +number,从第number行开始显示内容;
- -number,指定每屏幕要显示number行;
- -s,把重复的空行压缩成一个空行;
-
-p,不以卷动的方式显示每一页,而是先清除整个屏幕再显示文本;
按空格键显示文件下一页,按Enter键显示文件下一行,按q键可以退出命令回到Shell。
命令less具有more没有的功能,因此效率会更高,其语法格式如下:
less [option] <file> - -N,显示行号;
-
-pwant,在文件中查找匹配want的第一处位置,此命令也可以直接用"/want"来替代;
例如:分页显示/etc/passwd文件内容,并查找字符串“xuqing”的第一处位置。
less -pxuqing /etc/passwd
2.5.3 head命令
head命令用于查看文件头部内容,其语法格式如下:
head [option] <file>
-
-number,显示开始的number行,若不使用该选项,默认是10行。
例如:查看/etc/passwd文件中的前5行内容。
head -5 /etc/passwd
2.5.4 tail命令
tail命令用于查看文件尾部的内容,用法跟head类似,其语法格式如下:
tail [option] <file>
- -n,表示显示文件的最后n行;
-
-c n,表示输出最后n个字节;
例如:输出/etc/passwd文件的最后40个字节。
tail -c 40 /etc/passwd
2.6 查看文件大小 du
du命令可以查看文件或者目录的大小,其语法格式如下:
du [option] <file>
- -a,对涉及到的所有文件进行统计,而不只是包含子目录;
- -h,自动以合适的单位输出文件的大小;
- -b,输出以字节为单位的文件的大小;
- -k,输出以1024字节为计数单位的文件的大小;
- -m,输出以兆字节的块为计数单位的文件的大小;
-
-c,给出总计;
例如:以1024字节为计数单位查看文件/usr的大小。
du -k /usr
2.6.1 查看磁盘大小 df
- -k,以kbytes为单位显示;
- -l,只显示本地磁盘;
2.7 文件复制 cp
cp命令是复制命令,其语法格式如下:
cp [option] <file1> <file2>
- -i,如果目的文件存在,会在覆盖前提示;
- -p,保留文件的权限属性和修改时间;
-
-r,递归复制目录(包括目标文件的子目录);
file1,是被复制的文件;
file2,是要复制到的文件或目录;
例如:如下的两个命令。
cp -i /usr/bin/ldd ~
cp -r /usr/bin information
2.8 文件移动或重命名 mv
mv命令可以实现转移文件和重命名文件,其语法格式如下:
mv [option] <file1> <file2>
- -f,在覆盖目的文件前永不提示用户;
-
-i,在覆盖目的文件前提示用户;
file1,要转移的文件;
file2,要转移到的位置;
例如:在当前用户主目录下的ldd文件转移到information目录下,并且修改名为ldd.exe。
mv ldd information/ldd.exe
2.9 文件删除 rm
删除文件的命令是rm,其语法格式如下:
rm [option] <file>
- -r,递归地删除目录中的内容及目录本身;
-
-i,在删除文件列表中的文件前给出提示;
文件列表,可以是多个文件,不同文件之间由空格分开;
rm -r information
2.10 比较文件 diff
Linux中,diff命令用来比较两个文件的内容,通过把其中一个文件转换成另一个文件的命令形式来显示这两个文件之间的区别,其语法格式如下:
diff [option] [file1] [file2]
- -b,忽视行尾的空,把空白字符串当做相同的字符串来处理;
-
-h,快速比较;
使用这个指令可以将file1转换成file2,所以diff的操作对象是file1,实质上,diff命令在执行时,一行一行地比较两个文件的内容,并以命令的形式显示它们之间的区别。如果两个文件相同,diff命令不会产生任何输出,否则它会产生一系列指令,这些指令是a(增加)、c(替换)、d(删除)。这些指令以及意义如下: - 1a2,3,将file2的第2行到第3行添加到file1的第一行后面;
- 1c1,将file1的第一行用file2的第二行替代;
- 16,17d15,将file1的第16、17行删除;
2.11 删除重复行 uniq
用命令uniq删除文件中所有连续的重复行(连续出现才被称为重复行,不连续行出现不被认为是重复行),只留下一行。该命令不改变文件的内容,只是把结果输出到屏幕或者文件中,其语法格式如下:
uniq [option] [input-file] [output-file]
- -c,在每行之前显示它们出现的次数;
- -d,只显示重复行;
-
-u,只显示未重复行;
例如:显示abc文件中的重复信息,将结果输出到屏幕上;将结果输出到ABC文件中。
uniq -d abc ABC
3、访问权限
所谓文件安全,也就是常说的文件保护。文件保护分为基于密码的文件保护、基于文本加密的文件保护和基于访问权限的文件保护。我们主要讨论基于访问权限的文件保护。
3.1 访问权限的分类和用户类别
在Linux中每一个文件或目录都包含有访问权限。
访问权限的分类:可读(r)、可写(w)、可执行(x)三种。
-
访问权限的用户类别:文件所有者、同组用户、其他用户。
xuqing@master:~ $ ls -l /usr drwxr-xr-x 2 xuqing xuqing 4096 Dec 8 23:18 Documents
drwxr-xr-x
:访问权限一共10个字符,其中d
表示文件类型,rwx
表示用户所有者的权限,r-x
表示同组用户,r-x
表示其他用户。
3.2 访问权限设置
在Linux中,可以使用命令chmod来改变文件或目录的访问权限,其语法格式如下:
chmod [option] [mode] <file>
- -v,显示权限变更的详细资料;
- -R,对目前目录下的所有档案与子目录进行相同的权限变更(即以递归的方式逐个变更);
mode,是权限标记,可以有符号标记和八进制数两种格式。由[who][operator][permission]三部分组成。
(1) 符号标记法修改权限
[who]
- u,表示“用户(user)”,即文件或目录的所有者;
- g,表示“同组用户(group)”,即与文件所有者同组的所有者;
- o,表示“其他用户(other)”;
-
a,表示“所有用户(all)”,它是系统默认值;
[operator] - +,添加某个权限;
- -,取消某个权限;
-
=,赋予给定权限并取消其他权限,即设定唯一的权限;
[permission] - r,可读;
- w,可写;
-
x,可执行;
例如:要修改当前目录下的abn文件的权限,使其他用户没有读、写、执行权限;修改当前目录下的abn文件的权限,使得同组用户只有只读权限;将当前test目录下的所有文件及子目录全部去掉写权限。
chmod o-rwx abn
chmod g=r abn
chmod -R a-w test
(2) 八进制数法修改权限
使用八进制数法修改权限
chmod命令中的mode用三个八进制abc表示,其中:
- a,表示用户(user)权限;
- b,表示同组(group)用户权限;
-
c,表示其他(other)用户的权限;
而八进制数是4(可读)、2(可写)、1(可执行)的组合,因此, - rwx,则4+2+1=7;
- rw-,则4+2=6;
-
r-x,则4+1=5;
例如:要修改当前目录下的abn文件的权限,用户具有读、写、执行权限,同组用户和其他用户具有读和执行权限。
chmod 755 abn
4、高级处理
下面将介绍一些高级的文件处理操作,包括正则表达式、文件查找、文件压缩与解压、文件备份与还原等。
4.1 正则表达式
正则表达式,又称规则表达式(Regular Expression)。在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。正则表达式的部分操作符及其含义。
- ^,匹配输入字符串开始的位置。“^st”匹配以st开始的行
- ****,匹配输入字符串结尾的位置。“st”匹配以st结尾的行
- ※, 匹配零次或多次前面的字符或表达式。“zo*”匹配“z”和“zo”
- +,一次或多次匹配前面的字符或表达式。“zo+”匹配“zo”和“zoo”
- =,前一项可有可无
- \ |,多选一
- ?,零次或一次匹配前面的字符或表达式。“do?”匹配“do”或者“does”中的“do”
- {n},n是非负整数,正好匹配n次。“o{2}”与“Bob”中的“o”不匹配,但与“food”中的“oo”匹配
- {n,m},m n是非负整数,n=<m,匹配至少n次,至多m次。“o{1,3}”匹配“foooood”中的前三个“o”
- x|y,匹配x或y。“z|food”匹配“z”或“food”,“(z|f)ood”匹配“zood”或“food”
- [a-z],字符范围,匹配指定范围内的任何字符。“[a-z]”匹配“a”到“z”范围内任何小写字母
- [^a-z],反向字母范围,匹配不在指定范围内的任何字符。
- \b,匹配一个字边界。“er\b”匹配“never”中的“er”,但不匹配“verb”中的“er”
- \B,非字边界匹配。“er\B”匹配“verb”中的“er”,但不匹配“never”中的“er”
- \f,换页符匹配。
- \d,数字字符匹配,等效于[0-9]。
- \D,非数字字符匹配,等效于[^0-9]。
- \n,换行匹配。
- \r,匹配一个回车符。
- \s,匹配任何空白字符,包括空格、制表符、换页符等。
- \t,制表符匹配。
- \w,匹配任何字类字符。
- \W,匹配任何非字类字符。
4.2 文件内容的查找
搜索文件内容的命令有grep、egrep和fgrep。三个命令中,fgrep命令是执行速度最快的,不过有较多的限制;egrep是最慢的,但却是最灵活的,完全支持正则表达式;grep具有合理的速度和部分正则表达式支持。
4.2.1 grep、egrep、fgrep命令
三种命令的语法格式如下:
grep [option] [mode] [file]
egrep [option] [mode] [file] 等价于grep -E
fgrep [option] [mode] [file]等价于grep -F
- -c,显示匹配的行数;
- -w,把表达式作为词来寻找;
- -l,只列出行所在文件名;
- -n,显示匹配内容所在文档的行号;
- -i,匹配时忽略大小写;
- -v,输出不匹配内容;
-
-x,只选择能匹配完整一行的匹配;
[mode]是要搜索文件的类型,指字符串或是表达式。常用的正则表达式操作符有: - ^,$,匹配字符串在行首,行尾;
- <,匹配表达式的开始;<man匹配manic、man
- >,匹配表达式的结尾;>man匹配batman、man
- ※,匹配零个或多个字符;man*匹配manic、Batman、man
- [ ],单个字符;
- [-],范围;
4.2.2 关于引号的使用
-
当抓取的是一个不包含空格的简单字符时,既可以使用单引号也可以使用双引号,或者甚至不使用引号。
grep hello abn grep 'hello' abn grep "hello" abn
三者是等价的。
-
当抓取的字符串包含空格时,需要使用单引号或者双引号。
grep 'hello ok' abn grep "hello ok" abn
两者是等价的。
-
当抓取含有正则表达式的操作符时,具体情况具体分析。
grep '$hello' abn grep "$hello" abn grep $hello abn
第一条:查找abn文件中含有$hello字符串的行;
第二和第三条:查找abn文件中包含变量hello所代表的内容行;
4.2.3 应用实例
使用grep命令将stdio.h文件中包含字符串“include”的行都显示出来;
使用grep命令查找以字符串“#ifndef”开头的行;
使用grep命令搜索/usr/include目录下以.h为扩展名的文件且包含stdio.h的行;
grep -n 'include' stdio.h
grep '^#ifndef' /usr/include/stdio.h
grep 'stdio.h' /usr/include/*.h
5、文件查找
在Linux中,用find命令查找文件,其语法格式:
find [file] [option] [pathname]
- -name,按照文件名查找文件;
- -perm,按照文件权限查找文件;
- -user,按照文件所有者查找文件;
- -group,按照文件所属的组查找文件;
- -mtime -n +n,按照文件的更改时间查找文件,-n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前;
- -amin n,查找系统中最后n分钟访问的文件;
- -cmin n,查找系统中最后n分钟改变文件状态的文件;
find -name stdio.h /usr/include
6、文件排序
排序是指按照一定的标准对集合里的元素指定顺序。Linux中的文件内容排序使用sort命令,其语法格式如下:
sort [option] [file]
-b,忽略每行前面开始处的空白字符;
-c,检查文件是否已经按照顺序排序;
-d,排序时,除了英文字母、数字及空格字符外,忽略其他字符;
-f,排序时,忽略大小写;
-n,依照数值的大小排序;
-r,以反向的顺序来排序;
-
-u,排序输出时,去掉重复行;
sort number.txt
7、文件压缩与解压缩
在Linux中,利用gzip命令的来压缩和解压文件,其语法格式如下:
gzip [option] [file]
-c,将输出写到标准输出上,并保留原有文档;
-d,将压缩文件解压;
-r,递归式地查找指定目录并压缩或解压其中所有文件;
-t,测试、检查压缩文档是否完整;
-
-v,对每一个压缩和解压缩的文件显示文件名和压缩比;
gzip -r ztest gzip -rd ztest
8、文件备份和还原
在Linux操作系统中,利用tar命令可以将一个目录压缩成一个普通的文件(称为档案文件),需要还原时,可以再次使用tar命令从档案中释放文件。
tar命令的语法格式如下:
tar [option] [file]
-c,创建新的档案文件。如果用户想备份一个目录或文件就要使用这个选项;
-r,把要存档的文件追加到档案的末尾。例如用户已经做好备份文件,又发现还有一个目录或一个文件忘记备份了,此时可以选择这个选项,将忘记的目录或者文件追加到档案文件中;
-t,列出档案文件的内容,查看已经备份了哪些文件;
-u,更新文件。即用新增的文件取代原来备份的文件,如果在档案文件中找不到要更新的文件,则把它追加到档案文件的最后;
-x,从档案文件中释放文件;
-f,指定要使用的文件夹名,这个选项通常是必选项,选项后面要有文件名;
-v,详细报告tar命令处理的文件信息;
-
-z,用gzip来解压/压缩文件,此选项可以实现同样的操作,但注意如果压缩时使用该选项,则解压时也同样使用该选项;
例如:将ztest目录做成档案文件,备份文件、文件还原、压缩备份文件、还原解压文件;tar -cvf ztest.tar ztest tar -xvf ztest.tar tar -cvzf ztest.tar.gz ztest tar -xvzf ztest.tar.gz
注意:-f后面必须要紧跟要使用的文件夹名;-xz表示还原解压。
9、文件补丁的制作
在开发过程中,当程序发布以后,难免要对源代码进行修改升级。在Linux上可以很方便地制作源码补丁,然后将补丁发给用户,由用户进行打补丁和重新编译程序,从而实现程序的升级。
制作补丁文件可以使用diff命令;打补丁可以使用另一个命令patch。
9.1 补丁制作
diff命令可以完成比较功能,生成补丁文件。其语法格式如下:
diff [option] <oldfile> <newfile> > <patchfile>
-r,对目录进行递归比较;
-u,输出统一格式;
-N,比较目录时,若一个目录或文件缺失,则视之为空文件;
-
-a,将所有文件视为文本文件,逐行比较;
>,重定向操作符,将diff的输出结果输出到patchfile;diff -u t.old t.new > t.patch
9.2 打补丁
打补丁时使用patch命令,该命令就是利用diff制作的补丁文件实现源文件和目标文件的转换。patch命令的语法格式如下:
patch [option] [源文件 [补丁文件]]
使用-u选项制作补丁后,补丁文件中含有旧文件和新文件的信息,因此可以使用如下格式:
patch [option] < [补丁文件]
此格式要求运行patch所在的目录跟diff生成补丁时的目录一致。
-p0,从当前目录查找源文件;
-p1,忽略第一层目录,从当前目录开始查找源文件;
-
-E,如果发现空文件,则删除它;
patch -p0 < t.patch
附:
- Ctrl+c可以强制结束Linux命令
- ln创建文件链接,格式:ln [-s] /tmp/test/readme.txt /tmp/readme.lnk。创建文件/tmp/test/readme.txt的链接/tmp/readme.lnk
- file file,查询文件类型
1、which command
在环境变量PATH的范围内查找命令command,显示命令的路径或alias。
2、whereis command
在标准路径中查找一个命令的二进制码、源码及联机手册所在的位置。
-
awk:如果要格式化报文或者从一个大的文本文件中抽取数据包,相比于屏幕处理的优点在处理庞大文件时不会出现内存溢出挥着处理缓慢的问题。依次对每一行进行处理,然后输出。
命令的形式:awk [-F|-f|-v] ‘ ’ file
1、[-F|-f|-v] 大参数,-F指定分隔符,-f调用脚本,-v定义变量 var=value
2、''引用代码块
例:
awk '{print}' /etc/passwd == awk '{print 0}' /etc/passwd //表示整行
awk -F: '{print $6}' OFS="\t" /etc/passwd //输出字段6,以制表符作为分隔符
-
sed:用来自动编辑一个或多个文件;简化对文件的反复操作,编写转换程序等。
命令的形式:sed [-option] '' file:file 必须是文本文件
例:
sed -e 4a\newline file:在file的第四行后加入newline,-e表示按照表达式4a\newline操作。
cat -n /etc/passwd | sed -n '5,7p':利用管道操作,只打印5-7行的内容,-n表示只对操作行进行操作
cat -n /etc/passwd | sed -n '2i xuqing': 在第二行前加入xuqing
cat -n /etc/passwd | sed -n '2a xuqing': 在第二行后加入xuqing
需要特别注意:以上的这些操作都是默认的标准输出即显示器,并没有改变文件的内容,但是实际的操作中我们有时需要对大量的文件做修改,这时需要我们修改文件的内容,那我们又该怎么做呢?下面的两个例子将解决这个问题。
例:
sed -i ‘$a #This is a test’ file:在文件的最后一句话上面添加#This is a test
sed -i 's/./!/g' file:将所有以.结尾换成!