Linux 文件系统基本管理

识别文件系统和设备

Linux 中设备

在Linux中,对存储设备的访问由特殊类型文件-块设备(block)提供。挂载块设备前,必须先使用文件系统对其进行格式化。

块设备文件与其他的设备文件一起存储在/dev目录中。设备文件是由操作系统自动创建的。

常见的不同类型接口块设备:

  • 接口:SATA/SAS/USB/SCSI,名称:/dev/sda、/dev/sdb …
  • 接口:virtio-blk,虚拟机磁盘,名称:/dev/vda、/dev/vdb …
  • 接口:NVMe SSD,名称:/dev/nvme0n1、/dev/nvme1n1…
  • 接口:SD/MMC/eMMC,名称:/dev/mmcblk0,/dev/mmcblk1 …

通常,不会将整个存储设备格式化为一个文件系统中,而是将硬盘驱动器划分为多个逻辑存储单元, 这些单元称为分区。各种分区使用不同的文件系统进行格式化或用于不同的用途。 例如,一个分区可以包含用户目录,而另一个分区可以包含系统数据和日志。 如果用户用数据填充主目录分区,则系统分区可能仍然有可用空间。

  • /dev/sda第一个分区为/dev/sda1,第二个分区为/dev/sda2,以此类推。
  • /dev/vda1,/dev/vda2
  • /dev/xvda1,/dev/xvda2
  • /dev/nvme0n1p1,/dev/nvme0n1p2

Linux 文件系统

文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构,即在存储设备上组织文件的方法。

Linux服务器上的文件是按文件系统层次结构访问的。
在这里插入图片描述

管理文件系统需要:

  • 确定存储设备的空间使用情况以及文件系统层次结构中受影响的目录。
  • 存储设备发生故障,而您需要知道哪些文件系统存在风险。

要让文件系统的内容在文件系统层次结构中可用,必须将它挂载到一个空目录上,该目录被称为挂载点

参考学习:这里

/linux 对应教室。

查看设备和文件系统

lsblk 命令

查看块设备使用情况。

[root@server ~ 10:38:09]# lsblk
NAME            MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda               8:0    0   200G  0 disk 
├─sda1            8:1    0     1G  0 part /boot
└─sda2            8:2    0   199G  0 part 
  ├─centos-root 253:0    0    50G  0 lvm  /
  ├─centos-swap 253:1    0   3.9G  0 lvm  [SWAP]
  └─centos-home 253:2    0 145.1G  0 lvm  /home
sr0              11:0    1   4.4G  0 rom  

结果说明:

  • NAME :块设备名。
  • MAJ:MIN :主要(MAJ)和次要(MIN)设备号。
  • RM :指明设备是否是可移动设备。注意,在本例中设备sdb和sr0的RM值等于1,这说明他们是可移动设备。
  • SIZE :本栏列出设备的容量大小信息。例如298.1G表明该设备大小为298.1GB,而1K表明该设备大小为1KB。
  • RO :该项表明设备是否为只读。在本案例中,所有设备的RO值为0,表明他们不是只读的。
  • TYPE :本栏显示块设备是否是磁盘或磁盘上的一个分区。在本例中,sda和sdb是磁盘,而sr0是只读存储(rom)。
  • MOUNTPOINT :本栏指出设备挂载的挂载点。
df 命令

查看文件系统使用情况。

[root@server ~ 10:37:43]# df
文件系统                    1K-块    已用      可用 已用% 挂载点
devtmpfs                  1995932       0   1995932    0% /dev
tmpfs                     2013056       0   2013056    0% /dev/shm
tmpfs                     2013056   12516   2000540    1% /run
tmpfs                     2013056       0   2013056    0% /sys/fs/cgroup
/dev/mapper/centos-root  52403200 5122684  47280516   10% /
/dev/sda1                 1038336  177532    860804   18% /boot
/dev/mapper/centos-home 152092100   42256 152049844    1% /home
tmpfs                      402612      12    402600    1% /run/user/42
tmpfs                      402612       0    402612    0% /run/user/1000

