在Linux系统下,一切皆文件,文件主要分为五类:普通文件、目录文件、设备文件、链接文件、管道文件。
普通文件:是最基本的文件,保存着运行指令和各种数据。普通文件是以ASCII码形式存储,人类能够读懂可以编辑修改的文件。
目录文件:是文件信息的集合,实际上就是我们通常认识的“目录”。
设备文件:是对计算机硬件的抽象化,例如,硬盘、鼠标、键盘被作为一个设备文件管理。
链接文件:是指向另一个文件的链接,它本身没有数据,内部的数据来自其他文件。链接文件区分为硬链接与软件,两者均用于同步数据。
管道文件:是用于程序之间进行通信的特殊文件。
那么要怎么区分这些文件呢?这时可以用ll命令来看打印文件的详细信息,每一行的第一个字段里的第一个字符代表的就是这个文件的类型。
-:表示普通文件。
d:表示目录。
l:链接文件。
b:块设备文件。
c:字符设备文件。
s:套接口文件。
p:管道。
1. 绝对路径与相对路径
在Linux中文件的路径,就是文件存在的地址。如同快递寄送东西需要寄货地址,这个地址在Linux文件中就是它的路径。例如:/root/mfkddd/file,file是一个文件,它的路径就是/root/mfkddd。在Linux的世界中,路径可分为绝对路径和相对路径两种。
绝对路径:路径的写法一定是由根目录“/”开始。例如:cat /root/mfkddd/file,该语句的意思是查看file文件里的内容,cat后面跟的是绝对路径。
相对路径:路径的写法不是由根目录开始的。例如:假如进入到mfkddd目录,可以用cat file这个命令直接查看file文件里面的内容,这里的cat后面跟的file文件相对mfkddd而言便是相对路径。
2. 操作目录的相关命令
1)Linux系统中的常见特殊目录(见表1)
表1特殊目录
每个目录下都有两个目录:“.”和“..”,分别代表当前目录和上层目录。在根目录下使用ls -a命令查询,可以看到根目录下存在“.”和“..”两个目录,这两个目录的属性和权限完全一致,这说明根目录的“.”和“..”是同一个目录,如表2.2所示。
2)常用操作目录的命令
(1)cd:切换目录。
[root@localhost ~]# cd /tmp <==切换到/tmp目录中
[root@localhost tmp]# <==由此可知,此目录为tmp
如上述操作,cd命令是切换命令,cd后面跟的tmp是相对路径,cd tmp命令的意思是从当前目录切换到tmp目录。这里使用的是tmp的相对路径,使用相对路径的前提是目标目录必须事先存在。
如果只输入cd或者cd ~代表会回到使用者的家目录。输入cd -代表回到上一个工作目录。输入cd /root/mfkddd代表进入到mfkddd目录,这里cd后面跟的是绝对路径,所以在任何目录下输入cd /root/mfkddd这条命令都可以进入到mfkddd目录。
(2)pwd:显示当前目录的路径。
例如,先在root目录下创建一个mfkddd目录,并在里面创建一个file文件。
[root@localhost /]# cd /root <==首先进入到root目录
[root@localhost root]# mkdir mfkddd <==创建目录
[root@localhost root]# cd /root/mfkddd <==再进入到mfkddd目录
做好所有准备后,可以使用pwd命令来查询文件路径了。在mfkddd目录下输入pwd命令,打印出来的/root/mfkddd路径是mfkddd目录的绝对路径。
[root@localhost mfkddd]# pwd
/root/mfkddd
(3)mkdir:建立一个新的目录。
mkdir命令后面可以选择-m或-p参数。-m表示可以给创建的目录设置权限,-p表示可以创建多级目录。
如果没有加-p参数创建多级目录,终端将会弹出“没有这样的文件或目录”的提示框。因为当前目录下没有test1这个目录,所以找不到它,后面的test2和test3自然也无法被创建。
[root@localhost mfkddd]# mkdir test1/test2/test3 <==创建目录
mkdir: 无法创建目录"test1/test2/test3": 没有那个文件或目录 <==创建失败
[root@localhost mfkddd]#
为了解决上述问题,在mkdir后面加上一个参数-p,系统就会默认先创建test1,然后创建test2,最后创建test3,操作如下。
[root@localhost mfkddd]# mkdir -p test1/test2/test3 <==创建多级目录
[root@localhost mfkddd]#
现在已经执行了mkdir -p test1/test2/test3命令,如果没有看到效果,就说明创建成功,可以通过切换命令进入到test3目录,如果能成功进入,表示多级目录创建成功,操作如下。
[root@localhost mfkddd]# cd test1/test2/test3 <==切换目录
[root@localhost test3]# <==已切换到此目录
(4)rmdir:删除一个空的目录。
rmdir命令删除目录时需要一层一层地进行,而且被删除的目录必须是空目录。如果要将目录下的所有东西都删除,需要在rmdir命令后面加上-p参数。
当直接用rmdir命令删除一个多级目录时,将出现提示错误信息:目录不为空。
[root@localhost mfkddd]# rmdir test1/ <==删除test1目录
rmdir: 删除 "test1/" 失败: 目录非空 <==删除失败
[root@localhost mfkddd]#
为了解决上述问题,在rmdir命令后面加上参数-p 。rmdir只是针对目录,且在目录内没有其他文件的情况下使用。如果既要删除目录又要删除文件,可以用rm命令来实现。
[root@localhostmfkddd]# rmdir -p test1/test2/ <==删除多层目录,加-p参数
[root@localhostmfkddd]#
3)关于执行文件路径的变量$PATH
当执行一个命令时,如ls,系统会按照PATH的设定到每个PATH定义的目录下查找文件名为ls的可执行文件。如果在PATH定义的目录中含有多个名为ls的可执行文件,那么先查询到的同名命令就会先被执行。
使用echo $PATH命令可以查看有哪些目录被定义。echo命令的作用是显示或打印文件内容,而PATH前面加的$表示后面接的是变量,所以会显示目前的PATH。
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PATH一定要大写,这个变量的内容由一堆目录组成,每个目录使用(:)分隔,每个目录有顺序之分。无论是root还是其他用户都有/bin或/usr/bin这个目录在PATH变量内,所以就能在任何地方执行ls命令来找到/bin/ls执行文件。
(1)在PATH中加入目录的方法如下(例如在任何目录均可执行/root目录下的命令,那么就将/root加入到PATH当中即可)。
[root@localhost ~]# PATH=”${PATH:/root}”
(2)PATH的特点。
① 不同身份用户预设的PATH不同,因此预设能够随意执行的命令也不同;
② PATH是可以修改的;
③ 使用绝对路径或相对路径直接指定某个命令的文件名进行执行,会比查找PATH正确率更高;
④ 命令应该要放到正确的目录下,执行起来会更加方便;
⑤ 本地目录(.)最好不要放到PATH中。
3. 文件与目录管理
Linux的目录结构为树状结构,最顶级的目录为根目录,其他目录通过挂载可以将它们添加到树中,通过解除挂载可以移除它们。
Linux中可以使用ls、cd、mkdir、cp、mv和rm等常见命令对文件或者目录进行处理,示例如下。
(1)列出/查看tmp目录下的所有文件/文件夹。
[root@localhost tmp]# ls /tmp <==查看tmp目录下的所有文件
xuedao xuedao.tar
[root@localhost tmp]#
(2)直接用ls命令,表示查看当前目录下的所有文件/文件夹。
[root@localhost tmp]# ls <==查看当前目录下的所有文件
xuedao xuedao.tar
[root@localhost tmp]#
(3)查看当前目录下所有文件的详细属性/信息。
[root@localhost tmp]# ls -l <==查看当前目录下所有文件的详细信息
总用量 16
-rw-r--r--. 1 root root 52 12月 25 00:09 xuedao
-rw-r--r--. 1 root root 10240 12月 24 22:24 xuedao.tar
[root@localhost tmp]#
(3)切换到home目录。
[root@localhost ~]# cd /home/
[root@localhost home]# pwd
/home
(4)在/root目录下创建test目录。
[root@localhost ~]# mkdir test
[root@localhost ~]# ls
test
4. 查看文件内容
1)文件查看命令:cat、tac、nl
操作查看命令前先在/tmp目录下用vi xuedao命令创建一个xuedao文件,并在里面写入第1~3行的内容,操作如下:
[root@localhost tmp]# vi xuedao <==使用vi编辑器打开文件
1 Hello xuedao 001
2 Hello xuedao 002
3 www.baidu.com
下面将介绍tac命令的使用与tac和cat两个命令之间的区别。
(1)tac命令也是用来查看文件内容的,只不过tac命令是从最后一行开始显示文件的信息,与cat命令恰好相反。tac xuedao命令,如下:
[root@localhost tmp]# tac xuedao <==从最后一行开始显示xuedao文件
3 www.baidu.com
2 Hello xuedao 002
1 Hello xuedao 001
[root@localhost tmp]#
(2)nl命令是查看命令,它与cat或tac命令的区别在于nl命令默认带行号显示内容。
语法格式如下:
nl [参数] [文件]
参数如下。
-b指定行号的方式,主要有以下两种。
-b a:表示不论是否为空行,也同样列出行号(类似于cat -n)。
-b t:如果有空行,则空的那一行不列出行号(默认值)。
nl命令的示例如下:
[root@localhost tmp]# nl –b a xuedao
1 Hello xuedao 001
2 Hello xuedao 002
3 www.baidu.com
4 <==空行(没有数据的一行)
5 <==空行(没有数据的一行)
[root@localhost tmp]# nl –b t xuedao
1 Hello xuedao 001
2 Hello xuedao 002
3 www.baidu.com
2)翻页查看文件内容命令:more、less
(1)more命令用于逐页显示文件信息。在more命令运行过程中,可以使用如表2所示的按键进行后续操作。
表2 more命令运行过程中按键的功能
(2)less命令与more命令功能类似,区别在于less运行过程中,可以使用如表3所示按键进行后续操作。
表3 less命令运行过程中按钮的功能
3)获取资料命令:head、tail
(1)head是查询文件内容命令,它可以指定参数从前往后显示指定的行数。
语法格式如下:
head [参数] [文件名]
参数如下。
-n: n代表int类型数字,假设数字设置为3,显示的内容从前往后显示前3行,如果不指定参数则默认显示前10行。
head命令的示例如下:
[root@localhost tmp]# head xuedao
1 Hello xuedao 001
2 Hello xuedao 002
3 www.baidu.com
4
5
[root@localhost tmp]#
(2)tail命令也是查询命令,tail命令从后往前显示指定的行数,并且空格也会被显示出来。
语法格式如下:
tail [参数] file
参数如下。
-n:n代表int类型数字,假设数字设置为3,显示的内容从前往后显示前3行,如果不指定参数默认下显示后10行。
-f:代表实时显示。
tail命令的示例如下:
[root@localhost tmp]# tail -3 xuedao
3 www.baidu.com
4
5
[root@localhost tmp]#
4)查询非纯文字文件命令:od
语法格式如下:
od [参数] [文件名]
参数如下。
-t:后面可以接类型(type)的输出。
a:利用默认的字符进行输出。
c:使用ASCII字符进行输出。
od命令的示例如下:
[root@localhost tmp]# od -t c xuedao
0000000 H e l l o x u e d a o
0000040 2 w w w . b a i d u . c o m
0000064
[root@localhost tmp]#
以上左侧的第一列是以八进制表示的字节数。
5. 文件与目录的默认权限与隐藏权限
1)设置默认文件权限的命令:umask
umask命令是用于设置用户在创建文件时的默认权限,当在系统中创建目录或文件时,目录或文件所具有的默认权限就是由umask值决定的。
[root@localhost ~]# umask
0022
[root@localhost ~]#
[root@localhost ~]# umask -S
u=rwx,g=rx,o=rx
[root@localhost ~]#
若使用者创建文件,默认没有可执行(x)权限,只有r(读)和w(写)两个权限,也就是最大权限为666,默认权限为-rw-rw-rw-。
默认情况下r、w、x的值分别是4、2、1,umask的值指“该默认值需要减去的权限”,即如果需要减去写的权限,则为2;而如果要减去读的权限,则为4。上述umask的值为002,表示user、group并没有被拿掉任何权限,不过others的权限被减去2,也只是说others被减去写的权限。
2)文件隐藏属性命令:chattr、lsattr
(1)chattr命令是设置文件隐藏属性的命令。
语法格式如下:
chattr [+ - ][参数] [文件]
参数如下。
+:增加某一个特殊参数,其他原本存在参数不动。
-:移除某一个特殊参数,其他原本存在参数不动。
a:当设置a后,这个文件将只能增加信息,不能修改、删除信息,只有root才能设定这个参数。
i:当设置i后,该文件“不能被删除、改名、设置链接,也无法定稿或新增信息”,可增加系统安全性,只有root能设置该属性。
常见的属性是a和i,且很多属性只有root才能设置。
[root@localhost tmp]# touch attrtest <==创建attrtest文件
[root@localhost tmp]# chattr +i attrtest <==给attrtest文件赋上i的权限
[root@localhost tmp]# rm attrtest <==删除attrtest
rm:是否删除普通空文件 "attrtest"?Y <==是否删除,设置为Y(是)
rm: 无法删除"attrtest": 不允许的操作 <==删除失败
[root@localhost tmp]# chattr -i attrtest <==给attrtest文件去掉上i的权限
[root@localhost tmp]# rm attrtest <==删除attrtest
rm:是否删除普通空文件 "attrtest"?Y <==是否删除,设置为Y(是)
[root@localhost tmp]# <==没有任何错误,表示删除成功
在上述例子中用touch attrtest命令创建了一个attrtest文件,并用chattr +i attrtest命令给attrtest文件赋上i的权限,然后用rm attrtest命令删除attrtest文件。此时rm发出提示rm: cannot remove ‘attrtest’ : Operation not permitted不允许执行删除操作,只有通过chattr –i attrtest命令减去attrtest文件的i权限后才能删除attrtest文件。
(2)lsattr命令是显示文件隐藏属性的命令。
语法格式如下:
lsattr [参数] [文件]
参数如下。
-a:显示隐藏属性。
-d:如果接的是目录,则仅显示目录本身的属性而不是目录内的文件名。
-R:连同子目录的文件一起显示。
[root@localhost ~]# cd /tmp <==切换目录到/tmp
[root@localhost tmp]# touch xuedao <==创建文件名为xuedao
[root@localhost tmp]# chattr +ai Sxuedao <==为xuedao文件设置属性
[root@localhost tmp]# lsattr xuedao <==显示xuedao文件隐藏的属性
--S-ia-------e- xuedao <==查看xuedao文件属性结果
[root@localhost tmp]#
3)查看文件类型:file
查看文件基本信息,属于哪类文件,如文件属于ASCII、data或者binary等。显示文件的类型是ASCII的纯文字文件。
[root@localhost ~]# file ~/.bashrc
/root/.bashrc: ASCII text
显示passwd的文件信息,例如文件的suid权限、兼容Intel x86-64的硬件平台、使用Linux核心2.6.18的动态方法库连接等。
[root@localhost ~]# file /usr/bin/passwd
/usr/bin/passwd: setuid ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
6. 查找命令和文件
1)查找指定命令所在路径的命令:which
which命令能够根据PATH这个环境变量所规范的路径,查询执行文件的文件名。
语法格式如下:
which [参数] [命令]
参数如下。
-a:将所有由PATH目录中可以找到的命令均列出,而不止第一个找到的命令名称。
示例如下。
(1)查询ifconfig命令的完整文件名。
[root@localhost ~]# which ifconfig
/sbin/ifconfig
(2)用which命令搜索ls命令的文件路径。
[root@localhost ~]# which ls
alias ls='ls --color=auto'
/usr/bin/ls
(3)查询history命令的完整文件名。
[root@localhost ~]# which history
/usr/bin/which: no history in (/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)
最后一个应用中查找history这个常用命令,是因为history是bash内建命令,而which默认查找PATH内规范的目录。
2)查找文件的文件名命名:whereis、find
(1)whereis命令。
用于在一些特定的目录中查询指定命令路径。
语法格式如下:
whereis[参数] [文件]
参数如下。
-b:只查找binary格式的文件。
-m:只查找在说明manual路径下的文件。
示例如下。
①查找ifconfig的文件名。
[root@localhost ~]# whereis ifconfig
ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
②只查询在man里面的passwd文件。
[root@localhost ~]# whereis -m passwd
passwd: /usr/share/man/man1/passwd.1.gz
whereis命令主要是针对/bin/sbin目录下的执行文件,以及/usr/share/man目录下的man文件,或者对几个特定的目录进行查找,因此速度较快。可以使用whrereis –l查看whereis查找的目录。
[root@localhost ~]# whereis -l
whereis [ -sbmu ] [ -SBM dir ... -f ] name...
[root@localhost ~]#
(2)find命令。
Linux下find命令的作用是在目录结构中搜索文件,并执行指定的操作。Linux下的find命令提供了相当多的查找条件,功能非常强大,所以find的选项也非常多。本节将介绍find的选项功能和find的简单使用方法。
语法格式如下:
find [查询路径][选项] [参数] [查询内容]
选项如下。
-name:按照文件名称查找文件。
示例如下。
根据关键字查找。例如,通过find命令搜索指定目录下的mysql文件文字。
[root@localhost ~]# find / -name mysql
/usr/share/mysql
/usr/lib64/mysql
[root@localhost ~]#