Linux文件与目录管理

时间:2022-10-27 12:22:10

一、目录的相关操作

  比较特殊的目录:

    .   代表此层目录

      ..  代表上一层目录

      -   代表前一个工作目录

    ~  代表“目前用户身份”所在的主文件夹

    ~account  代表account这个用户的主文件夹(account是个账号名称)

  处理目录的命令:

    cd: 切换目录

    pwd: 显示当前目录

    mkdir: 新建一个新的目录

    rmdir: 删除一个空的目录

  1、cd(切换目录)(change directory)

    cd [相对路径或绝对路径]

    特殊 cd ~ 可以回到个人的主文件夹里去

  2、pwd (print working directory)

    pwd [-P] 

    参数:

      -P :显示出当前的路径,而非使用连接(link)路径。

  3、mkdir(make directory)

    mkdir [-mp] 目录名称

    参数:

      -m: 配置文件的权限,直接设置,不需要看默认权限(umask)

      -p: 帮助你直接将所需要的目录(包含上层目录)递归创建起来。

    创建多层目录: mkdir -p test1/test2/test3

    新建权限为rwx--x--x的目录: mkdir -m 711 test2

 

   4、rmdir [-p] 目录名称 (remove directory)

    参数:

      -p: 连同上层“空的”目录也一起删除

   

二、文件与目录管理

  1、查看文件与目录:ls

  语法: ls [-aAdfFhilnrRSt] 目录名称

     ls [--color={never,auto,always}] 目录名称

     ls [--full-time] 目录名称

  参数:

    -a: 全部的文件,连同隐藏文件(开头为.文件)一起列出来

    -A : 列出全部的文件(连同隐藏文件,不包括.与..那两个目录)

    -d:  仅列出目录本身,而不是列出目录内的文件数据

    -f: 直接列出结果, 而不进行排序(ls默认会以文件名排序)

    -F: 根据文件、目录等信息给予附加数据结构,例如:

      *:代表可执行文件  /:代表目录    =:代表socket文件  l: 代表FIFO文件

    -h : 将文件容量以人类易读的方式(例如GB,KB等)列出来

    -i: 列出inode号码,inode的意义下一章将会介绍

    -l: 列出长数据串, 包含文件的属性与权限等数据

    -n: 列出UID与GID,而非用户与用户组的名称(UID与GID会在账号管理提到)

    -r:  将排序结果反向输出,例如:原本文件名由小到大,反向则为由大到小

    -R: 连同子目录内容一起列出来,等于该目录下的所有文件都会显示出来

    -S: 以文件容量大小排序,而不是用文件名排序

    -t: 依时间排序,而不是用文件名

    --color=never : 不要依据文件特性给予颜色显示

    --color=always : 显示颜色

    --color=auto : 让系统自行依据设置来判断是否给予颜色

    --full-time: 以完整时间模式(包含年、月、日、时、分)输出

    --time={atime, ctime}: 输出访问时间或改变权限属性时间(ctime)

                而非内容更改时间(modification time)    

    

  2、复制、删除与移动:cp, rm, mv

    cp(copy): 除了单纯复制之外,还可以创建连接文件(就是快捷方式),对比两文件的新旧而予以更新,以及复制整个目录等功能

    语法:  

      cp [-adfilprsu] 源文件  目标文件

      cp [options] source1 source2 source3 ... directory

    参数:

      -a: 相当于-pdr的意思

      -d: 若源文件为连接文件的属性(link file), 则复制连接文件属性而非文件本身。

      -f: 为强制(force)的意思,若目标文件已存在且无法开启,则删除后再尝试一次

      -i: 若目标文件已经存在, 在覆盖时会先询问操作的进行

      -l: 进行硬连接(hard link)的连接文件创建,而非复制文件本身

      -p: 连同文件属性一起复制过去, 而非使用默认属性(备份常用)

      -r: 递归持续复制, 用于目录的复制行为(常用)

      -s: 复制成为符号链接文件(symbolic link),即“快捷方式”文件

      -u: 若destination比source旧才更新destinatioin

      最后注意,如果源文件有两个以上,则最后一个目的文件一定要是“目录”才行

      在默认情况下,cp的源文件与目的文件的权限是不同的,目的文件的所有者通常会是命令操作者本身。加上-a或-p等可以完整复制文件权限的参数才行。

      由于cp有种种的文件属性与权限的特性,所以在复制时,必须清楚了解到:

        a. 是否需要完整保留来源文件的信息?

        b. 源文件是否为软连接文件(symbolic link file)?

        c. 源文件是否为特殊的文件, 例如FIFO、socket等

        d.源文件是否为目录?

    

    rm(移除文件或目录)

    语法: rm [-fir] 文件或目录

    参数:

      -f: 就是force的意思,忽略不存在的文件,不会出现警告信息。

      -i: 互动模式, 在删除前会询问用户是否操作

      -r: 递归删除。最常用在目录的删除。这是非常危险的参数

 

    mv(移动文件与目录,或更名)

    语法:mv [-fiu] source destination

       mv [options] source1 source2 source3 ... directory

    参数:

      -f: force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖。

      -i: 若目标文件(destination)已经存在时, 就会询问是否覆盖;

      -u: 若目标文件已经存在,且source比较新,才会更新(update)

    如果有多个源文件或目录,则最后一个目标文件一定是“目录”,意思是说,将所有的数据移动到该目录的意思。

    另一个更改文件名的命令: rename

  3、取得路径的文件名与目录名称: basename 和 dirname

    如: basename /etc/sysconfig/network ---------> network

        dirname /etc/sysconfig/network--------->/etc/sysconfig

 

