linux系统管理学习笔记-管好文件
切换创建和删除目录
linux目录的基本架构
基本上所有的linux发行版本都遵循了linux基金会发布的标准文件系统架构(Filesystem Hierarchy Standard, FHS)。根据FHS的规定,linux的目录是树形的,其中最重要的根目录,所有的目录都位于根目录下。FHS规定了linux根目录下应有哪些目录,这些特定的目录应该放置什么数据。
FHS规定,根目录下至少应该包含12个目录,
- /bin , 可执行的命令文件
- /boot,系统核心文件和开机所需文件
- /dev, 系统设备文件
- /etc, 系统主要配置文件
- /home,放置除根用户外的其他用户的家目录。默认情况下,每个用户均在该目录下有一个私人目录
- /lib,系统和程序运行所要调用的库函数文件
- /root, root用户的家目录
- /sbin, 根用户才能执行的命令文件
- /srv, 放置服务启动之后需要访问的数据,如web服务所需要访问的网页数据
- /tmp,程序临时存放文件的目录,任何人均可访问,重要数据不可放置在本目录下
- /opt,第三方软件建议安装目录,也即非本发行版本所提供的软件
- /media,放置移动设备相关文件,如光驱,U盘相关数据都在该目录下。
linux目录操作命令
登陆linux系统时,初始的默认工作目录,总是登陆用户的家目录,也即登陆用户的私人目录。
-
pwd
(present working directory)命令显示当前完整的工作目录。 -
cd
(change directory)命令切换工作目录。 -
mkdir
,(make directory)创建目录,mkdir /tmp/sampledir
。添加 -p选项,来创建嵌套目录mkdir -p dirlevel01/dirlevel02
-
rmdir
(remove directory)删除目录,rmdir sampledir
.注意只能删除空目录。
linux相对路径和绝对路径
linux中有两种路径书写方式,分别是绝对路径和相对路径。绝对路径就是目录的完整路径,相对路径书写时,可以省略根目录到当前工作目录的部分。
linux特殊字符代表的目录
Linux为了方便输入,linux的外壳程序Bash提供了一些特殊字符,代表一些特殊目录,如下:
-
.
,表示当前工作目录,cd ./dir01
-
..
,表示工作目录的上层目录,cd ../dir02
-
-
,表示前一个工作目录,cd -
-
~
,表示用户的家目录,cd ~
(切换至当前用户的家目录);cd ~nblinux
(切换至nblinux用户的家目录中)
列出文件和文件属性
列出文件 ls
ls [文件名 | 目录名 | NONE]
- ls 跟文件名,即列出该文件
- ls跟目录名,即列出该目录下的文件
- ls 跟NONE,即列出当前工作目录下的文件
ls命令常带的选项有 -a 和 -l
- -a , 表示列出包括隐藏文件
- -l , 表示以长格式列出文件,即除了列出文件名之外,还列出文件的详细信息
- -al, 表示以长格式列出含隐藏文件的所有文件
文件属性
ls -l 列出的每一行是每一个文件的信息,包含7个字段的内容,分别是
- 文件的类型和权限, 有10个字符构成, 如-rwxr-xr--,其中第一个字符表示文件类型,如果是d表示是目录文件; 是 - ,表示是普通文件;是c表示是字符设备文件,是b表示块设备文件,是l表示是符号链接文件。其中后9个字符,三个字符为一组,每一组分别规定了文件拥有者、文件所从属的用户组里的用户、其他用户对本文件的访问权限。为了方便记忆,将有英文的位置替换为1,将短横线替换为0,那么rwxr-xr--就替换为111101100,然后三个一组转为为八进制数字,就是754 。因此称该文件的访问权限为754 。命令
chmod 700 hello.sh
即将hello.sh文件权限修改为700 。命令chown nbcc:stu hello.sh
即将hello.sh文件的拥有者和从属用户组修改为了nbcc 和stu。chown stu hello.sh
即只修改文件拥有者,chown :nbcc hello.sh
即只修改文件从属用户组。- r 是读权限,表示可以查看该文件。显示短横线时,表示没有对应的权限。
- w是写权限,表示可以修改该文件。显示短横线时,表示没有对应的权限。
- x是执行权限,表示可以执行该文件。显示短横线时,表示没有对应的权限。
- 文件的硬链接数目
- 文件的拥有者
- 文件从属的用户组
- 文件大小
- 文件时间戳,文件最近创建或修改的时间
- 文件名称
第1 3 4 字段,联合在一起,决定了某个用户对该文件的具体访问权限类型。
拷贝移动删除和创建文件
拷贝文件
cp [要拷贝的文件|文件列表] [目的文件名|目的目录]
-
当有目的文件名时,表示复制后进行文件重命名。举例,
cp /tmp/file01 ~
,cp /tmp/file01 ~/file01_bak
。 -
当复制多个文件时,文件名之间用空格隔开即可。
cp /tmp/file01 /tmp/file02 /tmp/file03 ~
。 -
-r 选项表示拷贝整个目录,
cp -r /tmp/dir01 ~
。 -
cp 命令拷贝文件时,如果目标位置有同名文件,cp命令默认会询问是否覆盖。
-
若有批量同名文件存在的话,在cp命令前加一个反斜线,同时使用-f选项,cp命令就强制覆盖所有同名文件而不询问。如
\cp -f /tmp/file01 /tmp/file02 ~
-
cp命令拷贝文件时,文件的访问权限以及拥有者和从属用户组都可能发生改变,如果希望原原本本地复制一个文件,建议使用 -p选项。
cp -p /tmp/sample.sh ~nbcc
。使用-p选项复制文件时,需要登录用户对该文件有w权限才可以。
移动文件
mv [要移动的文件|文件列表|目录] [目的文件名|目的目录]
-
mv /tmp/file05 ~
移动单个文件 -
mv /tmp/file05 /tmp/file06 /tmp/file07 ~
移动多个文件 -
mv /tmp/dir02 ~
移动文件夹 。注意与cp命令不同,mv移动目录时,不需要加任何选项。 - 当用mv移动文件时,如果遇到同名文件,默认会询问用户是否覆盖。
- 如果有批量同名文件存在的话,也和cp命令一样,使用-f选项,强制覆盖所有同名文件。
- linux中没有专门的文件重命名命令,使用mv命令可以实现文件重命名。即将本文件从原目录移动到相同目录。
mv /tmp/file01 /tmp/file01_bak
删除文件
rm [要删除的文件|文件列表|目录]
-
rm ./file01
删除单个文件 -
rm ./file02 ./file03 ./file04
删除多个文件 -
rm -R ./dir01
,删除文件夹,需要加上-R选项。 - 删除文件时,会默认询问是否确认删除。加上 -f选项,可以使不询问而直接删除文件或文件夹。
创建文件
touch [要创建的文件名]
即创建了一个没有任何内容的空文件
- 如果touch 要创建的文件名已经存在的话,touch将会改变这个文件的时间戳属性,也即文件的最后修改属性。
文件链接
本讲学习在linux中为文件创建硬链接和符号链接。
符号链接
符号链接和windows中的快捷方式很像。符号链接文件很小,提供了一个访问实际文件的一个通道。
创建链接的命令是 ln
创建符号链接的命令是 ln -s [链接指向的文件] [链接名]
例如,ln -s /tmp/hello.sh ./hello_slink
linux中可以通过符号链接文件来读写执行原文件,但是符号链接文件和原文件并不是同一个文件。如果原文件被删除了,那么指向这个文件的符号链接文件就会失效,提示没有那个文件或目录,这种情况被称为这个符号链接断裂了。
硬链接
硬链接和符号链接文件有很大的不同,因为两者的原理不同。
为理解硬链接,需要首先了解linux中文件是如何存贮的。
linux中当划分磁盘分区并进行格式化的时候,整个分区会被划分为两个部分,即Inode区和Data Block区。linux中每个文件都被分成两部分存放,一部分是文件的唯一标识,inode-number以及属性信息,放在inode区的一个inode中,inode-number和inode是一一对应的。另一部分是文件的实际数据,放置在data block区中。在linux中,我们需要通过文件的inode里找到存放文件数据的data block,在一个硬盘分区中,不可能有两个文件公用一个inode,自然不可能有两个文件的inode-number是一样的。inode区类似一本书的目录,data block区类似书的内容,必须通过目录才能找到具体的内容。
ls -il
加上-i 选项,即列出文件的inode-number,第一个字段就是文件的inode-number。
接着需要理解linux中的目录是什么文件?linux中目录是一张表,每一个表项都代表了一个文件,目录中有多少文件,这张表中就有多少表项。每个表项中都包括了两样数据,一是文件名,而是该文件的inode-number。因此linux中存取文件的过程就是,通过文件名找到对应的inode-number,然后找到文件的inode,最后找到文件的数据。
在此基础上,理解硬链接。硬链接,就在文件目录中,让一个inode-number对应了 多个文件名。文件inode和数据还是一份,没有变化。
创建硬链接,ln [链接指向的文件] [链接名]
ls -il /tmp/sample.txt
ln /tmp/sample.txt ./sample_hl01
ls -il /tmp/sample.txt ./sample_hl01
可以看到sample.txt文件属性中第二个字段表示的硬链接数目发生了改变,由1变为2。
原文件、以及原文件的硬链接文件,其本质上是同一个文件,可以通过查看文件的inode-number是一致的,可以通过任一个硬链接或原文件来访问文件。因此,如果将原文件删除掉,创建的硬链接文件并不会像符号链接文件一样断裂。只是文件属性中的硬链接数目发生改变了,其他一起正常保持不变。
硬链接就相当于,一个文件在文件系统中的别名。
强烈不推荐为目录创建硬链接,容易造成目录遍历死循环。
不能跨硬盘分区创建硬链接,因为不同的分区中文件的inode-number不是唯一的。
归档压缩文件
本讲学习打包和压缩文件。
打包文件
打包文件,就是将多个文件或者一个目录,打包成一个大文件。打包命令是tar (最开始tar 的命令是将文件打包到磁带上,所以是tape archive的缩写)。tar命令的原理就是将多个文件前后连接在一起,形成一个大文件,所以打包后的文件大小可能比打包前所有文件的大小之和更大。tar命令并不对文件进行压缩,tar打包文件起码要跟两个选项。tar -cf
, -c选项是创建打包文件, -f选项是指定要创建的打包文件名。
tar -cf [打包文件名] [要打包的文件/列表]
注意打包文件名的参数要紧跟在选项f 的后面,并且强烈推荐创建的打包文件名后缀是.tar
-
tar -cf samplefile.tar /tmp/file01 /tmp/file02 /tmp/file03 /tmp/file04 /tmp/file05
,打包多个文件 -
tar -cf sampledir01.tar /tmp/sampledir01
, 打包一个目录 -
tar -tf ./tmp/samplefile.tar
, -tf选项,列出打包文件中所有文件名查看。 -
tar -f ./samplefile.tar --delete tmp/file05
,--delete选项,将打包文件中的一个指定文件删除 -
tar -f sampledir01.tar -A ./samplefile.tar
,-A选项,合并两个打包文件。将samplefile.tar合并到sampledir01.tar中。 -
tar -f ./sampledir01.tar -r ~/fileA.txt
, -r选项,向打包文件中添加新文件。 -
tar -xf ./sampledir01.tar -C ./sampledir
, -x选项,表示解包。即将sampledir01.tar解包,默认的解包目录是当前目录。-C选项来指定要解包目录。
压缩文件
linux中文件压缩命令有多种,最常用的就是gzip。使用简单,将要压缩的文件跟在gzip之后即可。
-
gzip ./sampledir01.tar
,压缩后的文件将替换原文件,并且gzip自动为压缩文件添加了一个.gz的后缀名。也就相当于生成.gz的文件替换了原文件。 -
gzip -d ./sampledir01.tar.gz
,-d选项,解压缩文件,后跟要解压缩的文件名即可。解压后的文件会替换压缩文件。 - gzip 还可以调节压缩比,通过一个数字选项实现,1-9, 1-9 表示的压缩比逐渐增大(即压缩后的文件大小逐渐减小),同时对应的压缩速度逐渐减慢。gzip 默认采用的压缩比是6.
gzip -6 samplefile01
- gzip 可以实现高效压缩,但是gzip不提供打包功能,所以gzip只能够单个地压缩文件,而不能将多个文件或者整个目录进行压缩。因此gzip命令往往要和tar命令一起联用,先用tar先打包,然后用gzip压缩。发过来,解压时先用gzip解压,然后用tar解包。
- 为了方便,tar提供了 -z选项, 可以调用gzip命令,让打包压缩, 解压解包一气呵成。如打包压缩一批文件,
tar -czf sample.tar.gz /tmp/samplefile01 /tmp/samplefile02 /tmp/samplefile03
- 解压缩和解包,也是在正常的tar解包命令中,添加上-z选项,就可以同时解压缩解包。
tar -xzf sample.tar.gz
查找文件
本讲学习如何在linux中查找文件,类似与everything所实现的功能。linux中查找文件的命令有两个,分别是locate 和find。
locate
查找较快,但是功能稍弱。因为linux将系统中所有的文件名都记录在一个 /var/lib/mlocate 的数据库中,当使用locate查找文件时,会在数据库中查找,而不是在硬盘中进行查找。所以locate查找文件的限制就是,有时locate查找到的文件,已经被删除了,或者刚创建的文件,无法被查找到。这是因为记录所有文件名的数据库不实时更新导致的。这个数据库默认的更新频率是每天一次。我们也可以通过updatedb
命令来手动更新这个数据库,这个更新操作可能花费较多时间。
locate [查找的路径] [文件名的关键字]
-
locate .tar
, 即在整个系统中查找名字中包括.tar字样的文件
find
查找略慢,但是功能强大。find命令可以按照用户指定的各种准则来匹配文件。
find [查找范围] [查找条件] [动作]
- 查找范围参数,一般是一个目录,可以省略,则表示在当前工作目录下查找
- 查找条件参数,此项中可以跟多个选项和参数。如文件名称,文件大小,文件类型等等。
- 动作参数。对查找的文件做进一步的处理。
举例说明:
-
find / -name passwd
,-name 根据文件名称查找,表示在整个系统中查找文件名为passwd 的文件,注意文件名是一个精确名称,而不是一个关键字。如果要通过文件名中的关键字进行查找,结合通配符使用即可。 -
find /bin -type l
, -type根据文件类型查找,后跟一个表示文件类型的字符。即查找bin目录下所有符号链接文件。 -
find,根据文件时间属性查找。相关条件选项有6个,可以分为3组,用法类同。
- -mtime , -mmin 文件内容修改时间。mtime 的时间单位是天, mmin 的时间单位是分钟。
- -ctime , -cmin 文件属性修改的时间
- -atime , -amin 文件被读取/执行的时间
-
find /tmp -mtime -3 -ls
, 在tmp下查找3天内,内容发生了修改的文件。 -
find /tmp -mtime +7 -ls
, 在tmp下查找7天前,内容发生了修改的文件。 -
find /tmp -mtime 4 -ls
, 在tmp下查找在4天前的那一天,内容发生了修改的文件。
时间参数中的 +, -, 和无符号的含义
- +n,表示n天之前
- n,表示n天前的那一天。
- -n,表示n天之内
find还可以根据文件大小来查找文件,-size选项,使用的大小单位有,c 字节;k, 1024字节; M, 1024k;G, 1024M.
-
find /tmp -size -3k -ls
,在tmp下查找比3k字节小的文件。 -
find /tmp -size +100c -ls
,在tmp下查找比100字节大的文件。 -
find /tmp -size 10M -ls
,在tmp下查找大小正好为10M字节的文件。
find 根据文件拥有者和从属用户组的属性进行查找文件,
- -user , -uid选项,文件拥有者属性
-
find /tmp -user root -ls
,find /tmp -uid 500 -ls
. - -group, -gid 选项,文件从属用户组属性
-
find /tmp -group stu -ls
,find /tmp -gid 0 -ls
find根据文件的访问权限进行查找,选项是-perm,是一个八进制的文件访问权限数字
find /tmp -perm 754 -ls
find 命令的单个条件选项,也可以联用,实现多条件查找。find命令中可以使用,与(-a)或(-o)非(!)三种运算符,来连接查找条件。
-
find /tmp \( -size +1k -a -size 10M -a mmin -30 -a -type f \) -ls
,注意使用多个查找条件时,这些条件要用圆括号括起来,并且左右圆括号都要用反斜线进行转义。 并且左右圆括号和条件项之间应有一个空格。
find命令中动作选项的一个特殊参数,-exec,即find将对查找到的对象执行-exec参数指定的shell命令。
-
find /tmp \( -size +1k -a -size 10M -a mmin -30 -a -type f \) -exec rm -rf {} \;
这个命令中,重点关注-exec 到;之间的部分。-exec表示find命令动作参数的开始,;表示动作的结束(因为bash中;有特殊含义,所以使用反斜线进行转义),中间就是find命令的动作,rm -rf是具体命令,{}代表find查找的文件。注意,{}和反斜线之间应有一个空格。 -
find ~ \( -mmin -10 -a -type d \) -exec tar -cf {}.tar {} \;
,表示在当前目录下,查找在10分钟内修改过的目录文件,并打包成目录同名的文件。 - 可以使用-OK 来替换-exec, -OK的用法和-exec的用法基本相同,只不过-OK是以一种更为安全的模式执行动作命令。也就是在执行每个动作命令之前都给出提示,让用户来决定是否执行。在执行删除命令时,可以考虑使用-OK选项。
通配符
-
通配符 * 代表任意长度字符串(也包含了0长度)。如 *.txt表示所有以.txt结尾的文件。
-
通配符 ? 代表任意单个字符。
ls -l /bin/??sh
表示列出bin目录下有4个字符并以sh结尾的文件。 -
通配符 [c1-c2] 表示匹配c1 - c2字符序列中的任意单一字符。
cp /tmp/file[0-9].txt ~
表示将tmp目录下名为file单数字.txt的文件复制到当前用户的家目录。第二种用法是,[c1,c2,...,cn]表示匹配括号之间的字符列表中的任意单一字符,如chmod 700 /tmp/script[a,1,x].sh
表示修改tmp目录下名为scripta.sh,或script1.sh,或scriptx.sh文件访问权限为700。 -
通配符 {} 代表。
{string1,string2,...,stringN}
表示匹配string1, string2直至stringN中的某个字符串。例如rm -rf {jiaoben, script}*.sh
表示,删除工作目录下以script或jiaoben打头,以.sh结尾的文件。 -
通配符 !, 通常和[] 或 {}联用,表示对括号中内容取反。举例,
tar -cf file.tar /tmp/file[!0-9].txt
表示将tmp目录下,file后紧跟除0-9数字之外的任意单个字符,并以.txt结尾的文件打包成为一个file.tar的文件。
查看文本文件的内容
linux中配置文件、日志文件通常采用纯文本文件进行存储。linux中查看文本文件有多个命令,cat less more head tail 等等。
-
cat
, (concatenate是连接的意思), 有三个功能,连接几个文件,从键盘创建文件,查看文件。cat /etc/passwd
. cat命令一次将文件所有内容输出到屏幕上,cat命令不提供翻页和查找功能。因此cat只适合查看小文件。 -
less
, 对于较大的文本文件进行查看。less /var/log/messages
,进入less后可以用上下箭头进行翻行,pgup, pgdn进行翻页,less中提供基本的文本查找功能,键入/关键字
在文件中查找相应的关键字文本,用n 和N在查找到的关键字中进行上下跳转。查看完毕后,q即可以退出,然后回到命令行。 -
more
, 用法和less接近,不过less更为常用一些。 -
head
, 用于查看文件的头几行。如head -n 20 /var/log/messages
。如果head不跟-n选项和参数时,默认显示文件的头10行。 -
tail
, 用于查看文件的末尾几行。与head用法一样。head和tail 经常用于查看日志文件,因为日志文件更新的内容经常位于文件头或者文件尾。