# -h选项,友好显示单位,单位进制是1024。
[root@server ~ 10:39:09]# df -h
文件系统                 容量  已用  可用 已用% 挂载点
devtmpfs                 2.0G     0  2.0G    0% /dev
tmpfs                    2.0G     0  2.0G    0% /dev/shm
tmpfs                    2.0G   13M  2.0G    1% /run
tmpfs                    2.0G     0  2.0G    0% /sys/fs/cgroup
/dev/mapper/centos-root   50G  4.9G   46G   10% /
/dev/sda1               1014M  174M  841M   18% /boot
/dev/mapper/centos-home  146G   42M  146G    1% /home
tmpfs                    394M   12K  394M    1% /run/user/42
tmpfs                    394M     0  394M    0% /run/user/1000

# -T选项,显示文件系统类型。
[root@server ~ 10:38:35]# df -hT
文件系统                类型      容量  已用  可用 已用% 挂载点
devtmpfs                devtmpfs  2.0G     0  2.0G    0% /dev
tmpfs                   tmpfs     2.0G     0  2.0G    0% /dev/shm
tmpfs                   tmpfs     2.0G   13M  2.0G    1% /run
tmpfs                   tmpfs     2.0G     0  2.0G    0% /sys/fs/cgroup
/dev/mapper/centos-root xfs        50G  4.9G   46G   10% /
/dev/sda1               xfs      1014M  174M  841M   18% /boot
/dev/mapper/centos-home xfs       146G   42M  146G    1% /home
tmpfs                   tmpfs     394M   12K  394M    1% /run/user/42
tmpfs                   tmpfs     394M     0  394M    0% /run/user/1000


# -H选项,单位进制是1000。
[root@server ~ 10:38:57]# df -H
文件系统                 容量  已用  可用 已用% 挂载点
devtmpfs                 2.1G     0  2.1G    0% /dev
tmpfs                    2.1G     0  2.1G    0% /dev/shm
tmpfs                    2.1G   13M  2.1G    1% /run
tmpfs                    2.1G     0  2.1G    0% /sys/fs/cgroup
/dev/mapper/centos-root   54G  5.3G   49G   10% /
/dev/sda1                1.1G  182M  882M   18% /boot
/dev/mapper/centos-home  156G   44M  156G    1% /home
tmpfs                    413M   13k  413M    1% /run/user/42
tmpfs                    413M     0  413M    0% /run/user/1000

# 查看单个文件系统
[root@server ~ 10:39:17]# df -hT /root
文件系统                类型  容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root xfs    50G  4.9G   46G   10% /

# 查看文件或目录存储在哪个设备
[root@server ~ 10:40:08]# df /tmp
文件系统                   1K-块    已用     可用 已用% 挂载点
/dev/mapper/centos-root 52403200 5122648 47280552   10% /
du 命令

查看目录和文件占用磁盘空间大小。

# 查看/boot目录及其子目录占用空间
[root@server ~ 10:40:15]# du /boot
0	/boot/efi/EFI/centos/fw
6060	/boot/efi/EFI/centos
1928	/boot/efi/EFI/BOOT
7988	/boot/efi/EFI
7988	/boot/efi
2400	/boot/grub2/i386-pc
3176	/boot/grub2/locale
2504	/boot/grub2/fonts
8096	/boot/grub2
4	/boot/grub
144316	/boot

# 只查看/boot目录占用空间
[root@server ~ 10:40:39]# du -s /boot
144316	/boot

# -h 选项human方式显示size
[root@server ~ 10:40:48]# du -sh /boot
141M	/boot
案例

查找根文件系统中哪个文件占用了大量空间。

