zoukankan      html  css  js  c++  java
  • Linux文件管理

    1.文件管理概述

    1.Bash Shell对文件进行管理

    谈到Linux文件管理,首先我们需要了解的就是,我们要对文件做些什么事情?
    其实无非就是对一个文件进行、创建、复制、移动、查看、编辑、压缩、查找、删除、等等
    例如 : 当我们想修改系统的主机名称,是否应该知道文件在哪,才能去做对应的修改?

    2.内容摘要

    系统目录结构
    文件路径定位
    文件管理命令
    文件类型file
    链接文件ln
    文件编辑vim

    2.系统目录结构

    几乎所有的计算机操作系统都是使用目录结构组织文件。具体来说就是在一个目录中存放子目录和文件, 而在子目录中又会进一步存放子目录和文件,以此类推形成一个树状的文件结构,由于其结构很像一棵树的分支, 所以该结构又被称为“目录树”。
    Windows: 以多根的方式组织文件 C: D:
    Linux:以单根的方式组织文件 /

    如下图为Centos7的目录结构
    img

    1.存放命令相关的目录

    /bin, 普通用户使用的命令 /bin/ls, /bin/date
    /sbin,管理员使用的命令 /sbin/service,poweroff,useradd…

    只要看到bin路径,就应该意识到放的是可执行文件

    img

    2.存放用户相关数据的家目录,比如:windows不同的用户登陆系统显示的桌面背景不一样

    /home,普通用户的家目录, 默认为/home/username

    环境变量的东西不要删,删掉试一下

    /root,超级管理员root的家目录, 普通用户无权操作
    img

    3.系统文件目录

    /usr,相当于C:Windows
    /usr/local,软件安装的目录,相当于C:Program
    /usr/bin/,普通用户使用的应用程序(重要)
    /usr/sbin,管理员使用的应用程序(重要)
    /usr/lib,库文件Glibc 32bit
    /usr/lib64,库文件Glibc 64bit

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    # 1 
    df -h #df -h查看系统中文件的使用情况
    Size 分割区总容量
    Used 已使用的大小
    Avail 剩下的大小
    Use% 使用的百分比
    Mounted on 路径地址
    # 2
    du -sh * 查看当前目录下各个文件及目录占用空间大小
    du -sh /usr/
    # 3 标准是实现自动化的基础
    不通主机的相同的软件,都放在相同路径下,便于管理,实现自动化
    现在一般安装的软件,不放在/usr/local下了

    # 4 总共有一千来个命令
    ls /usr/bin/ | wc -l
    ls /usr/sbin/ | wc -l

    # 5 查看命令依赖那些库文件
    ldd /bin/ls

    img

    4.启动目录

    /boot 存放的系统启动相关的文件,例如:kernel,grub(引导装载程序)

    1
    2
    3
    ls /boot
    # linux内核
    # 启动机器时可以选择的启动模式

    img

    5.配置文件目录

    /etc,极其重要,后续所有服务的配置都在这个目录中
    /etc/sysconfig/network-script/ifcfg-,网络配置文件
    /etc/hostname,系统主机名配置文件,主机名很重要,有些特殊服务要依赖主机名,没有主机名会报错起不来;修改了要重启:reboot
    /etc/resolv.conf,dns客户端配置文件,域名解析服务器,一般我们不配置,因为网卡的配置好了,会覆盖掉它,网卡的优先级高
    /etc/hosts,本地域名解析配置文件,域名解析,先找自己的hosts,再去域名解析

    1
    2
    3
    4
    5
    6
    7
    # 1 
    /etc/hosts 对应windows C:windows/system32/drivers/etc/hosts,黑客钓鱼网站
    # 2 测试修改
    yum install httpd -y
    systemctl stop firewalld
    echo "lqz NB" >/var/www/html/index.html
    systemctl start httpd

    6.可变的目录与临时目录

    /var,存放一些变化文件,比如/var/log/下的日志文件,登陆日志
    /var/tmp,进程产生的临时文件
    /tmp,系统临时目录(类似于公共厕所),谁都可以使用

    1
    2
    3
    # 1 查看登陆日志
    cat /var/log/secure #查看登陆时间
    # 2 进程产生的临时文件(360清理垃圾,就是会清理)

    7.设备目录文件

    /dev,存放设备文件,比如硬盘,硬盘分区,光驱,等等
    /dev/sd 硬盘设备
    /dev/null,黑洞设备,只进不出。类似于垃圾回收站
    /dev/random,生成随机数的设备
    /dev/zero,能远远不断的产生数据,类似于取款机,随时随地取钱

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    # 1 sda sdb sdc sda1 sdb4
    linux中磁盘文件叫sd,第一个硬盘叫a,第二个叫b,sda1表示第一个磁盘的第一个分区,sdb4:第二个硬盘的第四个分区(服务可以插很多硬盘)
    # 2 /dev/null
    ls >/dev/null
    # 3 /dev/random 生成随机数
    echo $RANDOM
    echo lqz_$RANDOM
    批量创建随机用户,批量设置密码
    # 4 源源不断取数据
    dd if=/dev/zero of=/opt/test.txt bs=1M count=1024
    '''
    dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。
    if=文件名:输入文件名,缺省为标准输入。即指定源文件。< if=input file >
    of=文件名:输出文件名,缺省为标准输出。即指定目的文件。< of=output file >
    bs=bytes:同时设置读入/输出的块大小为bytes个字节。
    count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。
    '''

    ll /opt/test.txt
    ll -h /opt/test.txt

    img

    8.虚拟的文件系统(如对应的进程停止则/proc下对应目录则会被删除)

    /proc,反映系统当前进程的实时状态 :process
    PS:类似于小汽车的仪表板,能够看到汽车是否有故障,或者是否缺油了。

    1
    2
    3
    4
    ls /proc # 可以看到很多id号,pid号,进程号,唯一
    ls 进程id号的文件夹
    如果进程被关闭,id号的文件夹就没了
    id号每次启动都不唯一,只有一个进程唯一,systemd 是进程号1的进程,所有进程都是基于它派生出来的

    9 其他

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #1 media:提供设备的挂载点,媒体文件
    # linux 新增了盘符,需要手动挂载
    # 把光盘里的数据,挂载到media目录
    mount /dev/cdrom /media/

    # 2 mnt:提供设备的挂载点(同上)

    # 3 opt:第三方工具,第三方软件默认安装的(mysql...)

    # run :下有pid,log结尾的文件
    ls /run
    cat sshd.pid # 进程运行的pid号,放在文件中
    ps aux |grep sshd

    # .lock文件的作用,锁机制
    # 假设现在执行
    yum install tree
    # 再开一个窗口执行相同命令
    yum install tree
    '''
    Another app is currently holding the yum lock; waiting for it to exit...
    The other application is: yum
    Memory : 71 M RSS (470 MB VSZ)
    Started: Tue Aug 18 00:26:31 2020 - 00:24 ago
    State : Sleeping, pid: 6191
    '''
    cat /run/yum.pid

    10.PS: 在Linux7系统中,

    /bin, /sbin, /lib, /lib64都以软链接的形式链接到/usr/目录下

    /bin –> /usr/bin
    /sbin –> /usr/sbin
    lib -> usr/lib
    lib64 -> usr/lib64

    3.文件路径定位

    在我们开始操作文件前,首先需要对文件进行定位,比如:
    你要在哪创建什么文件? 你要将文件复制到什么地方? 或者你要删除的文件在什么地方?
    那什么是定位: 比如/etc/hostname,整个文件中包含文件名称以及文件所在的位置,我们将这个叫做路径,那么路径就是对文件进行定位的一种方式。例:如下图的message所在的路径是?
    img
    提问FQ: /home/oldboy/file 和/home/oldgirl/file是否是同一个文件?

    1.每个目录下都有一个.和..的目录是干啥的?

    一个点代表当的是当前目录, 两个点代表的是当前目录的上层目录。
    假设当前目录在/usr/下, 那么它的上层(/)目录用../表示, 而/usr/的下层(local)目录则用./local表示。

    2.那什么是绝对路径,什么又是相对路径呢?

    绝对路径: 只要从/开始的路径,比如/home/alice/file
    相对路径: 相对于当前目录来说,比如 a.txt ./a.txt ../bob/a.mp3 [加入: 此时在目录/home/alice]
    小结: 所谓的(.)和(..)目录实际上属于相对路径的一种表示形式。

    3.绝对路径与相对路径示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #绝对路径
    [root@bgx /]# useradd alice
    [root@bgx /]# touch /home/alice/file1
    [root@bgx /]# touch ~/file2
    [root@bgx /]# touch ~alice/file3

    #相对路径
    [root@bgx /]# mkdir abc
    [root@bgx /]# touch ../file3
    [root@bgx /]# touch file4
    [root@bgx /]# touch abc/file5

    cd改变目录,常见的使用方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # cd 绝对路径 cd /etc/hostname
    # cd 相对路径 cd test/abc cd . cd ..


    # cd #切换目录,例: cd /etc
    # cd - #切换回上一次所在的目录
    # cd ~ #切换回当前用户的家目录,注意:root和普通用户是否有所不同吗?
    # cd . #代表当前目录,一般在拷贝、移动等情况下使用 cp /etc/hostname ./
    # cd .. #切换回当前目录的上级目录

    4.系统文件管理

    1.文件管理之: 创建/复制/移动/删除

    创建

    1.文件创建命令touch

    1
    2
    3
    4
    5
    6
    # touch file                    #无则创建,有则修改时间
    # touch file2 file3
    # touch /home/od/file4 file5
    # touch file{a,b,c} #{}集合,等价 touch a b c
    # touch file{1..10}
    # touch file{a..z}

    2.目录创建命令mkdir

    1
    2
    3
    4
    5
    6
    # 选项:-v 显示详细信息  -p 递归创建目录
    # mkdir dir1
    # mkdir /home/od/dir1 /home/od/dir2
    # mkdir -v /home/od/{dir3,dir4}
    # mkdir -pv /home/od/dir5/dir6
    # mkdir -pv /home/{od/{diu,but},boy}

    3.以树状显示目录结构命令tree

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 选项: -L: 显示目录树的层级
    # tree /home/od/ #显示当前目录下的结构
    /home/od/
    ├── but
    ├── dir1
    ├── dir2
    ├── dir3
    ├── dir4
    ├── dir5
    │ └── dir6
    └── diu

    cp复制

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #选项: -v:详细显示命令执行的操作 -r: 递归处理目录与子目录 -p: 保留源文件或目录的属性

    # cp file /tmp/file_copy
    # cp name /tmp/name #不修改名称
    # cp file /tmp/ #不修改名称
    # cp -p file /tmp/file_p #-p保持原文件或目录的属性
    # cp -r /etc/ /tmp/ #复制目录需要使用-r参数, 递归复制
    # cp -rv /etc/hosts /etc/hostname /tmp #拷贝多个文件至一个目录
    # cp -rv /etc/{hosts,hosts.bak}
    # cp -rv /etc/hosts{,-org}

    mv移动

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # mv file file1             #原地移动算改名
    # mv file1 /tmp/ #移动文件至tmp目录
    # mv /tmp/file1 ./ #移动tmp目录的文件至当前目录
    # mv dir/ /tmp/ #移动目录至/tmp目录下

    # touch file{1..3}
    # mv file1 file2 file3 /opt/ #移动多个文件或至同一个目录

    # mkdir dir{1..3}
    # mv dir1/ dir2/ dir3/ /opt #移动多个目录至同一个目录

    rm删除

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #选项:-r: 递归 -f: 强制删除 -v: 详细过程
    # rm file.txt #删除文件, 默认rm存在alias别名,rm -i所以会提醒是否删除文件
    # rm -f file.txt #删除文件, 不提醒


    # rm -r dir/ #递归删除目录,会提示
    # rm -rf dir/ #强制删除目录,不提醒(慎用)


    #1.rm删除示例
    # mkdir /home/dir10
    # touch /home/dir10/{file2,file3,.file4}
    # rm -f /home/dir10/ //不包括隐藏文件
    # ls /home/dir10/ -a
    . .. .file4


    #2.rm删除示例2
    # touch file{1..10}
    # touch {1..10}.pdf
    # rm -rf file
    # rm -rf .pdf

    2.文件管理之:查看文件内容(cat tac less more head tail tailf grep …)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40

    #------cat
    # cp /etc/passwd ./pass
    # cat pass #正常查看文件方式
    # cat -n pass #-n显示文件有多少行
    # cat -A pass #查看文件的特殊符号,比如文件中存在tab键
    # tac pass #倒序查看文件
    cat >> test2.txt <<EOF
    ads
    adf
    EOF

    #------less、more
    # less /etc/services #使用光标上下翻动,空格进行翻页,q退出
    # more /etc/services #使用回车上下翻动,空格进行翻页,q退出(有百分比)

    #------head
    # head pass #查看头部内容,默认前十行
    # head -n5 pass #查看头部5行,使用-n指定
    # ps aux | head -5 # 只看头部5个进程

    #------tail
    # tail pass # 查看文件尾部,默认10行
    # tail -20 /var/log/secure # 查看文件尾部20行
    # tail -f /var/log/messages #-f动态查看文件尾部的变化
    # tailf /var/log/messages #查看文件尾部的变化
    # ps aux | tail -2

    #------grep过滤文件内容
    # grep "^root" pass #匹配以root开头的行
    # grep "bash$" pass #匹配以bash结尾的行
    # grep -i "ftp" pass #忽略大小写匹配
    # grep -Ei "sync$|ftp" pass #匹配文件中包含sync结尾或ftp字符串
    # grep -n -A 2 "Failed" /var/log/secure #匹配/var/log/secure文件中Failed字符串,并打印它的下2行
    # grep -n -B 2 "Failed" /var/log/secure #匹配/var/log/secure文件中Failed字符串,并打印它的上2行
    # grep -n -C 2 "Failed" /var/log/secure #匹配/var/log/secure文件中Failed字符串,并打印它的上下2行

    # 上翻,下翻
    control+b:下翻
    control+f:上翻

    3.文件管理之:联网下载文件(wget、curl)、文件上传与下载(rz、sz)

    wget、curl联网下载文件

    1
    2
    3
    4
    5
    6
    7
    yum install wget -y
    #选项: -O: 指定下载地址
    # wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

    # crul:浏览网络上资源,-o保存到本地
    #选项: -o: 指定下载地址
    # curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

    rzsz上传下载文件

    1
    2
    3
    4
    # yum install lrzsz -y  #不安装软件则无法执行该命令

    # rz #只能上传文件文件上传(不能大于4g)
    # sz /path/file #只能下载文件

    4.文件管理之:文件或命令查找(locate、which、whereis、find)

    文件查找

    1
    2
    # locate /etc/sh       #搜索etc目录下所有以sh开头的文件
    # locate -i /etc/sh #搜索etc目录下,所有以sh开头的文件,忽略大小写

    命令查找

    1
    2
    3
    4
    5
    6
    7
    8
    # which ls  #查找ls命令的绝对路径

    # whereis ls //查找命令的路径、帮助手册、等
    # whereis -b ls //仅显示命令所在的路径,仅看二进制

    # 对于内核相关的一些命令,用which whereis 是无法查询到的,需要使用type采查询
    # type -a ls #查看命令的绝对路径(包括别名)
    # type -a for

    5.文件管理之:字符处理命令(sort、uniq、cut、sed、awk、wc、)

    sort排序

    在有些情况下,需要对应一个无序的文本文件进行数据的排序,这时就需要使用sort进行排序了。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    sort [OPTION]... [FILE]...
    # -r:倒序 -n:按数字排序 -t:指定分隔符(默认空格) -k:指定第几列, 指定几列几字符(指定1,1 3.1,3.3)

    #1.首先创建一个文件,写入一写无序的内容
    [root@lqz ~]# cat >> file.txt <<EOF
    b:3
    c:2
    a:4
    e:5
    d:1
    f:11
    EOF

    #2.使用sort下面对输出的内容进行排序
    [root@lqz ~]# sort file.txt
    a:4
    b:3
    c:2
    d:1
    e:5
    f:11

    #结果并不是按照数字排序,而是按字母排序。
    #可以使用-t指定分隔符, 使用-k指定需要排序的列。
    # -t 指定分隔符,-k指定列,按第二列排序
    [root@lqz ~]# sort -t ":" -k2 file.txt
    d:1
    f:11 #第二行为什么是11?不应该按照顺序排列?
    c:2
    b:3
    a:4
    e:5

    #按照排序的方式, 只会看到第一个字符,11的第一个字符是1, 按照字符来排序确实比2小。
    #如果想要按照数字的方式进行排序, 需要使用 -n参数,按数字排序。
    [root@lqz ~]# sort -t ":" -n -k2 file.txt
    d:1
    c:2
    b:3
    a:4
    e:5
    f:11


    #测试案例,下载文件http://fj.xuliangwei.com/public/ip.txt,对该文件进行排序
    [root@lqz ~]# sort -t. -k3.1,3.1nr -k4.1,4.3nr ip.txt

    uniq去重
    如果文件中有多行完全相同的内容,当前是希望能删除重复的行,同时还可以统计出完全相同的行出现的总次数, 那么就可以使用uniq命令解决这个问题(但是必须配合sort使用,相邻的才能去重,所以要配合sort)。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    uniq [OPTION]... [INPUT [OUTPUT]]
    #选项:-c 计算重复的行

    #1.创建一个file.txt文件:
    [root@lqz ~]# cat >>file2.txt <<EOF
    abc
    123
    abc
    123
    EOF
    #2.uniq需要和sort一起使用, 先使用sort排序, 让重复内容连续在一起
    [root@lqz ~]# cat file.txt |sort
    123
    123
    abc
    abc
    #3.使用uniq去除相邻重复的行
    [root@lqz ~]# cat file.txt |sort|uniq
    123
    abc
    #4.-c参数能统计出文件中每行内容重复的次数
    [root@lqz ~]# cat file.txt |sort|uniq -c
    2 123
    2 abc

    cut截取字段

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    cut OPTION... [FILE]...
    #选项:-d 指定分隔符 -f 数字,取第几列 –f3,6三列和6列 -c 按字符取(空格也算)
    #echo "Im lqz, is QQ 306334678" >file.txt
    #过滤出文件里 lqz以及306334678

    #实现上述题目几种思路
    # cut -d " " -f2,5 file.txt
    # cut -d " " -f2,5 file.txt |sed 's#,##g'
    # sed 's#,# #g' file.txt | awk -F " " '{print $2 " " $5}'
    # awk '{print $2,$5}' file.txt |awk -F ',' '{print $1,$2}'
    # awk -F "[, ]" '{print $2,$6}' file.txt
    # awk -F '[, ]+' '{print $2,$5}' file.txt

    # awk 取列
    awk '{print $2,$5}' file.txt
    # -F 指定分隔符
    awk '{print $2,$5}' file.txt | awk -F "," '{print $1,$2}'

    # sed 替换 sed 's###g'
    # sed 's###g' 固定写法
    # sed 's#,##g' 把逗号替换成空
    cut -d " " -f2,5 file.txt | sed 's#,##g'

    wc统计行号

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    wc [OPTION]... [FILE]...
    #选项:-l显示文件行数 -c显示文件字节 -w显示文件单词

    # wc -l /etc/fstab #统计/etc/fstab文件有多少行
    # wc -l /etc/services #统计/etc/services 文件行号
    # ls |wc -l #统计当前路径下有多少文件和文件夹

    #扩展方法
    # grep -n "." /etc/services | tail -1
    # awk '{print NR $0}' /etc/services | tail -1
    # cat -n /etc/services | tail -1

    习题: 分析如下日志,统计每个域名被访问的次数。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [root@student tmp]# cat web.log 
    http://www.lqz.com/index.html
    http://www.lqz.com/1.html
    http://post.lqz.com/index.html
    http://mp3.lqz.com/index.html
    http://www.lqz.com/3.html
    http://post.lqz.com/2.html

    # awk -F '/' '{print $3}' web.log|sort -rn|uniq –c
    # cut -d / -f3 web.log|sort -rn|uniq –c

    习题: 使用awk取出系统的IP地址图解
    img

    5.系统文件属性

    当我们使用ls -l列目录下所有文件时,通常会以长格式的方式显示,其实长格式显示就是我们Windows下看到的文件详细信息,我们也将其称为文件属性,那整个文件的属性分为十列。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [root@lqz ~]# ls -l ks.cfg
    [root@lqz ~]# ll -h ks.cfg
    -rw-------. 1 root root 4434 May 30 13:58 ks.cfg

    #
    -rw-------. ①:第一个字符是文件类型,其他则是权限
    1 ②:硬链接次数
    root ③:文件属于哪个用户
    root ④:文件属于哪个组
    4434 ⑤:文件大小
    May30 13:58 ⑥⑦⑧:最新修改的时间与日期
    ks.cfg ⑨:文件或目录名称

    6.系统文件类型

    1.通常我们使用颜色或者后缀名称来区分文件类型,但很多时候不是很准确,所以我们可以通过ls -l以长格式显示一个文件的属性,通过第一列的第一个字符来近一步的判断文件具体的类型。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    [root@lqz ~]# ll -d /etc/hosts /tmp /bin/ls  /dev/sda /dev/tty1 /etc/grub2.cfg /dev/log /run/dmeventd-client
    -rwxr-xr-x. 1 root root 117656 Jun 30 2016 /bin/ls
    srw-rw-rw-. 1 root root 0 Jan 20 10:35 /dev/log
    brw-rw----. 1 root disk 8, 0 Jan 20 10:36 /dev/sda
    crw--w----. 1 root tty 4, 1 Jan 20 10:36 /dev/tty1
    lrwxrwxrwx. 1 root root 22 Jan 13 11:31 /etc/grub2.cfg -> ../boot/grub2/grub.cfg
    -rw-r--r--. 1 root root 199 Jan 20 11:03 /etc/hosts
    prw-------. 1 root root 0 Jan 20 10:36 /run/dmeventd-client
    drwxrwxrwt. 61 root root 8192 Jan 21 13:01 /tmp

    #说明
    - #普通文件(文本, 二进制, 压缩, 图片, 日志等)
    d #目录文件
    b #设备文件(块设备)存储设备硬盘 /dev/sda1, /dev/sda2
    c #设备文件(字符设备),终端 /dev/tty1, /dev/zero
    s #套接字文件, 进程间通信(socket)
    p #管道文件
    l #链接文件

    2.但有些情况下,我们无法通过ls -l文件的类型,比如: 一个文件,它可能是普通文件、也可能是压缩文件、或者是命令文件等,那么此时就需要使用file来更加精准的判断这个文件的类型。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    [root@lqz ~]# file /etc/hosts
    /etc/hosts: ASCII text

    [root@lqz ~]# file /bin/ls
    /bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=aa7ff68f13de25936a098016243ce57c3c982e06, stripped

    [root@lqz ~]# file /dev/sda
    /dev/sda: block special

    [root@lqz ~]# file /dev/tty1
    /dev/tty1: character special

    [root@lqz ~]# file /etc/grub2.cfg
    /etc/grub2.cfg: broken symbolic link to `../boot/grub2/grub.cfg'

    [root@lqz ~]# file /home
    /home: directory

    [root@lqz ~]# file /run/dmeventd-client
    /run/dmeventd-client: fifo (named pipe)

    [root@lqz ~]# ll but
    -rw-r--r-- 1 root root 42125 Apr 1 12:26 but
    [root@lqz ~]# file but
    but: Zip archive data, at least v1.0 to extract

    PS: Linux文件扩展名不代表任何含义,仅为了我们能更好的识别该文件是什么类型。

    7.系统链接文件

    文件有文件名与数据,在Linux上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。
    用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方,我们将其称为Block
    元数据,即文件的附加属性,如文件大小、创建时间、所有者等信息。我们称其为Inode
    在Linux中,inode是文件元数据的一部分但其并不包含文件名,inode号即索引节点号)
    文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。图1.展示了程序通过文件名获取文件内容的过程。
    img

    Linux 系统引入了两种链接:硬链接 (hard link) 与软链接(又称符号链接,即 soft link 或 symbolic link)

    ll -i 查看inode

    1.什么是软链接

    软链接相当于Windows的快捷方式,软链接文件会将inode指向源文件的block,当我们访问这个软链接文件时,其实访问的是源文件本身。那么当我们对一个文件创建多个软链接,其实就是多个inode指向同一个block。当我们删除软链接文件时,其实只是删除了一个inode指向,并不会对源文件源文件造成影响,但如果删除的是源文件则会造成所有软链接文件失效。

    img

    2.什么是硬链接

    若一个inode号对应多个文件名,则称这些文件为硬链接。换言之,硬链接就是同一个文件使用了多个别名,如下图hard link 就是 file 的一个别名,他们有共同的 inode。
    img

    3.软链接实践

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #文件软链接示例
    touch /root/file
    ln -s /root/file /tmp/file_bak
    ll /tmp/file_bak //root下file链接到/tmp下并重命名为file_bak


    #目录软链接示例
    mkdir /soft/nginx1.1 -p
    ln -s /soft/nginx1.1/ /soft/nginx
    ll /soft/nginx //查看链接指向

    #软链接使用场景
    1.软件升级
    2.企业代码发布
    3.不方便目录移动

    4.硬链接实践

    1
    2
    3
    4
    5
    #文件硬链接示例
    ln /root/file /tmp/file_hard
    ll /tmp/file_hard

    #PS:目录不能创建硬链接,硬链接文件可以用rm命令删除

    5.硬链接与软链接区别
    1)ln命令创建硬链接,ln -s命令创建软链接。
    2)目录不能创建硬链接,并且硬链接不可以跨越分区系统。
    3)目录软链接特别常用,并且软链接支持跨越分区系统。
    4)硬链接文件与源文件的inode相同,软链接文件与源文件inode不同。
    5)删除软链接文件,对源文件及硬链接文件无任何影响。
    6)删除文件的硬链接文件,对源文件及链接文件无任何影响。
    7)删除链接文件的源文件,对硬链接无影响,会导致软链接失效。
    8)删除源文件及其硬链接文件,整个文件会被真正的删除。

    1.find查找概述

    为什么要有文件查找,因为很多时候我们可能会忘了某个文件所在的位置,此时就需要通过find来查找。
    find命令可以根据不同的条件来进行查找文件,例如:文件名称、文件大小、文件修改时间、属主属组、权限、等等方式。同时find命令是Linux下必须掌握的。

    find 命令的基本语法如下

    命令路径选项表达式动作
    find [path…] [options] [expression] [action]
    查找 地区 妹纸 18-25岁 约?

    2.find查找示例

    以下列出所有find常用的选项

    1.find名称查找

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #1.创建文件
    touch /etc/sysconfig/network-scripts/{ifcfg-eth1,IFCFG-ETH1}

    #2.查找/etc目录下包含ifcfg-eth0名称的文件
    [root@lqz ~]# find /etc -name "ifcfg-eth1"

    #3.-i 忽略大小写
    [root@lqz ~]# find /etc -iname "ifcfg-eth1"
    #查找/etc目录下包含ifcfg-eth名称所有文件
    [root@lqz ~]# find /etc/ -name "ifcfg-eth*"
    [root@lqz ~]# find /etc -iname "ifcfg-eth*"

    2.find大小查找

    1
    2
    3
    4
    5
    6
    7
    8
    #1.查找大于5M的文件
    [root@lqz ~]# find /etc -size +5M

    #2.查找等于5M的文件
    [root@lqz ~]# find /etc -size 5M

    #3.查找小于5M的文件
    [root@lqz ~]# find /etc -size -5M

    3.find类型查找

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # f 文件
    [root@lqz ~]# find /dev -type f
    # d 目录
    [root@lqz ~]# find /dev -type d
    # l 链接
    [root@lqz ~]# find /dev -type l
    # b 块设备
    [root@lqz ~]# find /dev -type b
    # c 字符设备
    [root@lqz ~]# find /dev -type c
    # s 套接字
    [root@lqz ~]# find /dev -type s
    # p 管道文件
    [root@lqz ~]# find /dev -type p

    4.find时间查找

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #1.创建测试文件(后期shell会讲)
    [root@lqz ~]# for i in {01..28};do date -s 201904$i && touch file-$i;done

    #2.查找7天以前的文件(不会打印当天的文件)
    [root@lqz ~]# find ./ -iname "file-*" -mtime +7

    #3.查找最近7天的文件,不建议使用(会打印当天的文件)
    [root@lqz ~]# find ./ -iname "file-*" -mtime -7

    #4.查找第7天文件(不会打印当天的文件)
    [root@lqz ~]# find ./ -iname "file-*" -mtime 7

    #5.本地文件保留最近7天的备份文件, 备份服务器保留3个月的备份文件(实际使用方案)
    find /backup/ -iname "*.bak" -mtime +7 -delete
    find /backup/ -iname "*.bak" -mtime +90 -delete

    5.find用户查找

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #查找属主是jack
    [root@lqz ~]# find /home -user jack
    #查找属组是admin
    [root@lqz ~]# find /home -group admin
    #查找属主是jack, 属组是admin
    [root@lqz ~]# find /home -user jack -group admin
    #查找属主是jack, 并且属组是admin
    [root@lqz ~]# find /home -user jack -a -group admin
    #查找属主是jack, 或者属组是admin
    [root@lqz ~]# find /home -user jack -o -group admin
    #查找没有属主
    [root@lqz ~]# find /home -nouser
    #查找没有属组
    [root@lqz ~]# find /home -nogroup
    #查找没有属主或属组
    [root@lqz ~]# find /home -nouser -o -nogroup

    6.find权限查找

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #精切匹配644权限
    [root@lqz ~]# find . -perm 644 -ls

    #包含444权限即可
    [root@lqz ~]# find . -perm -444 -ls
    #查找全局可写(每位权限必须包含w)
    [root@lqz ~]# find . -perm -222 -ls
    #包含set uid
    [root@lqz ~]# find /usr/sbin -perm -4000 -ls
    #包含set gid
    [root@lqz ~]# find /usr/sbin -perm -2000 -ls
    #包含sticky
    [root@lqz ~]# find /usr/sbin -perm -1000 -ls

    2.find动作处理,比如查找到一个文件后,需要对文件进行如何处理, find的默认动作是 -print

    动作含义
    -print 打印查找到的内容(默认)
    -ls 以长格式显示的方式打印查找到的内容
    -delete 删除查找到的文件(仅能删除空目录)
    -ok 后面跟自定义 shell 命令(会提示是否操作)
    -exec 后面跟自定义 shell 命令(标准写法 -exec ;)

    1.find查找后的动作命令示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #1.使用-print打印查找到的文件
    [root@lqz ~]# find /etc -name "ifcfg*"
    [root@lqz ~]# find /etc -name "ifcfg*" -print

    #2.使用-ls打印查找到的文件,以长格式显示
    [root@lqz ~]# find /etc -name "ifcfg*" -ls

    #3.使用-delete删除文件,但仅能删除空目录
    [root@lqz ~]# find /etc -name "ifcfg*" -delete

    #4.使用-ok实现文件拷贝,但会提示是否拷贝
    [root@lqz ~]# find /etc -name "ifcfg*" -ok cp -rvf {} /tmp ;

    #5.使用-exec实现文件拷贝和文件删除。
    [root@lqz ~]# find /etc -name "ifcfg*" -exec cp -rvf {} /tmp ;
    [root@lqz ~]# find /etc -name "ifcfg*" -exec rm -f {} ;

    2.使用find命令结合xargs

    1
    2
    3
    4
    #xargs将前者命令查找到的文件作为一个整体传递后者命令的输入
    [root@lqz ~]# touch file.txt
    [root@lqz ~]# find . -name "file.txt" |xargs rm -f
    [root@lqz ~]# find . -name "file.txt" |xargs -I {} cp -rvf {} /var/tmp

    3.find逻辑运算符

    符号作用
    -a
    -o
    -not|!
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #1.查找当前目录下,属主不是hdfs的所有文件
    [root@lqz ~]# find . -not -user hdfs
    [root@lqz ~]# find . ! -user hdfs

    #2.查找当前目录下,属主属于hdfs,且大小大于300字节的文件
    [root@lqz ~]# find . -type f -a -user hdfs -a -size +300c

    #3.查找当前目录下的属主为hdfs或者以xml结尾的普通文件
    [root@lqz ~]# find . -type f -a ( -user hdfs -o -name '*.xml' )
  • 相关阅读:
    2018-4-17-软件设计-白话依赖注入
    2018-2-13-wpf-PreviewTextInput-在鼠标输入获得-_u0003
    2018-5-23-为何-987654321_123456789-的值是-8.0000000729
    寄存器位写操作
    Linux多IP配置
    Kconfig和Makefile
    linux设置网卡速率
    Winmanager,NERDTree和MiniBufExplorer
    SuperTab
    ping
  • 原文地址:https://www.cnblogs.com/bubu99/p/12203028.html
Copyright © 2011-2022 走看看