三、文件内容查阅

  cat: 由第一行开始显示文件内容。

   tac: 从最后一行开始显示。可以看出tac是cat的倒写形式

   nl: 显示的时候,顺便输出行号

  more: 一页一页地显示文件内容

  less: 与more类似,但是比more更好,可以往前翻页

  head: 只看头几行

  tail: 只看结尾几行

  od: 以二进制的方式读取文件内容

 

  1、直接查看文件内容:cat tac nl

    cat(concatenate):

     语法: cat [-AbEnTv]

    参数: -A: 相当于-vET的整合参数, 可列出一些特殊字符,而不是空白而已。

        -b: 列出行号,仅针对非空白行做行号显示,空白行不标行号

        -E: 将结尾的断行字符$显示出来

        -n: 打印出行号,连同空白行也会有行号,与-b的参数不同

        -T: 将[Tab]按键以^I显示出来

        -v: 列出一些看不出来的特殊字符。

    tac(反向列示): cat是由“第一行到最后一行连续显示在屏幕上”,tac则是“由最后一行到第一行反向在屏幕上显示出来”

    nl [-bnw] 文件  (添加行号打印):

      参数:

        -b : 指定行号指定的方式, 主要两种:

          -b a: 表示不论是否为空行,也同样列出行号(类似cat -n)

          -b t: 如果有空行,空的那一行不要列出行号(默认值)

        -n: 列出行号表示的方法,主要有三种:

          -n ln: 行号在屏幕的最左方显示

          -n rn: 行号在自己字段的最右方显示,且不加0

            -n rz: 行号在自己字段的最右方显示,且加0

        -w: 行号字段占用的位数。

 

  2、可翻页查看:more less

    more(一页一页翻动):

      如果more后面接的文件内容行数大于屏幕输出的行数时,最后一行就会显示目前显示的百分比,而且还可以在最后一行输入一些有用的命令。在more这个程序的运行过程中,你有几个按键可以按的:

      空格键(Space): 代表向下翻一页

      Enter: 代表向下滚动一行

      /字符串 : 代表在这个显示的内容当中,向下查询“字符串”这个关键字

      :f  : 立刻显示出文件名以及目前显示的行数

      q :代表立刻离开more,不再显示该文件内容

      b或[ctrl]-b: 代表往回翻页,不过这操作只对文件有用,对管道无用

 

    less(不只可以向下查询,也可以向上查询):

      在less这个程序中,可以输入的命令有:

      空格键: 向下翻动一页

      [PageDown]: 向下翻动一页

      [PageUp]: 向上翻动一页

      /字符串  : 向下查询“字符串”的功能

      ?字符串: 向上查询“字符串”的功能

      n: 重复前一个查询(与/或?有关)

      N: 反向重复前一个查询(与/或?有关)

      q: 离开less这个程序

 

  3、数据选取:

    head与tail都是以“行”为单位来进行数据选取

    head(取出前面几行):

      head [-n number] 文件

      参数: -n 后面接数字,代表显示几行的意思

 

    tail(取出后面几行):

      tail [-n number] 文件

      参数: -n: 后面接数字,代表显示几行的意思。

          -f: 表示持续检测后面所接的文件名,要等到按下[ctrl]-c 才会结束tail的检测,要让文件有数据写入时就立刻显示到屏幕上,就利用-f这个参数

 

  4、非纯文本文件: od

    od [-t TYPE] 文件

    参数:

    -t: 后面可以接各种“类型 (TYPE)”的输出,例如:

      a : 利用默认的字符来输出

      c :   使用ASCII字符来输出

      d[size]: 利用十进制(decimal)来输出数据, 每个整数占用size bytes

      f[size]: 利用浮点数(floating)来输出数据,每个整数占用size bytes

      o[size]: 利用八进制(octal)来输出数据,每个整数占用size bytes

      x[size]: 利用十六进制(hexadecimal)来输出数据,每个整数占用size bytes

 

 四、修改文件时间与创建新文件:touch

  文件的三个时间:

    modification time(mtime):

      当该文件的“内容数据”更改时, 就会更新这个时间,内容数据指的是文件的内容,而不是文件的属性或权限。

    status time(ctime):

      当该文件的“状态”改变时, 就会更新这个时间。举例来说,像是权限与属性被更改了,都会更新这个时间。

    access time(atime):

      当“该文件的内容被取用”时, 就会更新这个读取时间(access)。举例来说,我们使用cat去读取文件,就会更新该文件的atime

    默认情况下,ls显示出来的是该文件的mtime, 也就是这个文件的内容上次被更改的时间。

    --time=atime 查看access time

    --time=ctime 查看status time

 

    touch [-acdmt] 文件

    参数: 

      -a: 仅修改访问时间:

      -c: 仅修改文件的时间,若该文件不存在则不创建新文件。

      -d: 后面可以接欲修改的日期而不用目前的日期,也可以使用--date="日期或时间"

        -m: 仅修改mtime;

      -t: 后面可以接欲修改的时间而不用目前的时间,格式为[YYMMDDhhmm]

 

  touch这个命令最常用的情况:

    创建一个空的文件;

    将某个文件日期修改为目前日期(mtime与atime)

 