# 环境准备,创建一个大小为4GB的文件:使用 0 填充该文件
[root@server ~ 10:42:24]# dd if=/dev/zero of=/usr/share/doc/dhclient-4.2.5/bigfile-4G  bs=1M count=4096
记录了4096+0 的读入
记录了4096+0 的写出
4294967296字节(4.3 GB)已复制,19.1829 秒,224 MB/秒

# 查看过程如下:
[root@server ~ 10:47:47]# du -sk /* |sort -n
......
42988   /etc
142368  /boot
560424  /var
7917328 /usr
[root@server ~ 10:48:22]# du -sk /usr/* |sort -n
......
866408  /usr/lib
1176764 /usr/lib64
5612684 /usr/share
[root@server ~ 10:48:43]# du -sk /usr/share/* |sort -n
......
213252  /usr/share/help
442228  /usr/share/locale
4279532 /usr/share/doc
[root@server ~ 10:49:01]# du -sk /usr/share/doc/* |sort -n
......
1192    /usr/share/doc/python-kitchen-1.1.1
1216    /usr/share/doc/postfix-2.10.1
4194316 /usr/share/doc/dhclient-4.2.5
[root@server ~ 10:50:34]# du -sk /usr/share/doc/dhclient-4.2.5/* |sort -n
4	/usr/share/doc/dhclient-4.2.5/dhclient6.conf.example
4	/usr/share/doc/dhclient-4.2.5/dhclient.conf.example
4	/usr/share/doc/dhclient-4.2.5/README.dhclient.d
4194304	/usr/share/doc/dhclient-4.2.5/bigfile-4G

# 方法二:
[root@centos7 ~]# find / -size +100M 2>/dev/null
/proc/kcore
/sys/devices/pci0000:00/0000:00:0f.0/resource1
/sys/devices/pci0000:00/0000:00:0f.0/resource1_wc
/usr/share/doc/dhclient-4.2.5/bigfile-4G
# 方法三:
[root@server ~ 11:21:53]# ls -lh $(find / -size +100M)
#删除该文件
[root@server ~ 11:14:33]# rm -f /usr/share/doc/dhclient-4.2.5/bigfile-4G

Linux 思想:尽可能使用各种小工具完成一个复杂任务。每个小工具专注于特定的功能,KISS 原则(Keep It Simple, Stupid)。

挂载和卸载文件系统

环境准备

# 虚拟机添加一块硬盘/dev/sdb
[xiaoma@server ~ 11:30:30]$ lsblk /dev/sdb
NAME MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdb    8:16   0  100G  0 disk  

# 格式化文件系统
[root@server ~ 11:32:44]# mkfs.xfs /dev/sdb
meta-data=/dev/sdb               isize=512    agcount=4, agsize=6553600 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=26214400, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=12800, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

挂载文件系统

当需要适用文件系统的时候,通过mount命令挂载。

mount 命令语法:

mount [-fnrsvw] [-t vfstype] [-o options] device mountpoint

选项说明:

  • -t vfstype,指明文件系统类型。
  • -o options,指明挂载选项。
  • device,指明要挂载的具有文件系统的设备,可以通过UUID=\、\、LABEL=\、PARTLABEL=\、PARTUUID=\等方式指明。例如,/dev/sdb,UUID=“f20547b2-df53-46e5-b526-a8744be26231” 。
  • mountpoint,指明挂载点位置。
[root@server ~ 11:33:14]# lsblk /dev/sda1
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda1   8:1    0   1G  0 part /boot
[root@server ~ 11:34:28]# 
[root@server ~ 11:34:28]# mkdir /data
[root@server ~ 11:34:59]# mount /dev/sdb /data
[root@server ~ 11:37:56]# lsblk /dev/sdb
NAME MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdb    8:16   0  100G  0 disk /data
[root@server ~ 11:38:15]# cp /etc/hos* /data
[root@server ~ 11:38:31]# ls /data
host.conf  hostname  hosts  hosts.allow  hosts.deny
[root@server ~ 11:38:38]# umount /data
[root@server ~ 11:38:50]# ls /data
# 创建挂载点
[root@server ~ 11:38:56]# mkdir /data

