• 第7章 Linux文件与目录管理


    目录与路径

    特殊目录

    .:此层目录

    ..:上层目录

    ~:目前用户身份所在的主文件夹

    ~account:account用户所在的主文件夹

     处理目录的命令

    cd:切换目录

    change directory的缩写

    pwd:显示目前所在目录

    -P:显示当前路径,而非连接路径

    mkdir:新建新目录

    -m:配置文件的权限,而非使用默认权限(umask)

    -p:递归创建

    mkdir创建目录时,要求存在父目录,否则报错,因此可以使用-p参数,此时父目录不存在时会创建父目录

    rmdir:删除空的目录

    -p:连同上层空目录一起删除

    执行文件路径的变量:$PATH

    通过指令echo $PATH可以查看变量PATH中设置的目录:

    [root@localhost 桌面]# echo $PATH
    /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin

    文件与目录管理

    查看文件与目录:ls

    -a:全部文件,包括隐藏文件(.开头的文件)

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

    -l:列出长数据串,包括属性和权限

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

    cp:复制文件或目录

    cp [options] source1 source2 .. directory

    -a:相当于-pdr

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

    -i:若目标文件存在,则覆盖时先询问操作

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

    -p:连同文件的属性一同复制,而不用默认属性(备份)

    -r:递归连续复制(用于目录的复制)

    -s:复制成为符号连接文件,即快捷方式

    不同身份执行cp,区别很大

    举例:

    转到tmp目录,执行:

    [root@localhost ~]# cd /tmp
    [root@localhost tmp]# cp /var/log/wtmp .
    将/var/log/wtmp复制到当前文件夹,查看源文件和目标文件的属性:

    [root@localhost tmp]# ls -l /var/log/wtmp wtmp
    -rw-rw-r--. 1 root utmp 63744 6月  28 11:17 /var/log/wtmp
    -rw-r--r--. 1 root root 63744 6月  28 12:28 wtmp
    以上可以看出,源文件和目标文件的权限和修改时间都变了

     

    若要复制的文件和源文件一模一样,可以使用-a参数:

    [root@localhost tmp]# cp -ai /var/log/wtmp .
    cp: overwrite ‘./wtmp’? y
    [root@localhost tmp]# ls -l /var/log/wtmp wtmp
    -rw-rw-r--. 1 root utmp 63744 6月  28 11:17 /var/log/wtmp
    -rw-rw-r--. 1 root utmp 63744 6月  28 11:17 wtmp
    以上可以看出,两个文件一模一样。

    cp指令的源文件和目标文件在同一个目录,并且文件名不一样时,相当于重命名。

    rm:移除文件或目录

    -f:强制,忽略不存在的文件

    -i:互动模式,删前询问

    -r:递归删除

    mv:移动目录或更名

    -f:强制,若目标存在,直接覆盖而不询问

    -i:目标存在,则询问

    -u:目标存在且较新才覆盖

    rename:重命名

    rename   被替换的字符串   被替换成的字符串   匹配要替换的文件模式

    举例:

    创建四个文件:foo1,foo2,foo11,foo12

    [root@localhost tmp]# touch foo1 foo2 foo11 foo12
    [root@localhost tmp]# ls -a foo*
    foo1  foo11  foo12  foo2


    使用rename更改文件名:

    [root@localhost tmp]# rename foo foo0 foo?
    [root@localhost tmp]# ls -a foo*
    foo01  foo02  foo11  foo12
    “foo?”表示匹配以foo开头的后面仅有一个字符的文件名,并将这些文件的文件名中的foo替换成foo0

     

    相似地,有以下:

    [root@localhost tmp]# ls -a foo*
    foo1  foo11  foo12  foo2
    [root@localhost tmp]# rename foo foo0 foo??
    [root@localhost tmp]# ls -a foo*
    foo011  foo012  foo1  foo2

    以及:

    [root@localhost tmp]# ls -a foo*
    foo1  foo11  foo12  foo2
    [root@localhost tmp]# rename foo foo0 foo*
    [root@localhost tmp]# ls -a foo*
    foo01  foo011  foo012  foo02

    以上举例只适用于red hat系统(如Centos),对于Ubuntu,则需要使用perl表达式:

    匹配:m/<regexp>;/
    替换:s/<pattern>;/<replacement>;/
    转化:tr/<pattern>;/<replacemnt>;

    举例:

    wuchao@wuchao-Lenovo:~/work$ ls
    dir1  foo1  foo11  foo12  foo2
    wuchao@wuchao-Lenovo:~/work$ rename 's/foo/file/' foo*
    wuchao@wuchao-Lenovo:~/work$ ls
    dir1  file1  file11  file12  file2

    wuchao@wuchao-Lenovo:~/work$ ls
    dir1  file1  file11  file12  file2
    wuchao@wuchao-Lenovo:~/work$ rename 'tr/a-z/A-Z/' file*
    wuchao@wuchao-Lenovo:~/work$ ls
    dir1  FILE1  FILE11  FILE12  FILE2

    文件内容查阅

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

    [root@localhost ~]# cat -n /etc/issue
         1    S
         2    Kernel 
     on an m
         3    

    tac:从最后一行显示文件内容

    [root@localhost ~]# tac /etc/issue
    
    Kernel 
     on an m
    S

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

    [root@localhost ~]# nl /etc/issue
         1    S
         2    Kernel 
     on an m

    仅仅显示非空行,若要显示空行,添加 -b a参数

    more:一页一页的显示

    只能向后翻动

    less:与more相似,可以翻页

    可以向前翻页,也可以向后翻页

    空格:向下翻页

    PageDown:下翻一页

    PageUp:上翻一页

    /字符串:向下查询字符串

    ?字符串:向上查询字符串

    n:重复前一个查询

    N:反向重复前一个查询

    q:退出

    head:只看头几行

    -n number:当number为正数时,表示取前面number行显示,当number为负数时,表示取前几行,直到number行(不包括)

    tail:只看结尾几行

    -n number: 表示取最后number行显示,当number表示为+number时,表示从number行开始显示

    -f:检测文件,当有数据写入就会显示出来,直到ctr+c退出该指令

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

     

    当文件是非文本时,使用该指令

    -t type:type如下:

    a:默认类的字符输出

    c:ascii字符输出

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

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

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

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

    修改文件时间或创建新文件:touch

    首先先了解文件的三个参数:

    modification time(mtime):当文件内容改变,更新这个时间

    status time(ctime):当文件状态(比如权限和属性)改变,更新该时间

    access time(atime):文件的内容被取用时,更新这个时间

    举例如下:

    //创建新文件
    [root@localhost ~]# touch /tmp/test.txt
    //查看最后读取时间 [root@localhost
    ~]# ls -l --time=atime /tmp/test.txt -rw-r--r--. 1 root root 0 6月 28 19:22 /tmp/test.txt
    //查看最后状态更改时间 [root@localhost
    ~]# ls -l --time=ctime /tmp/test.txt -rw-r--r--. 1 root root 0 6月 28 19:22 /tmp/test.txt [root@localhost ~]#
    //读取文件 [root@localhost
    ~]# cat /tmp/test.txt
    //查看最后读取时间 [root@localhost
    ~]# ls -l --time=atime /tmp/test.txt -rw-r--r--. 1 root root 0 6月 28 19:23 /tmp/test.txt [root@localhost ~]#
    //更改文件权限 [root@localhost
    ~]# chmod u=rwx,go=r /tmp/test.txt
    //查看最后状态更改时间 [root@localhost
    ~]# ls -l --time=ctime /tmp/test.txt -rwxr--r--. 1 root root 0 6月 28 19:23 /tmp/test.txt

    touch [-acdmt] 文件

    -a:仅修改访问时间atime

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

    -t:后面可以接想要修改的日期,格式为 YYYYMMDDhhmm

    -m:仅修改mtime

     举例:

    [root@localhost ~]# touch  -t 201302031103 /tmp/test.txt
    [root@localhost ~]# ls -l /tmp/test.txt
    -rwxr--r--. 1 root root 0 2月   3 2013 /tmp/test.txt

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

    文件默认权限:umask

    首先创建文件或目录时,有如下默认权限:

    创建文件:-rw-rw-rw-          文件默认记录数据的,故默认是没有执行权限的

    创建目录:drwxrwxrwx

    接着用刚刚创建的文件或目录的默认权限减去umask的权限,查看umask:

    [root@localhost ~]# umask
    0022

    第一个数字表示是特殊权限,后三个数字表示用户、用户组和其他人的权限:022表示--- -w- -w-

    减去该权限得:

    创建文件:-rw-rw-rw-   减   ---- -w- -w-   =    -rw- -r- -r--

    创建目录:drwxrwxrwx  减  ---- -w- -w-   =   drwx r-x r-x

    更改umask值

    [root@localhost ~]# umask 0022

    文件隐藏属性

    chattr:设置文件的隐藏属性

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

    参数:

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

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

    =:仅有后面的参数

     

    A:访问文件或目录时,不改变atime属性

    S:文件的修改同步写入磁盘(默认异步写入)

    a:这个文件只能增加数据,不能删除和修改数据,root才能设置该属性

    c:自动压缩文件,读取时自动解压缩

    i:让文件不能被删除、改名、写入和添加数据

    s:文件删除后,完全从硬盘空间删除

    u:文件删除后还可以找回

    举例:

    [root@localhost tmp]# touch attrtest
    //添加i属性 [root@localhost tmp]#
    chattr +i attrtest
    //尝试删除该文件 [root@localhost tmp]#
    rm attrtest rm: remove regular empty file ‘attrtest’? y
    //即使root也无法删除该文件
    rm: cannot remove ‘attrtest’: Operation not permitted
    //移除i属性 [root@localhost tmp]#
    chattr -i attrtest [root@localhost tmp]# rm attrtest rm: remove regular empty file ‘attrtest’? y

    lsattr:显示文件隐藏属性

    -a:隐藏文件的属性也显示出来

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

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

    文件的特殊权限:SUID,SGID,SBIT

    SUID

    当s出现在文件所有者的x权限上,称为Set UID,简称SUID的特殊权限。具有以下功能:

    • SUID仅对二进制程序有效
    • 执行者对于该程序具有x的权限
    • 本权限仅在执行该程序的过程有效
    • 执行者将具有该程序所有者的权限

    举例:

    所有账户密码都存在/etc/shadow内,该文件仅有root可读且仅有root可以强制写入,但普通用户却可以通过passwd指令更改自己的用户密码,这是为什么?

    1. wuchao用户对于/usr/bin/passwd这个程序具有x权限,即可以执行passwd,并且具有特殊权限SUID
    2. passwd的拥有着是root
    3. wuchao执行passwd时会暂时获得root的权限
    4. /etc/shadow可以被passwd所更改

    因此,一般用户可以修改自己在shadow内的密码,尽管用户对该文件没有访问权限。

    SGID

    当s出现在用户组的x上,称为Set GID,SGID

    对于文件而言:

    1. SGID对二进制程序有用
    2. 程序执行者对于该程序来说,需具备x属性
    3. 执行者在执行的过程中将会获得该程序用户组的支持

    对目录而言:

    1. 用户若对此目录具有r和x的权限,该用户能够进入此目录
    2. 用户在此目录下的有效用户组将会变为该目录的用户组
    3. 若用户在此目录下具有w的权限,则用户所创建的新文件的用户组与此目录的用户组相同

    SBIT

    Sticky Bit,第三组的x权限变为t。只针对目录有效。

      1. 当用户对于此目录具有w,x权限,即具有写入的权限时
      2. 当用户在该目录创建文件或目录时,仅有自己与root才有权力删除该文件

     举例:

    用户甲对于A目录具有用户组或其他人身份,并且对于该目录具有w权限,这表示用户甲对该目录内任何其他人创建的文件都可以删除、重命名和移动。如果将目录A设置SBIT权限,则用户甲只能对自己创建的文件和哦目录进行删除、重命名和移动操作。

    设置特殊权限

    4表示SUID

    2表示SGID

    1表所SBIT

    chmod 4755 filename 表示文件权限为:-rwsr-xr-x

    查看文件类型

    file filename

    命令与文件的查询

    脚本文件名的查询

    which(寻找执行文件)

    which [-a] command

    -a:列出所有有PATH目录中可以找到的命令

    [wuchao@localhost tmp]$ which ifconfig
    /usr/sbin/ifconfig
    [wuchao@localhost tmp]$ which cd
    /usr/bin/cd

    注意:which是根据PATH变量来寻找执行文件的

     文件名的查找

    whereis(寻找特定文件)

    whereis [-bmsu] 文件名或目录名

    -b:二进制文件

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

    -s:只找source源文件

    -u:查找上述三项以外的其他文件

    whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数,则返回所有信息。

    locate

    locate 文件名

    注意:whereis和locate查找的是系统数据库,故速度很快,但系统数据库每天更新一次,因此和实际硬盘可能不同步。需要输入updatedb指令更新数据库。

    find

    find   [PATH]   [option]   [action]

    参数:

    1.与时间有关的参数

    -mtime,-ctime,-atime

    以-mtime为例:

    -mtime n:表示在n天之前的一天内被更改过的文件

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

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

    -newer file:列出比file还新的文件

    2.与用户和用户组有关的参数

    -uid n:n为数字,为用户的ID,存放在/etc/passwd内

    -gid n:n为数字,为用户组的ID,存放在/etc/group内

    -user  name:用户账户名

    -group name:用户组名

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

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

     举例:

    [root@localhost 桌面]# find /home -user wuchao
    /home
    /home/wuchao
    /home/wuchao/.mozilla
    /home/wuchao/.mozilla/extensions
    /home/wuchao/.mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}
    ...省略

    3.与文件权限和名称有关的

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

    -size [+-] SIZE:查找比SIZE还要大(+)或还要小(-)的文件。SIZE规格:c表所byte,k表示1024bytes。比50k大表示为-size + 50

    -type TYPE:查找文件类型为TYPE的,类型有:一般正规文件(f),设备文件(b,c),目录(d),连接文件(l),socket(s),FIFO(f)

    -perm mode:查找文件权限刚好等于mode 的文件,比如4755

    -perm -mode:查找文件权限必须包括mode 的文件

    -perm +mode:查找文件权限包含任一mode 的文件

    4.其他可进行的操作

    -exec  command:用command指令来处理查找到的结果

    -print:将结果打印(默认)

    举例:

    [root@localhost tmp]# find . -perm +600
    find: warning: you are using `-perm +MODE'.  The interpretation of `-perm +omode' changed in findutils-4.5.11.  The syntax `-perm +omode' was removed in findutils-4.5.12, in favour of `-perm /omode'.
    ./yum.log
    ./hogsuspend
    ./ssh-Vl2SngviB1oB/agent.12163
    ./ssh-UyGb6ozbY7Su/agent.2798
    ./ssh-SlOFs0GOllv6/agent.3138
    ./ssh-0ASJ8KD3h4uu/agent.4027
    ./ssh-tk2YPsSGUr7c/agent.4794
    ./yum_save_tx.2016-06-27.13-25.jKQG67.yumtx
    ./yum_save_tx.2016-06-28.09-26._uGWlP.yumtx
    ./yum_save_tx.2016-06-27.14-46.8vdzCP.yumtx
    ./testing/testing
    ./yum_save_tx.2016-06-27.13-40.sLfZTd.yumtx
    ./ssh-7pbhryxqFMUw/agent.2872
    ./yum_save_tx.2016-06-27.14-37.wVK_cv.yumtx
    ./yum_save_tx.2016-06-27.14-40.YkzgxH.yumtx
    ./yum_save_tx.2016-06-28.08-15.U5XBSB.yumtx
    ./ssh-vMa62Qd9SUbS/agent.4144
    [root@localhost tmp]# find . -perm +600 -exec ls -l {} ;
    find: warning: you are using `-perm +MODE'.  The interpretation of `-perm +omode' changed in findutils-4.5.11.  The syntax `-perm +omode' was removed in findutils-4.5.12, in favour of `-perm /omode'.
    -rw-------. 1 root root 0 6月  24 19:10 ./yum.log
    prw-------. 1 root root 0 6月  28 11:14 ./hogsuspend
    srw-------. 1 wuchao wuchao 0 6月  24 11:38 ./ssh-Vl2SngviB1oB/agent.12163
    srw-------. 1 root root 0 6月  27 16:16 ./ssh-UyGb6ozbY7Su/agent.2798
    srw-------. 1 root root 0 6月  28 08:14 ./ssh-SlOFs0GOllv6/agent.3138
    srw-------. 1 root root 0 6月  28 08:17 ./ssh-0ASJ8KD3h4uu/agent.4027
    srw-------. 1 root root 0 6月  28 08:18 ./ssh-tk2YPsSGUr7c/agent.4794
    -rw-------. 1 root root 151271 6月  27 13:25 ./yum_save_tx.2016-06-27.13-25.jKQG67.yumtx
    -rw-------. 1 root root 151271 6月  28 09:26 ./yum_save_tx.2016-06-28.09-26._uGWlP.yumtx
    -rw-------. 1 root root 869 6月  27 14:46 ./yum_save_tx.2016-06-27.14-46.8vdzCP.yumtx
    -rw-------. 1 root root 0 6月  27 20:52 ./testing/testing
    -rw-------. 1 root root 151271 6月  27 13:40 ./yum_save_tx.2016-06-27.13-40.sLfZTd.yumtx
    srw-------. 1 root root 0 6月  27 14:24 ./ssh-7pbhryxqFMUw/agent.2872
    -rw-------. 1 root root 869 6月  27 14:38 ./yum_save_tx.2016-06-27.14-37.wVK_cv.yumtx
    -rw-------. 1 root root 869 6月  27 14:40 ./yum_save_tx.2016-06-27.14-40.YkzgxH.yumtx
    -rw-------. 1 root root 151271 6月  28 08:15 ./yum_save_tx.2016-06-28.08-15.U5XBSB.yumtx
    srw-------. 1 root root 0 6月  28 11:17 ./ssh-vMa62Qd9SUbS/agent.4144
    [root@localhost tmp]# 

     注意:发现在Ubuntu系统中没有-perm +mode,而是由-perm /mode替代,以下在Ubuntu的例子:

    wuchao@wuchao-Lenovo:~/work$ ls -l
    -rw-rw-r-- 1 wuchao wuchao   12 9月  26 11:07 file1           664
    -rwxrw---x 1 wuchao wuchao 7634 9月  26 10:56 read.md         761
    
    wuchao@wuchao-Lenovo:~/work$ find . -perm -641          //权限为641及以上
    .
    ./read.md
    
    wuchao@wuchao-Lenovo:~/work$ find . -perm -640      //权限为640及以上
    .
    ./file1
    ./read.md
    
    wuchao@wuchao-Lenovo:~/work$ find . -perm /640      //权限为640及以下
    .
    ./file1
    ./read.md
    wuchao@wuchao-Lenovo:~/work$ find . -perm /641      //权限为641及以下
    .
    ./file1
    ./read.md


    wuchao@wuchao-Lenovo:~/work$ find . -perm -020      //查看用户组具有w权限的文件
    .
    ./file1
    ./read.md


     

  • 相关阅读:
    Babel下的ES6兼容性与规范
    链接属性rel=’external’、rel=’nofollow’、rel=’external nofollow’三种写法的区别
    Art-template模板
    常用 Git 命令清单
    四种常见的 POST 提交数据方式
    前端面试题
    素数筛法
    编程之美 2.12 快速寻找满足条件的两个数 解法三证明 (算法导论 第二版 2.3-7 在n个元素的集合S中找到两个和为x的元素)
    NOIP1996 提高组 挖地雷
    全排列生成算法
  • 原文地址:https://www.cnblogs.com/wuchaodzxx/p/5622801.html
Copyright © 2020-2023  润新知