linux系统管理学习笔记2-管理文件

2020-05-15

学习时间是2020年3月下旬,疫情居家隔离期间。 学习视频是,学堂在线上,颜晨阳老师讲的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个字段的内容,分别是

  1. 文件的类型和权限, 有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即只修改文件从属用户组。
    1. r 是读权限,表示可以查看该文件。显示短横线时,表示没有对应的权限。
    2. w是写权限,表示可以修改该文件。显示短横线时,表示没有对应的权限。
    3. x是执行权限,表示可以执行该文件。显示短横线时,表示没有对应的权限。
  2. 文件的硬链接数目
  3. 文件的拥有者
  4. 文件从属的用户组
  5. 文件大小
  6. 文件时间戳,文件最近创建或修改的时间
  7. 文件名称

第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 经常用于查看日志文件,因为日志文件更新的内容经常位于文件头或者文件尾。