# 显示系统中所有文件系统
[root@server ~ 12:19:25]# blkid

# 显示系统中特定文件系统
[root@server ~ 12:20:38]# blkid /dev/sdb
/dev/sdb: UUID="f5cd6717-d826-483c-b67a-e4ba41bde1bf" TYPE="xfs"

# 挂载设备并验证
[root@server ~ 12:21:14]# mount /dev/sdb /data
# 或者
[root@server ~ 12:21:42]# mount UUID="f5cd6717-d826-483c-b67a-e4ba41bde1bf" /data


# 验证
[root@server ~ 12:21:42]# df -h /data
文件系统        容量  已用  可用 已用% 挂载点
/dev/sdb        100G   33M  100G    1% /data

# 创建文件测试
[root@server ~ 12:22:53]# touch /data/file-{00..09}
[root@server ~ 12:23:36]# ls /data
file-00  file-03  file-06  file-09    hosts
file-01  file-04  file-07  host.conf  hosts.allow
file-02  file-05  file-08  hostname   hosts.deny

查看系统当前所有挂载,可以看到挂载的详细信息。

[root@server ~ 12:23:47]# mount
......
/dev/nvme0n1p1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
/dev/mapper/rl-home on /home type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
......
# 括号中属性,是文件系统当前支持的功能。

[root@server ~ 12:24:40]# mount |grep ^/dev
/dev/mapper/rl-root on / type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
/dev/nvme0n1p1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
/dev/mapper/rl-home on /home type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)

卸载文件系统

当文件系统不使用的时候,通过 umount 命令卸载。

umount命令语法:

umount device | dir

可以通过指定设备或者挂载点,卸载文件系统。

示例:

[root@server ~ 12:25:00]# umount /dev/sdb
# 或者
[root@server ~ 12:25:59]# umount /data
[root@server ~ 12:26:30]# df -h /data
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   50G  4.9G   46G   10% /

卸载失败处理

[root@server ~ 12:26:38]# mount /dev/sdb /data
[root@server ~ 12:27:14]# cd /data
[root@server data 12:27:21]# ls
file-00  file-03  file-06  file-09    hosts
file-01  file-04  file-07  host.conf  hosts.allow
file-02  file-05  file-08  hostname   hosts.deny

# 提示挂载点正在忙碌
[root@server data 12:27:22]# umount /dev/sdb
umount: /data:目标忙。
        (有些情况下通过 lsof(8) 或 fuser(1) 可以
         找到有关使用该设备的进程的有用信息)
         
lsof 命令

lsof,list open files,用于查看系统打开的文件。

lsof 命令语法:

lsof [options] [names]

常用选项:

  • -i,查看打开的 Internet 文件。例如 -i @10.1.8.20:22-i :80
  • -p pid,根据进程PID查找特定进程打开的文件。
  • -u uid,根据用户 uid查找特定用户打开的文件。
  • names,是文件或者文件系统设备。
# 新开窗口查看哪个进程在使用挂载点
[root@centos7 ~]# lsof /data
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
bash    1508 root  cwd    DIR   8,17      156   64 /data
fuser 命令

fuser,用于识别进程打开的文件。

fuser 命令语法:

fuser [-fMuvw] [-a|-s] [-4|-6] [-c|-m|-n SPACE] [-k [-i] [-SIGNAL]] NAME...

常用选项:

  • -k,杀死这些正在访问这些文件的进程。除非使用-signal修改信号,否则将发送SIGKILL信号。
  • -signal,指定发送的信号(signal 使用特定信号替换),缺省信号SIGKILL。
  • -i,交互模式杀死进程。
  • -l,列出所有已知的信号名称。
  • -m,列出文件系统被哪些程序使用。
  • -n,空间,选择不同的名字空间,可是file,udp,tcp。默认是file,也就是文件。
  • -4,仅查询IPV4套接字
  • -6,仅查询IPV6套接字。
  • -u,指定用户名。