五、文件与目录的默认权限与隐藏权限

   1、文件默认权限: umask

    umask 就是指定在新建文件或目录时候的权限默认值,代表拿走的权限:

    查看方式有两种:

       直接输入umask, 可以看到数字形态的权限设置分数。

       一种则加入-S(Symbolic)这个参数,就会以符合类型的方式来显示出权限

    Linux文件与目录管理

    umask会有四组数字,第一组是特殊权限用的,后面三项则是我们熟知的user group others的权限组。

    要注意的是,umask的分数指的是“该默认值需要减掉的权限”。

    例如umask 022, 所以user并没拿掉任何权限,不过group与others的权限被拿掉了2(也就是w这个权限),那么当用户:

      新建文件时: (-rw-rw-rw-) - (-----w--w-) = (-rw-r--r--)

      新建目录时:(drwxrwxrwx)- (d----w--w-) = (drwxr-xr-x)

    umask [0002] 设置默认权限

  默认情况下,root的umask会拿掉较多的属性,root的umask默认是022,这是局域安全的考虑,至于一般身份用户,通常他们的umask为002,即保留同用户组的写入权利。

   2、文件隐藏属性chattr, lsattr

    chattr (设置文件的隐藏属性):chattr命令只能在Ext2/Ext3的文件系统上面生效,其他的文件系统可能就无法支持这个命令了。

    chattr [+-=] [ASacdistu] 文件或目录名称

    参数:

      +: 增加某一个特殊参数, 其他原本存在参数则不动。

      -: 删除某一个特殊参数, 其他原本存在参数则不动。

      =: 仅有后面接的参数

    A: 当设置了A这个属性时, 若你有访问此文件(或目录)时, 他的访问时间atime将不会被修改,可避免I/O较慢的机器过度访问磁盘。这对速度较慢的计算机有帮助

    S: 一般文件是异步写入磁盘的,如果加上S这个属性时, 当你进行任何文件的修改,该改动会“同步”写入磁盘中

    a:  当设置a之后,这个文件将只能增加数据,而不能删除也不能修改数据,只有root才能设置这个属性。

    c:  这个属性设置之后,将会自动将此文件压缩,在读取的时候将会自动解压缩,但是在存储的时候,将会先进行压缩后再存储(看来对大文件似乎蛮有用的

    d: 当dump程序被执行的时候,设置d属性将可使该文件(或目录)不会被dump备份。

    i: 这个i可就很厉害了。它可以让一个文件“不能被删除、改名、设置连接也无写入或添加数据。”对于系统安全性有相当大的帮助。只有root能设置此属性“

    s:  当文件设置了s属性时,如果这个文件被删除,他将会被完全从这个硬盘空间中删除

    u: 与s相反, 当使用u来配置文件时, 如果该文件被删除了,则数据内容其实还存在于磁盘中,可以使用来找回该文件。

 

    注: 属性设置常见的是a与i的设置值,而且很多设置值必须要身为root才能设置

 

   lsattr [-adR] 文件或目录

  参数:

    -a: 将隐藏文件的属性也秀出来。

    -d: 如果接的是目录,仅列出目录本身的属性而非目录内的文件名

    -R: 连同子目录的数据也一并列出来

 

  3、文件特殊权限:SUID, SGID, SBIT

    Linux文件与目录管理

 

   Set UID(SUID):

    当s这个标志出现在文件所有者的x权限上时,例如上面的/usr/bin/passwd权限“-rwsr-xr-x”,此时被称为Set UID, 简称为SUID的特殊权限。基本上SUID有这样的限制与功能:

     a. SUID权限仅对二进制程序有效;

    b. 执行者对于该程序需要具有x的可执行权限

    c. 本权限仅在执行该程序的过程中(run-time)有效

    d. 执行者将具有该程序所有者(owner)的权限

   注: SUID仅可用在二进制程序上,不能够在shell script 上面, 且SUID对于目录也是无效的

  

  Set GID(SGID):

    s在用户组的x时则称谓SGID

    与SUID不同,SGID可以针对文件或目录来设置。如果对于文件来说,SGID有如下的功能:

     a. SGID对二进制程序有用

     b. 程序执行者对于该程序来说,需具备x的权限

     c. 执行者在执行的过程中将会获得该程序用户组的支持

    对于目录来说, 有如下功能:

      a. 用户若对于此目录具有r与x的权限时, 该用户能够进入此目录;

      b. 用户在此目录下的有效用户组(effective group)将会变成该目录的用户组

      c。若用户在此目录下具有w的权限(可以新建文件), 则用户所创建的新文件的用户组与此目录的用户组相同。

 

 

   Sticky Bit(SBIT): t在其他人组的x时,称为SBIT, 目前前只针对目录有效,SBIT杜宇目录有以下功能:

     a. 当用户对于此目录具有w,x权限,即具有写入的权限时:

     b. 当用户在该目录下创建文件或目录时, 仅有自己与root才有权利删除该文件。

 

  SUID/SGID/SBIT权限设置

    数字形态更改权限的方式为“三个数字”的组合, 那么如果在这三个数字之前再加上一个数字的话,最前面的那个数字就代表这几个权限了

    4为SUID

    2为SGID

    1为SBIT

    如“chmod 4755 filename”---"-rwsr-xr-x"

    也可以通过符号法来处理:其中SUID为u+s, 而SGID为g+s, SBIT则是o + t, 如下

    chmod g+s, o+t test

 

  4、查看文件类型:file

    file 文件  --》 可以查看文件的基本数据,例如属于ASCII或者是data文件,或者是binary,且其中有没有使用到动态函数库(share library)等等信息。

 

六、命令与文件的查询:

  1、脚本文件名的查询:

    which或type查找命令放在哪里

    which(寻找“执行文件”)

      which [-a] command 

      -a: 将所有由PATH目录中可以找到的命令均列出来,而不是只第一个被找到的命令名称

 

  2、文件名的查找:

    whereis(寻找特定文件):

      whereis [-bmsu] 文件或目录名

      参数:

        -b: 只找二进制格式的文件

        -m : 只找在说明文件manual路径下的文件

        -s: 只找source源文件

        -u: 查找不在上述三个选项中的其他特殊文件

    locate (关键字查找文件)

      locate [-ir] keyword

      -i: 忽略大小写的差异

        -r: 后面可接正则表达式的显示方式

    注意: locate: 依据/var/lib/mlocate内的数据库记载,找出用户输入的关键字文件名。 whereis也是一样的

       如何更新数据库: 命令updatedb: 根据/etc/updatedb.conf的设置去查找系统硬盘内的文件名,并更新/var/lib/mlocate内的数据库文件。

 

    find:

      find [PATH] [option] [action]

      参数:

        1、与时间有关的参数: 共有 -atime, -ctime与-mtime, 下面以-mtime说明:

          -mtime n : n位数字,意义为在n天之前的“一天之内”被更改过的文件

          -mtime +n: 列出在n天之前(不含n天本身)被更改过的文件名

          -mtime -n: 列出在n天之内(含n天本身)被更改过的文件名

          -newer file: file 为一个存在的文件, 列出比file还要新的文件名

 

        2、与用户或用户组名有关的参数:

          -uid n: n为数字, 这个数字是用户的账号ID,即UID,这个UID是记录在/etc/passwd里面与账号名称对应的数字

          -gid n: n 为数字, 这个数字是用户组名的ID,即GID,这个GID记录在/etc/group中

          -user name: name 为用户账号名称,例如dmtsai

          -group name: name为用户组名,例如users

          -nouser: 寻找文件的所有者不存在/etc/passwd的人

          -nogroup: 寻找文件的所有用户组不存在于/etc/group中的文件

              当你自行安装软件时,很可能该软件的属性当中并没有文件所有者,这是可能的,在这个时候,就可以使用-nouser与-nogroup查找

        3、 与文件权限即名称有关的参数:

          -name filename: 查找文件名为filename的文件

          -size [+-]SIZE:  查找比SIZE还要大(+)或小(-)的文件。这个SIZE的规格有:

                    c: 代表 byte, k: 代表 1024byte 所以要比50kb还要大的文件,就是“-size +50k”

          -type TYPE: 查找文件的类型为TYPE的,类型主要有:一般正规文件(f)、设备文案(b,c)、目录(d)、连接文件(l)、socket(s)及FIFO(p)等属性

          -perm mode : 查找文件权限“刚好等于”mode的文件,这个mode类似chmod的属性值,举例来说, -rwsr-xr-x的属性值为4755

          -perm -mode : 查找文件权限“必须要全部包括mode的权限”的文件,举例来说,我们要查找-rwsr-xr-x,即0744的文件,使用-perm-0744,

                  当一个文件的权限为-rwsr-xr-x,即4755时,也会被列出来, 因为-rwsr-xr-x 的属性已经包括了-rwxr--r--的属性了。

          -perm -mode : 查找文件权限“包含任意mode的权限”的文件,举例来说,我们查找-rwxr-xr-x, 即-perm +755时, 但一个文件属性为 -rw-------也会被列出来,因为他有-rw...的属性存在。

 

        4、其他可进行的操作:

          -exec command: command为其他命令, -exec后面可再接其他的命令来处理查找到的结果。

          -pring : 将结果打印到屏幕上,这个操作是默认操作          

          例如: find / -perm +7000 -exec ls -l {} \;

          {}代表的是“由find找到的内容”,如上图所示,find的结果会被放置到{}位置中

          -exec 一直到“\;”是关键字,代表find额外命令的开始(-exec)到结束(\;),在这中间的就是find命令内的额外命令,在本例中就是“ls -l {}”

          因为“;”在bash环境下是有特殊意义的,因此用反斜扛转义

      find还可以利用通配符来找寻文件名

      find不但可以指定查找的目录(连同子目录),并且可以利用额外的参数来找到最正确的文件名。

七、权限与命令间的关系(极重要)

   1、进入目录成为“可工作目录”的基本权限:

      可使用的命令: 例如cd等切换工作目录的命令

      目录所需权限: 用户对这个目录至少需要具有x的权限

      额外需求:如果用户想要在这个目录内利用ls查阅文件名,则用户对此目录还需要r的权限

   2、用户在某目录内读取一个文件的基本权限:

      可使用命令: cat more less 等

      目录所需权限: 用户对这个目录至少需要具有x权限

      文件所需要权限: 用户对文件至少需要具有r权限才行

   3、让用户可以修改一个文件的基本权限:

      可使用的命令: 例如nano或未来要介绍的vi编辑器等

      目录所需权限: 用户在该文件所在的目录至少要有x权限

      文件所需权限: 用户对该文件至少要有r,w权限

    4、让一个用户可以创建一个文件的基本权限:

      目录所需权限: 用户在该目录要具有w,x的权限,重点在w

    5、让用户进入某目录并执行该目录下的某命令的基本权限

      目录所需权限:用户在该目录至少要有x的权限

      文件所需权限: 用户在该文件至少需要有x的权限