# 新开窗口查看哪个进程在使用挂载点
[root@centos7 ~]# fuser -m /data
/data:                1508c

终止进程,再次卸载

# 返回家目录,再次卸载
[root@centos7 data]# cd 
[root@centos7 ~]# umount /data

案例1:Linux 挂载 NTFS 格式U盘

思路:默认情况下 Linux不识别NTFS格式文件系统,需要安装相应的模块进行识别。

  1. 安装 ntfs-3g (该软件包由epel仓库提供)
  2. 挂载
[root@centos7 ~]# yum install -y ntfs-3g
[root@centos7 ~]# mount.ntfs /dev/sdb1 /mnt

案例2:Linux 挂载 exfat 格式U盘

思路:默认情况下 Linux 不识别 exfat 格式文件系统,需要安装相应的模块进行识别。

[root@centos7 ~]# yum install -y gcc fuse-devel make pkg-config 

[root@centos7 ~]# wget http://192.168.50.200/class/course-materials/softwares/stage01/fuse-exfat-1.2.0.tar.gz
[root@centos7 ~]# tar -xf fuse-exfat-1.2.0.tar.gz
[root@centos7 ~]# cd fuse-exfat-1.2.0

[root@centos7 ~]# ./configure
[root@centos7 ~]# make && make install


# 挂载exFAT格式的U盘(假设U盘设备为/dev/sdb1)
[root@centos7 ~]# mount.exfat /dev/sdb1 /mnt

案例3:构建基于 ISO 文件的 yum 仓库*

client 想安装图形化,但仓库来源于Internet,希望使用本地仓库以提高速度。

现要求在server服务器上部署nginx服务发布dvd光盘中的仓库。

操作思路:

  1. server上部署并配置nginx服务
  2. server上挂载 ISO 文件到nginx服务网站目录
  3. client创建指向server上web站点仓库
  4. 测试

部署web服务器

# 安装软件
[root@server ~ 14:00:13]# yum install -y nginx

# 设置允许查看目录中清单
[root@server ~ 14:27:15]# vim /etc/nginx/nginx.conf
......
http {
    # 添加以下参数
    autoindex on;
......
[root@server ~ 11:42:06]# systemctl enable nginx.service --now
# 准备测试文件
[root@server ~ 14:39:12]#  mv /usr/share/nginx/html/index.html{,.ori}
[root@server ~ 14:39:49]# echo hello xiaoma. > /usr/share/nginx/html/index.html

# 客户端测试
[root@server ~ 14:40:31]# curl http://server
hello xiaoma.

#关闭防火墙
[root@server ~ 14:44:20]# systemctl disable firewalld.service --now

挂载光盘到web服务器发布目录

确保光盘关联正确的iso并连接到虚拟机

[root@server ~ 14:43:48]# mkdir /usr/share/nginx/html/dvd
[root@server ~ 14:44:19]# mount /dev/sr0 /usr/share/nginx/html/dvd
mount: /dev/sr0 写保护,将以只读方式挂载

客户端测试

[root@client ~ 14:49:43]# mkdir /etc/yum.repos.d/old
[root@client ~ 14:49:52]# mv /etc/yum.repos.d/*repo /etc/yum.repos.d/old
[root@client ~ 14:49:58]# vim /etc/yum.repos.d/dvd.repo
[dvd]
name= dvd from local server
baseurl=http://10.1.8.10/dvd
gpgcheck=0

[root@client ~ 14:50:41]# yum clean all

[root@client ~ 14:50:50]# yum grouplist
Loaded plugins: fastestmirror
There is no installed groups file.
Maybe run: yum groups mark convert (see man yum)
Loading mirror speeds from cached hostfile
Available Environment Groups:
   Minimal Install
   Compute Node
   Infrastructure Server
   File and Print Server
   Basic Web Server
   Virtualization Host
......

[root@client ~ 14:50:59]# yum groupinstall -y 'Server with GUI'

# 启动图形化
[root@client ~ 14:57:02]# init 5

# 切换到字符
[root@client ~ 15:23:11]# init 3

[root@client ~ 14:56:53]# yum repolist dvd
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
源标识                    源名称                                   状态
dvd                       dvd from local server                    4,070
repolist: 4,070


[root@client ~ 14:52:15]# yum list lrzsz --showduplicates
已加载插件:fastestmirror, langpacks
源 'dvd' 在配置文件中未指定名字,使用标识代替
Loading mirror speeds from cached hostfile
已安装的软件包
lrzsz.x86_64                  0.12.20-36.el7                   @anaconda
可安装的软件包
lrzsz.x86_64                  0.12.20-36.el7                   dvd  

课后练习

查找系统中文件

locate

locate 命令根据文件名及其路径,在 mlocate 数据库中查找文件,并返回结果。数据库中存放文件和文件路径信息。

常规用户查找时,返回的结果仅包含用户有读取权限的目录树中匹配项。

查找文件前,需要root用户手动执行updatedb命令更新mlocate数据库。

[root@server ~ 14:49:12]# yum install -y mlocate
[root@server ~ 15:47:53]# updatedb

locate命令语法:

locate [OPTION]... [PATTERN]...

常用选项:

  • -b, --basename
  • -i, --ignore-case
  • -c, --count
  • -r, --regexp

示例:

[root@server ~ 15:48:09]# yum install -y httpd
# 安装后,未跟新数据库,所以检索不到
[root@server ~ 15:49:44]# locate httpd.conf

# 更新后查找
[root@server ~ 15:50:19]# updatedb
[root@server ~ 15:50:57]# locate httpd.conf
/etc/httpd/conf/httpd.conf
/usr/lib/tmpfiles.d/httpd.conf

# -b选项 查找
[root@server ~ 15:51:03]# locate -b httpd

# 扩展
[root@server ~ 15:51:30]# basename /usr/share/doc
doc
[root@server ~ 15:52:23]# dirname /usr/share/doc
/usr/share

#创建文件
[root@server ~ 15:52:31]# touch /etc/PASSWD

# -i选项 忽略大小写
[root@server ~ 15:53:58]# locate PASSWD
/etc/PASSWD
[root@server ~ 15:54:12]# locate -i PASSWD

# -c选项 返回找到的数量
[root@server ~ 15:56:09]# locate -i -c PASSWD
141

# -r选项 正则表达式匹配查找
[root@server ~ 15:57:28]# locate -r 'http.*conf'

find

find 命令在本地文件系统中执行实时查找文件。使用find命令的用户对文件夹必须有读取和执行权限。

语法:

find [path] [expression] [action]
  • path,是查询路径,如果没有指定文件夹,将会查找当前目录及子目录。
  • expression,是查询条件表达式。
  • action,是找到文件后采取的动作。
根据文件 name 查找
[root@server ~ 15:57:58]# find /etc/ -name passwd
/etc/pam.d/passwd
/etc/passwd

[root@server ~ 15:58:55]# find /etc/ -name '*passwd*'
/etc/pam.d/passwd
/etc/passwd
/etc/security/opasswd
/etc/passwd-

[root@server ~ 15:59:08]# touch /etc/PASSWD

[root@server ~ 15:59:17]# find /etc/ -iname passwd
/etc/pam.d/passwd
/etc/passwd
/etc/PASSWD
根据文件 type 查找

-type 根据文件类型查找,支持文件类型:

  • b,block (buffered) special。
  • c,character (unbuffered) special。
  • d,directory。
  • p,named pipe (FIFO)。
  • f,regular file。
  • l,symbolic link。
  • s,socket。
[root@server ~ 15:59:24]# mkdir /etc/yum.repos.d/passwd
[root@server ~ 16:00:31]# find /etc/ -name 'passwd' -type d
/etc/yum.repos.d/passwd
[root@server ~ 16:00:51]# rmdir /etc/yum.repos.d/passwd
根据文件 owner 查找
  • -user、-uid,属于特定用户。
[root@server ~ 16:04:06]# id xiaoma
uid=1000(xiaoma) gid=1000(xiaoma)=1000(xiaoma),10(wheel)
[root@server ~ 16:04:43]# find / -user xiaoma
[root@server ~ 16:04:43]# find / -uid 1000
  • -group、-gid,属于特定组
[root@server ~ 16:04:43]# grep wheel /etc/group
wheel:x:10:xiaoma
[root@server ~ 16:05:55]# find / -group wheel
[root@server ~ 16:06:02]# find / -gid 10
  • -nouser,不属于任何用户;-nogroup,不属于任何组
# 查找系统中不属于任何用户或者不属于任何组的文件 
[root@server ~ 16:06:12]# find / -nouser -o -nogroup
根据文件 perm 查找
# 准备文件
[root@server ~ 16:07:02]# mkdir lab;cd lab
[root@server lab 16:07:34]# touch file-{1..3}
[root@server lab 16:07:41]# ls -l file*
-rw-rw-r--. 1 root root 0 730 16:07 file-1
-rw-rw-r--. 1 root root 0 730 16:07 file-2
-rw-rw-r--. 1 root root 0 730 16:07 file-3
  • -perm mode,查找文件权限为mode的文件。
[root@server lab 16:07:48]# chmod 764 file-1

# 查找文件权限为764的文件
[root@server lab 16:09:00]# find -perm 764 | xargs ls -l
-rwxrw-r--. 1 root root 0 730 16:07 ./file-1
  • -perm -mode,例如:mode为764,则ugo必须同时满足的最小权限:user至少为7、group至少为6、other为4。
[root@server lab 16:09:13]# chmod 777 file-1
[root@server lab 16:10:18]# chmod 764 file-2
[root@server lab 16:10:30]# chmod 760 file-3
[root@server lab 16:10:41]# find . -perm -764 | xargs ls -l
-rwxrwxrwx. 1 root root  0 730 16:07 ./file-1
-rwxrw-r--. 1 root root  0 730 16:07 ./file-2


# 0作为通配符,表示不匹配对应权限位。 
# 查找系统中具有suid权限的文件 
[root@server lab 16:12:31]# find / -perm -4000

# 查找系统中同时具有特殊权限的文件:suid和sgid 
[root@server lab 16:12:42]# find / -perm -6000 2>/dev/null | xargs ls -l
-rwsr-sr-x. 1 abrt abrt 15344 102 2020 /usr/libexec/abrt-action-install-debuginfo-to-abrt-cache

  • -perm /mode,例如mode为764,则ugo只要有一个满足即可:user至少为7、group至少为6、other至少为4。
[root@server lab 16:13:45]# chmod a=- file-1
[root@server lab 16:15:16]# chmod uo=-,g=rwx file-2
[root@server lab 16:15:28]# chmod ug=-,o=r file-3

[root@server lab 16:15:34]# find -name 'file-*' -perm /764| xargs ls -l
----rwx---. 1 root root 0 730 16:07 ./file-2
-------r--. 1 root root 0 730 16:07 ./file-3

# 查找系统中具有特殊权限的文件:suid、sgid、sticky

[root@server lab 16:17:06]# find / -perm /7000

# 查找系统中具有特殊权限的文件:suid或者sgid

[root@server lab 16:17:36]# find / -perm /6000
  • -readable -writable -executable,文件具有可读、可写、可执行。
根据文件 size 查找

单位 c(字节)、k(KiB)、M(MiB)、G(GiB)

# 大小等于10M
[root@server ~ 16:18:28]# find -size 10M

# 大小大于10G
[root@server ~ 16:18:42]# find -size +10G

# 大小小于10k
[root@server ~ 16:18:49]# find -size -10k

# 大小等于1M
[root@server ~ 16:18:55]# find -size 1M
# 注意:size会取整为1个单位,所以find -size 1M结果包含小于1M的文件。
# 可以使用1024k取代1M
[root@server ~ 16:19:12]# find -size 1024k
根据文件 time 查找
  • -amin, -cmin, -mmin 单位1分钟。
  • -atime, -ctime, -mtime 单位24小时。
  • -newer file,比file新的文件。
# 10分钟前(正好10分钟)
[root@server ~ 16:19:20]# find -amin 10

# 10分钟以前(大于10分钟)
[root@server ~ 16:20:33]# find -amin +10

# 10分钟以内(小于10分钟)
[root@server ~ 16:20:39]# find -amin -10
根据文件硬链接数和 inum 查找
# 硬链接数等于、大于、小于3的文件
[root@server ~ 16:22:48]# find -links 3
[root@server ~ 16:22:57]# find -links +3
[root@server ~ 16:23:04]# find -links -3

# inode为67160130的文件
[root@server ~ 16:23:10]# ls -i /etc/fstab
67160130 /etc/fstab
[root@server ~ 16:24:23]# find / -inum 67160130| xargs ls -i
67160130 /etc/fstab
多条件表达式
  • 逻辑与expr1 -a expr2 或者 expr1 expr2
[root@centos7 lab]# find . -name 'file-*' -perm /764
  • 逻辑或:expr1 -o expr2
#查找系统中不属于任何用户或者不属于任何组的文件 
[root@server ~ 16:26:00]# find / -nouser -o -nogroup
# 例如 
[root@server ~ 16:26:17]# find / -perm /7000 
# 等效与 
[root@server ~ 16:26:29]# find / -perm -4000 -o -perm -2000 -o -perm -1000

  • 逻辑非:! expr
[root@server ~ 16:26:37]# find / ! -size -200M 2>/dev/null
/proc/kcore
/proc/6693/task/6693/fd/5
/proc/6693/task/6693/fdinfo/5
/proc/6693/fd/6
/proc/6693/fdinfo/6
/usr/share/nginx/html/dvd/LiveOS/squashfs.img
[root@server ~ 16:27:59]# ls -lh /proc/kcore
-r--------. 1 root root 128T 730 16:28 /proc/kcore
action
  • -delete,查出找到的文件。
[root@server ~ 16:28:06]# find / -name PASSWD
/etc/PASSWD
[root@server ~ 16:28:45]# find / -name PASSWD -delete
[root@server ~ 16:28:51]# find / -name PASSWD
  • -ls,相当于 ls -dils 查看找到的文件。
[root@server ~ 16:28:58]# find /etc/ -name passwd
/etc/pam.d/passwd
/etc/passwd
[root@server ~ 16:29:27]# find /etc/ -name passwd -ls
101481388    4 -rw-r--r--   1 root     root          188 41  2020 /etc/pam.d/passwd
68107053    4 -rw-r--r--   1 root     root         2495 730 14:27 /etc/passwd
  • -exec command ;,找到文件后,执行相应的command。
[root@server ~ 16:29:34]# find /etc/ -name passwd -exec echo haha \;
haha
haha
  • -exec command {} ;,找到文件后,可以在命令中对文件操作。
[root@server ~ 16:30:08]# find / -inum 67160130
/etc/fstab
# 将inode为67160130的所有文件复制到当前目录 
[root@server ~ 16:30:37]# mkdir findfiles
[root@server ~ 16:30:44]# find / -inum 67160130 -exec cp -a {} ./findfiles \;
[root@server ~ 16:30:51]# ls findfiles/fstab
findfiles/fstab
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