linux中一切皆文件,而文件的种类很多,有普通文件、目录文件、设备文件等等。下面来细看有哪些文件类型。通过ls -l 命令可以查看文件的属性信息,在该命令查看到的结果中,排在左边的第一个字符即为该文件中的类型,比如常见的普通文件(-)以及目录文件(d) 等。下面分别做详细解析。

1. 各种文件类型

1.1 普通文件

普通文件(regular file),简言之就是一般的文件,没有什么特殊之处,使用ls -al查看文件属性时,最左边(第一个字符)表现为-,例如:-rwxr-xr-x。另外根据文件内容的不同,普通文件又可细分为以下几种类型 :

  • 纯文本文件

    纯文本文件,顾名思义这种文件存储的内容全部是可读数据,像数字、字母、下划线等文字相关的内容。而Linux哲学思想之一,就是配置信息存放在文本文件中。几乎所有Linux的配置文件都属于这一类文件类型。例如:/etc/fstab,/etc/issue等。可使用cat命令查看文本文件的内容。

    [root@node01 ~]# ls -l /etc/issue
    -rw-r--r--. 1 root root 23 Sep  5  2019 /etc/issue
    [root@node01 ~]# cat /etc/issue
    \S
    Kernel \r on an \m
  • 二进制可执行文件

    二进制可执行文件是有特殊格式的可执行程序,其文件内容表现为不可直接读懂的字符,如何用cat工具直接看,会出先乱码的现象。在Linux中很多二进制可执行文件,比如很多的外部命令都是二进制可执行文件。就连查看文本文件内容的命令cat本身就是一个二进制执行文件

    [root@node01 ~]# ls -l /bin/cat
    -rwxr-xr-x. 1 root root 54080 Aug 20  2019 /bin/cat
    [root@node01 ~]# cat /bin/cat                                                                                                                                                                             LF>D&@@K@8    @@@@@88@8@@@쮬• H¼H¼`H¼`ֆ` 辨½`輠΁TT@T@DDP䳤´´@´@
                                                                  
                                                                 Q䳤R䳤
  • 数据格式文件

    数据格式文件是一些程序在运行过程中需要读取的存放在某些特定格式的数据文件,比如:图片文件、压缩文件、日志文件。通常此类文件需要使用特定的工具才能打开。例如:用户登录时,系统会将登录信息记录在/var/log/wtmp文件中,这就是一个数据文件.数据格式文件不能使用文本查看工具来读取内容,否则可能会出现乱码。可通过last命令打开此文件查看内容

    [root@node01 ~]# ls -l /var/log/wtmp 
    -rw-rw-r--. 1 root utmp 38016 Aug 17 01:52 /var/log/wtmp
    [root@node01 ~]# cat /var/log/wtmp 
    ~~~reboot3.10.0-1062.el7.x86_64%•䞩3~~~runlevel3.10.0-1062.el7.x86_64+•䛠+Ђtty1tty1Ђ+•䞦=Ђtty1tty1LOGINЂ+•䞦=Ђtty1tty1rootЂ•.Ђtty1tty1Ђ•䜬~~~reboot3.10.0-1062.el7.x86_64ņȞ퀃tty1tty1ІȞªty1tty1LOGINІȞª~~~runlevel3.10.0-1062.el7.x86_64ՆȞ~Ёtty1tty1rootۆȞ  
    [root@node01 ~]# last
    root     pts/0        192.168.194.1    Mon Aug 17 01:52   still logged in   
    root     pts/0        192.168.194.1    Tue Aug  4 02:42 - 00:57  (22:14)    
    root     pts/0        192.168.194.1    Tue Aug  4 02:37 - 02:42  (00:04)    
    root     pts/0        192.168.194.1    Tue Aug  4 02:25 - 02:35  (00:10)    
    root     tty1                          Tue Aug  4 02:24   still logged in   
    reboot   system boot  3.10.0-1062.el7. Tue Aug  4 02:23 - 02:02 (12+23:38)  
    root     pts/0        192.168.194.1    Wed Jul 15 09:17 - 07:10 (1+21:52)   
    root     tty1                          Wed Jul 15 09:05 - crash (19+17:18)  
    reboot   system boot  3.10.0-1062.el7. Wed Jul 15 09:05 - 02:02 (32+16:56)  
    root     pts/0        192.168.194.1    Mon Jul 13 10:37 - crash (1+22:27)   
    root     tty1                          Mon Jul 13 07:58 - crash (2+01:07)   
    reboot   system boot  3.10.0-1062.el7. Mon Jul 13 07:53 - 02:02 (34+18:08)  
    root     tty1                          Mon Jul 13 07:52 - 07:53  (00:00)    
    reboot   system boot  3.10.0-1062.el7. Mon Jul 13 07:52 - 07:53  (00:01)    
    root     tty1                          Mon Jul 13 07:52 - 07:52  (00:00)  
    ​

1.2 目录文件

目录文件即文件夹,通过ls -l 查看文件属性时,第一个属性表现为d

[root@localhost ~]# ls -l
total 4
-rw-------. 1 root root 1201 Jun 29 03:11 anaconda-ks.cfg
drwxr-xr-x. 2 root root    6 Jun 29 16:16 Desktop
drwxr-xr-x. 2 root root    6 Jun 29 16:16 Documents
drwxr-xr-x. 2 root root    6 Jun 29 16:16 Downloads
drwxr-xr-x. 2 root root    6 Jun 29 16:16 Music
drwxr-xr-x. 2 root root    6 Jun 29 16:16 Pictures
drwxr-xr-x. 2 root root    6 Jun 29 16:16 Public
drwxr-xr-x. 2 root root    6 Jun 29 16:16 Templates
drwxr-xr-x. 2 root root    6 Jun 29 16:16 Videos
​

1.3 链接文件

链接文件,即将两个文件建立关联关系,这种操作实际上是给系统中已有的某个文件指定另外一个可用于访问它的不同文件名称。对于这个新的文件名,我们可以为之指定不同的访问路径,从而实现更为灵活的访问控制。链接文件又分为两种,软链接(Symbolic link)和硬链接(Hard Link)。其中软连接又称"符号连接"。简单理解,linux中软链接文件就类似Windows系统中的快捷方式,是进入或读取另外一个文件的一个新的入口。使用ls -l 命令查看时第一个属性表现为l

对于一个文件的信息,在linux上被分为两个部分: 数据(user data)与元数据(metadata)。用户数据,即指文件的数据内容是存放在文件对应的数据块(data block)中。数据块是记录文件真实内容的地方:而元数据则是文件的附加属性,如文件大小、创建时间、所有者、inode(index number,即索引节点号)等信息。元数据中的inode是个整数,它才是用来区分每一个不同文件的唯一标识,而非文件名,类似于我们的身份证号。每个文件都有一个唯一的inode。文件名仅是为了方便人们的记忆和使用,系统或者程序通过inode号寻找正确的文件数据块。

linux系统中查看inode号可使用命令statls -i,而在同一个文件系统内执行mv命令不会改变文件的inode号。为了解决文件共享使用,linux中引入了两种连接 : 硬链接(hard link)与软链接(即soft link,又称符号链接symbolic link)。链接不仅实现了Linux系统文件的共享,还带来了隐藏文件路径、增加权限安全及节省存储等好处。具体实现有硬链接和软链接两种方式,可以使用ln创建链接文件。

  • ln命令

    • 语法格式

      • ln [OPTION]... [-T] TARGET LINK_NAME

      • ln [OPTION]... TARGET

      • ln [OPTION]... TARGET... DIRECTORY

      • ln [OPTION]... -t DIRECTORY TARGET...

      • TARGET : 表示需要创建链接文件的目标文件

      • LINK_NMAE : 表示生成的链接文件

    需要注意的是 , 如果LINK_NAME使用的是相对路径时,TARGET同样基于LINK_NAME 的相对路径,不然容易出错,如下图所示 , 如果链接创建失败,链接文件会显示红色。 ln-s

    • OPTIONS

      • -b : 覆盖以前先备份

      • -d,-F,--directory :允许超级用户制作目录的硬链接,因系统限制可能出错。

      • -f,--force : 强制执行

      • -i,--interactive : 交互模式,文件存在则提示用户是否覆盖

      • -n,--no-dereference : 把符号链接视为一般目录。

      • -s,--symbolic : 软链接(符号链接)。

      • -v,--verbose : 显示详细的处理过程

      • -S,--suffix=SUFFIX : 指定备份的文件后缀。

      • --help : 显示帮助信息

      • --version : 显示版本信息

  • 硬链接 硬链接其本质就是对同一个文件起多个文件名。所以表现为一个inode号可以对应多个文件名。换言之,硬链接就是同一个文件使用了多个别名,但他们的inode号相同。硬链接可使用命令lnlink创建。

    示例

    [root@localhost test]# touch TEST.txt
    [root@localhost test]# ls -li TEST.txt 
    34296209 -rw-r--r--. 1 root root 0 Aug 19 02:23 TEST.txt
    [root@localhost test]# ln TEST.txt test.txt
    [root@localhost test]# ls -li test.txt 
    34296209 -rw-r--r--. 2 root root 0 Aug 19 02:23 test.txt
    [root@localhost test]# echo 1234567890 > TEST.txt 
    [root@localhost test]# cat test.txt 
    1234567890

    由于硬链接是有着相同inode号仅文件名不同的文件,因此硬链接存在以下几点特性:

    • 文件有相同的inodedata block

    • 只能对已存在的文件进行创建

    • 不能跨分区创建硬链接

    • 不能对目录进行创建,只可对文件创建

    • 删除一个硬链接文件并不影响其他相同inode号的文件

    提示: 之所以不能对目录创建文件系统,是因为: 受限于文件系统。现Linux文件系统中的目录均隐藏了两个特殊的目录: 当前目录(.)与父目录(..)。查看这两个特殊目录的inode号可知其实这两目录就是两个硬链接。若系统允许对目录创建硬链接,则会产生目录环。

  • 软链接

    软链接与硬链接不同,若文件用户数据库中存放的内容是另一文件的路径名的指向,则该文件就是软连接。软链接就是一个普通文件,只是数据库内容有点特殊。软链接有着自己的inode号以及用户数据块,其主要的特点如下:

    • 软链接有自己的文件属性及权限等

    • 可对不存在的文件或目录创建软链接

    • 软链接可跨分区创建

    • 软链接可对文件或目录创建

    • 创建软链接时不会让愿文件链接数量增加, 因为软链接本身是一个新文件 , 有自己的inode

    • 删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软链接被称为死链接,若被指向路径文件被重新创建,死链接可恢复为正常软链接

    软链接的创建也是用ln命令,但是在创建的时候需要跟上参数-s,软链接的用户数据也可以是另一个软链接的路径。其解析过程是递归的,及对链接文件创建链接文件。

    提示: 软链接创建时原文件的路径可以是绝对路径和相对路径。如果是相对路径,一定是相对于软链接文件的路径,而非当前目录

    示例

    [root@localhost test]# ll -li
    total 8
    34296209 -rw-r--r--. 2 root root 11 Aug 19 02:24 test.txt
    34296209 -rw-r--r--. 2 root root 11 Aug 19 02:24 TEST.txt
    [root@localhost test]# ln -s test.txt test.txt.link  #创建软链接
    [root@localhost test]# ls -li  # 生成软链接后,不会增加链接数
    total 8
    34296209 -rw-r--r--. 2 root root 11 Aug 19 02:24 test.txt
    34296209 -rw-r--r--. 2 root root 11 Aug 19 02:24 TEST.txt
    34296204 lrwxrwxrwx. 1 root root  8 Aug 19 17:20 test.txt.link -> test.txt
    ​
    #使用相对路径创建软链接,链接针对的相对路径是针对生成指定链接文件位置的相对路径
    [root@localhost test]# ln -s ../../boot/grub2/grub.cfg   grub.cfg.link
    [root@localhost test]# ll grub.cfg.link 
    lrwxrwxrwx. 1 root root 25 Aug 19 17:22 grub.cfg.link -> ../../boot/grub2/grub.cfg
    [root@localhost test]# ls -li
    total 8
    34296192 lrwxrwxrwx. 1 root root 25 Aug 19 17:22 grub.cfg.link -> ../../boot/grub2/grub.cfg   # 显示相对于软链接文件的路径
    34296209 -rw-r--r--. 2 root root 11 Aug 19 02:24 test.txt
    34296209 -rw-r--r--. 2 root root 11 Aug 19 02:24 TEST.txt
    34296204 lrwxrwxrwx. 1 root root  8 Aug 19 17:20 test.txt.link -> test.txt
    [root@localhost test]# mkdir dir
    [root@localhost test]# ln -s dir dir.link
    [root@localhost test]# ls -li
    total 8
    34296193 drwxr-xr-x. 2 root root  6 Aug 19 17:22 dir
    34296195 lrwxrwxrwx. 1 root root  3 Aug 19 17:22 dir.link -> dir
    34296192 lrwxrwxrwx. 1 root root 25 Aug 19 17:22 grub.cfg.link -> ../../boot/grub2/grub.cfg
    34296209 -rw-r--r--. 2 root root 11 Aug 19 02:24 test.txt
    34296209 -rw-r--r--. 2 root root 11 Aug 19 02:24 TEST.txt
    34296204 lrwxrwxrwx. 1 root root  8 Aug 19 17:20 test.txt.link -> test.txt
    ​
    # 删除连接文件的源文件,链接文件将成为死链
    [root@localhost test]# rm test.txt
    rm: remove regular file 'test.txt'? y
    [root@localhost test]# ls -l
    total 4
    drwxr-xr-x. 2 root root  6 Aug 19 17:22 dir
    lrwxrwxrwx. 1 root root  3 Aug 19 17:22 dir.link -> dir
    lrwxrwxrwx. 1 root root 25 Aug 19 17:22 grub.cfg.link -> ../../boot/grub2/grub.cfg
    -rw-r--r--. 1 root root 11 Aug 19 02:24 TEST.txt
    lrwxrwxrwx. 1 root root  8 Aug 19 17:20 test.txt.link -> test.txt
    ​
    ​
    [root@node01 /]# mkdir /data
    [root@node01 /]# cd data/
    ​

1.4 管道文件

管道pipe文件是一种特殊的文件类型,其本质是一个伪文件(实为内核缓冲区)。器主要目的是为了实现进程间通讯(InterProces Communication,IPC)的问题。由于管道文件是一个与进程没有“血缘关系”的、真正且独立的文件,所以它可以在任意进程之间实现通信。由于命名管道不支持诸如lseek()等文件定位操作,严格遵守先进先出的原则进行传输数据,即对管道的读总是从开始出返回数据,对它的写总是把数据添加到末尾,所以也叫做FIFO(first int first out)文件。在ls -l 显示可以看到,行首第一个字符属性为p

管道文件有以下局限性:

  1. 自己写的数据不能自己读

  2. 数据一旦被读后,便不在管道中存在,不可反复读取。

  3. 管道采用半双工通信方式,即同一时间数据只能在一个方向上流动。

由于管道文件是半双工模式,即同一时间只能一个方向传输数据,而后面介绍的套接字文件支持全双工,所以目前使用不多。

提示: 常见的通信方式有三种: 单工通信、半双工通信、全双工通信。 单工 : 即只能向一个方向传输信息,如:传统收音机。 半双工 : 可以双向传输信息,但不能同时进行传输,只能轮流进行,如:对讲机 全双工 : 可以同时双向传输信息。如: 手机

  • mkfifo

    可以通过命令mkfifo创建新的pipe文件。

    • 语法 : mkfifo [OPTION]... NAME...

    • OPTIONS

      • -m,--mode=MODE : 设置文件的权限。

      • -Z,--context[=CTX] : 为文件设置SELinux

      • --help : 显示帮助手册

      • --version : 输出版本信息

    示例

    [root@localhost ~]# mkfifo 3.pipe
    [root@localhost ~]# ll
    total 4
    prw-r--r--. 1 root root    0 Aug 19 18:04 1.pipe
    prw-r--r--. 1 root root    0 Aug 19 17:58 2.piep
    prw-r--r--. 1 root root    0 Aug 20 14:25 3.pipe
    -rw-------. 1 root root 1201 Jun 29 03:11 anaconda-ks.cfg
    drwxr-xr-x. 2 root root    6 Jun 29 16:16 Desktop
    drwxr-xr-x. 2 root root    6 Jun 29 16:16 Documents
    drwxr-xr-x. 2 root root    6 Jun 29 16:16 Downloads
    drwxr-xr-x. 2 root root    6 Jun 29 16:16 Music
    drwxr-xr-x. 2 root root    6 Jun 29 16:16 Pictures
    drwxr-xr-x. 2 root root    6 Jun 29 16:16 Public
    drwxr-xr-x. 2 root root    6 Jun 29 16:16 Templates
    drwxr-xr-x. 2 root root    6 Jun 29 16:16 Videos

1.5 字符设备文件

字符(character)设备文件,通常是一些串行接口设备在用户空间的体现,像键盘,鼠标等。字符设备是按字符为单位进行输入输出,且按一定的顺序进行。这里打开的文件第一个属性表现为c即为字符设备文件。比如像我们登录到Linux主机,系统会提供一个终端文件tty供我们登录,就是字符文件

[root@localhost ~]# ls -l /dev/null /dev/zero /dev/tty*
crw-rw-rw-. 1 root root    1,  3 Aug 19 17:17 /dev/null
crw-rw-rw-. 1 root tty     5,  0 Aug 19 17:17 /dev/tty
crw--w----. 1 root tty     4,  0 Aug 19 17:17 /dev/tty0
crw--w----. 1 gdm  tty     4,  1 Aug 19 17:18 /dev/tty1
crw--w----. 1 root tty     4, 10 Aug 19 17:17 /dev/tty10
​

1.6 块设备文件

块设备文件(block),就是一些以“块”为单位。如:4096个字节,访问数据,提供随机访问的接口设备,例如磁盘,硬盘,U盘等。可以随机的在硬盘的不同块读写,通常块设备可利用缓存提高速度。这些块设备通常有多个,使用ls -l查看时表现为b

示例

[root@localhost ~]# ls -ld /dev/sd*
brw-rw----. 1 root disk 8, 0 Aug 19 17:17 /dev/sda
brw-rw----. 1 root disk 8, 1 Aug 19 17:17 /dev/sda1
brw-rw----. 1 root disk 8, 2 Aug 19 17:17 /dev/sda2

1.7 套接字文件

套接字文件(socket),被称为数据接口文件,这种类型文件通常被用在基于网络的数据通讯使用。当两个进程在同一台主机上,但是想通过网络方式通信,可基于socker方式进行数据通信,可基于全双工方式实现,即可支持同时双向传输数据。用ls -l 命令,可看到第一个属性表现为s

[root@localhost ~]# ll /run/*.sock
srw-rw-rw-. 1 root root 0 Aug 19 17:17 /run/gssproxy.sock
srw-rw-rw-. 1 root root 0 Aug 19 17:17 /run/rpcbind.sock

2. inode

2.1 inode是什么

理解inode , 要从文件储存说起。

文件储存在硬盘上 , 硬盘的最小存储单位叫做扇区(Sector)。每个扇区储存512字节 ( 相当于0.5KB ) 。

操作系统读取硬盘的时候 , 不会一个个扇区地读取 , 这样效率太低 , 而是一次性连续读取多个扇区 , 即一次性读取一个(block)。这种由多个扇区组成的 , 是文件存取的最小单位。的大小 , 最常见的是4KB , 即连续八个 sector组成一个block

文件数据都储存在中 , 那么很显然 , 我们还必须找到一个地方储存文件的元信息 , 比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode , 中文译名为索引节点。此时inode也被称为文件的元数据信息

每一个文件都有对应的inode , 里面包含了与该文件有关的一些信息。

2.2 inode的内容

一般inode中包含有文件的元数据信息。

  • 文件的字节数

  • 文件拥有者的User ID

  • 文件的Group ID

  • 文件的读、写、执行权限

  • 文件的时间戳

    • ctime : inode上一次变动的时间

    • mtime : 文件内容上一次变动的时间

    • atime : 文件上一次打开的时间。

  • 链接数 : 有多少文件名指向这个inode

  • 文件数据block的位置

可以使用stat命令查看某个文件的inode信息:

[root@node01 ~]# stat  anaconda-ks.cfg 
  File: ‘anaconda-ks.cfg’
  Size: 1243        Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 33574979    Links: 1
Access: (0600/-rw-------)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-12-03 00:29:33.840610210 +0800
Modify: 2019-12-03 00:29:33.842610210 +0800
Change: 2019-12-03 00:29:33.842610210 +0800
 Birth: -
​

注: 总之 , 除了文件名以外的所有文件信息 , 都存在inode之中。

2.3 inode的大小

inode也会消耗硬盘空间 , 所以硬盘格式化的时候 , 操作系统自动将硬盘分成两个区域。一个是数据区 , 存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。

每个inode节点的大小 , 一般是128字节或256字节。inode节点的总数 , 在格式化时就给定 , 一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中 , 每个inode节点的大小为128字节 , 每1KB就设置一个inode , 那么inode table的大小就会达到128MB , 占整块硬盘的12.8%

查看每个硬盘分区的inode总数和已经使用的数量 , 可以使用df命令。

[root@node01 ~]# df -i
Filesystem               Inodes  IUsed   IFree IUse% Mounted on
devtmpfs                 121467    382  121085    1% /dev
tmpfs                    124468      1  124467    1% /dev/shm
tmpfs                    124468    759  123709    1% /run
tmpfs                    124468     16  124452    1% /sys/fs/cgroup
/dev/mapper/centos-root 8910848 201071 8709777    3% /
/dev/sda1                524288    370  523918    1% /boot
tmpfs                    124468      1  124467    1% /run/user/0
​

由于每个文件都必须有一个inode , 因此有可能发生inode已经用光 , 但是硬盘还未存满的情况。这时 , 就无法在硬盘上创建新文件。

2.4 inode号码

每个inode都有一个号码,操作系统用inode号码来识别不同的文件。

这里值得重复一遍,Unix/Linux系统内部不使用文件名 , 而使用inode号码来识别文件。对于系统来说 , 文件名只是inode号码便于识别的别称或者绰号。

表面上 , 用户通过文件名 , 打开文件。实际上 , 系统内部这个过程分成三步 : 首先 , 系统找到这个文件名对应的inode号码;其次 , 通过inode号码 , 获取inode信息;最后,根据inode信息,找到文件数据所在的block , 读出数据。

使用ls -i命令,可以看到文件名对应的inode号码:

[root@node01 ~]# ls -i anaconda-ks.cfg 
33574979 anaconda-ks.cfg

可以通过find查找inode号删除inode对应文件。

[root@node01 tmp]# ls
temp  vmware-root_720-2957714511
[root@node01 tmp]# ls -i temp 
17354557 temp
[root@node01 tmp]# find -inum 17354557  -delete
[root@node01 tmp]# ls
vmware-root_720-2957714511
[root@node01 tmp]# touch tmp 
[root@node01 tmp]# ls -i tmp 
17204644 tmp
[root@node01 tmp]# find -inum 17204644 -exec  rm -i {} \;
rm: remove regular empty file ‘./tmp’? y

2.4.1 目录文件

Unix/Linux系统中,目录(directory)也是一种文件。打开目录,实际上就是打开目录文件。

目录文件的结构非常简单,就是一系列目录项(dirent)的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码。

ls命令只列出目录文件中的所有文件名;

[root@node01 tmp]# ls /root
anaconda-ks.cfg  expand_pre.sh  hellodb.sql  hellodb.sql.0  ips.txt  mysql.his  ssh.py

ls -i命令列出整个目录文件 , 即文件名inode号码

[root@node01 tmp]# ls -i /root
33574979 anaconda-ks.cfg  34881012 expand_pre.sh  35201156 hellodb.sql  33575033 hellodb.sql.0  33575026 ips.txt  35201186 mysql.his  33575024 ssh.py

如果要查看文件的详细信息 , 就必须根据inode号码,访问inode节点,读取信息。ls -l命令列出文件的详细信息。

[root@node01 tmp]# ls -l /root
total 64
-rw-------. 1 root root  1243 Dec  3  2019 anaconda-ks.cfg
-rwxrwxrwx. 1 root root 24458 Jan 16  2019 expand_pre.sh
-rw-r--r--. 1 root root  7786 May 24 16:11 hellodb.sql
-rw-r--r--  1 root root  7786 Nov 15  2018 hellodb.sql.0
-rw-r--r--. 1 root root    66 May 24 00:29 ips.txt
-rw-r--r--. 1 root root   880 May 24 05:54 mysql.his
-rwxrwxrwx. 1 root root  9380 May 24 00:28 ssh.py
​

目录文件的读权限(r)和写权限(w) , 都是针对目录文件本身。由于目录文件内只有文件名和inode号码,所以如果只有读权限,只能获取文件名,无法获取其他信息,因为其他信息都储存在inode节点中 , 而读取inode节点内的信息需要目录文件的执行权限(x)。

2.4.2 硬链接

一般情况下,文件名inode号码是"一一对应"关系,每个inode号码对应一个文件名。但是 , Unix/Linux系统允许 , 多个文件名指向同一个inode号码。

这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为"硬链接"(hard link)。

[root@node01 ~]# ls -li anaconda-ks.cfg 
33574979 -rw-------. 1 root root 1243 Dec  3  2019 anaconda-ks.cfg
[root@node01 ~]# ln anaconda-ks.cfg  test
[root@node01 ~]# ls -li  anaconda-ks.cfg  test 
33574979 -rw-------. 2 root root 1243 Dec  3  2019 anaconda-ks.cfg
33574979 -rw-------. 2 root root 1243 Dec  3  2019 test

运行上面这条命令以后 , 源文件与目标文件的inode号码相同 , 都指向同一个inodeinode信息中有一项叫做“链接数” , 记录指向该inode的文件名总数 , 这时就会增加1。

反过来 , 删除一个文件名 , 就会使得inode节点中的”链接数”减1。当这个值减到0 , 表明没有文件名指向这个inode , 系统就会回收这个inode号码 , 以及其所对应block区域。

这里顺便说一下目录文件的”链接数”。创建目录时 , 默认会生成两个目录项 : ...。前者的inode号码就是当前目录的inode号码 , 等同于当前目录的”硬链接”;后者的inode号码就是当前目录的父目录的inode号码 , 等同于父目录的”硬链接”。所以 , 任何一个目录的”硬链接”总数 , 总是等于2加上它的子目录总数 ( 含隐藏目录 ) 。

2.4.3 软链接

除了硬链接以外 , 还有一种特殊情况。

文件A和文件B的inode号码虽然不一样 , 但是文件A的内容是文件B的路径。读取文件A时 , 系统会自动将访问者导向文件B。因此 , 无论打开哪一个文件 , 最终读取的都是文件B。这时 , 文件A就称为文件B的"软链接"(soft link)或者"符号链接"(symbolic link)。

这意味着 , 文件A依赖于文件B而存在 , 如果删除了文件B , 打开文件A就会报错 :No such file or directory。这是软链接与硬链接最大的不同 : 文件A指向文件B的文件名 , 而不是文件B的inode号码 , 文件B的inode”链接数”不会因此发生变化。

[root@node01 /]# ll 
total 24
drwxr-xr-x    2 root root    6 Sep  1 02:36 1
lrwxrwxrwx.   1 root root    7 Dec  3  2019 bin -> usr/bin
​

2.5 inode特殊作用

由于inode号码与文件名分离 , 这种机制导致了一些Unix/Linux系统特有的现象。

  1. 有时 , 文件名包含特殊字符 , 无法正常删除。这时 , 直接删除inode节点 , 就能起到删除文件的作用。

  2. 移动文件或重命名文件 , 只是改变文件名 , 不影响inode号码。

  3. 打开一个文件以后 , 系统就以inode号码来识别这个文件 , 不再考虑文件名。因此 , 通常来说 , 系统无法从inode号码得知文件名。

第3点使得软件更新变得简单 , 可以在不关闭软件的情况下进行更新 , 不需要重启。因为系统通过inode号码 , 识别运行中的文件 , 不通过文件名。更新的时候 , 新版文件以同样的文件名 , 生成一个新的inode , 不会影响到运行中的文件。等到下一次运行这个软件的时候 , 文件名就自动指向新版文件 , 旧版文件的inode则被回收。

2.6 命令与inode关系

CP的命令 : 分配一个空闲的inode号,在inode表中生成新条目在目录中创建一个目录项,将名称与inode编号关联拷贝数据生成新的文件。

rm 命令 : 链接数递减 , 从而释放的inode号可以被重用把数据块放在空闲列表中删除目录项数据实际上不会马上被删除 , 但当另一个文件使用数据块时将被覆盖

mv命令: 如果mv命令的目标和源在相同的文件系统,作为mv 命令用新的文件名创建对应新的目录项,删除旧目录条目对应的旧的文件名,但是不影响inode表 ( 除时间戳 ) 或磁盘上的数据位置: 没有数据被移动

如果目标和源在一个不同的文件系统,mv相当于cprm

3. 文件管理类命令

3.1 ls

列出指定目录下的内容

  • 语法 : ls [OPTION]... [FILE]...

  • OPTION

    • -a:显示所有文件 , 包括隐藏文件 :

    • -A:显示除...之外的所有文件 :

    • -l , --long : 长格式列表 , 即显示文件的详细属性信息

      -rw-r--r--. 1 root root 8957 10月 14 19:37 boot.log

      • - : 文件类型 , - , d,b,c,l,s,p

      • rw-r--r--

        • rw-:文件属主的权限

        • r--:文件属组的权限

        • r--:其他用户 ( 非属主 , 属组 ) 的权限

      • 1:数字表示文件被硬连接的次数

      • root:文件的属主

      • root:文件的属组 :

      • 8957 : 数字表示文件的大小 , 单位是字节

      • 10月 14 19:37 : 文件最后一次被修改的时间

      • boot.log : 文件名

    • -h,--human-readable : 对文件大小单位换算 , 换算后结果可能会非精确值 :

    • -d : 查看目录自身而非其内的文件列表

    • -r , --reverse : 逆序显示

    • -R , --recursive : 递归显示

    • -m : 横向输出文件名 , 以,作为分隔符

3.2 stat

查看文件状态

  • 语法 : stat [OPTION]... FILE...

  • OPTIONS

    • -Z : 打印SELinux

    • -f : 显示文件系统状态而不是文件状态

    • -c,--format=FORMAT : 打印特定的格式类型

      • %a : 以数字格式显示文件权限

      • %A : 以rwx的方式显示文件权限

      • %C : 安全上下文

      • %n : 文件名

      • %F : 文件类型

      • %g : 显示文件gid

      • %G : 显示组用户

      • %h : 显示硬链接数量

      • %i : 显示inode

      • %m : 显示挂载点

      • %s : 显示文件大小,单位bytes

      • %u : 显示uid

      • %U : 显示用户名

    • --printf=FORMAT : 类似 --format , 但是会解释反斜杠转义符 , 不使用换行作输出结尾。如果您仍希望使用换行 , 可以在格式中加入\n

示例:

[root@localhost ~]# stat -c "%a"  anaconda-ks.cfg 
600
[root@localhost ~]# stat -c "%A"  anaconda-ks.cfg 
-rw-------
[root@localhost ~]# ll anaconda-ks.cfg 
-rw-------. 1 root root 1201 Jun 29 03:11 anaconda-ks.cfg
​
[root@centos6 ~]# stat install.log
  File: `install.log'
  Size: 41915       Blocks: 96         IO Block: 4096   regular file
Device: 802h/2050d  Inode: 781828      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-03-22 06:34:08.969999988 -0700
Modify: 2019-03-22 06:42:25.971999460 -0700
Change: 2019-03-22 06:42:44.835999440 -0700
​
[root@centos6 ~]# stat --printf "%C\n%y" install.log
system_u:object_r:admin_home_t:s0
2019-03-22 06:42:2
​
[root@centos6 ~]# stat -c  "%C" install.log
system_u:object_r:admin_home_t:s0
​

3.3 touch

创建文件和修改文件或者目录的时间戳。 直接使用touch命令如果文件存在 , 则修改文件时间戳 , 如果文件不存在 , 则创建新的文件。

  • 语法 : touch [OPTION]... FILE...

  • OPTIONS

    • -a : 只修改文件的access(访问)时间.

    • -c , --no-create : 不创建不存在的文件。

    • -d : 使用指定的日期时间 , 而非现在的时间

    • -m : 指修改Modify(修改)时间,而不修改access(访问)时间

    • -r file : 使用指定file文件的时间戳 ( access , modify ) 更新文件的时间戳 ( access , modify )

    • -t STAMP : STAMP , [[CC]YY]MMDDhhmm[.ss]

[root@centos6 ~]# touch -a -t 201905050505 install.log
[root@centos6 ~]# stat install.log
  File: `install.log'
  Size: 41915       Blocks: 96         IO Block: 4096   regular file
Device: 802h/2050d  Inode: 781828      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-05-05 05:05:00.000000000 +0800
Modify: 2019-06-05 13:25:30.839562441 +0800
Change: 2019-06-05 13:34:59.934553774 +0800
​
[root@centos6 ~]# touch -m -d "2019-05-05 16:05:33" install.log
[root@centos6 ~]# stat install.log
  File: `install.log'
  Size: 41915       Blocks: 96         IO Block: 4096   regular file
Device: 802h/2050d  Inode: 781828      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-05-05 05:05:00.000000000 +0800
Modify: 2019-05-05 16:05:33.000000000 +0800
Change: 2019-06-05 13:37:22.871017006 +0800
[root@centos6 ~]# 
​

3.4 cp

复制文件

  • 语法

    • cp [OPTION]... [-T] SOURCE DEST

    • cp [OPTION]... SOURCE... DIRECTORY

    • cp [OPTION]... -t DIRECTORY SOURCE...

  • 用法

源文件

目标文件不存在

目标不存在且为文件

目标存在且为目录

一个文件

先创建DEST文件,再将SRC文件中的内容复制到DEST

SRC中的内容覆盖至DEST中,目标文件中的原始数据将会丢失。建议复制时使用-i选项

在该目录下创建与原文件同名的文件,并将SRC文件中的内容复制到DEST

多个文件

提示错误

提示错误

在该目录下分别创建与原文件同名的文件,并将SRC文件中的内容一一复制到对应的DEST

目录文件

创建指定DEST同名目录,复制SRC目录中所有文件至DEST

提示错误

DEST 下创建与原目录同名的目录,并将SRC中的内容复制到新目录中

  • 常用选项 :

    • -i : 交互式

    • -r, -R : 递归复制目录及内部的所有内容;

    • -a,--archive :归档 , 相当于-dR --preserv=all

    • -d : --no-dereference --preserv=links : 如果不使用这个选项 , 则文件会直接创建一个与源文件同名的文件 , 同时将源文件链接文件中的内容直接复制到目标文件中

    • --preserv[=ATTR_LIST]

      • mode : 权限 ( 默认 )

      • ownership : 属主属组 ( 默认 )

      • timestamp : 时间戳 ( 默认 )

      • links : 链接

      • xattr : 扩展属性

      • context : 上下文

      • all : 以上所有

    • -p : --preserv=mode,ownership,timestamp

    • -v : --verbose

    • -f : --force

3.5 mv

mv命令用来为文件或目录改名、或将文件或目录移入其它位置。

  • 语法 :

    • mv [options] source dest

    • mv [options] source... directory

  • OPTIONS :

    • -f,--force : 如果目标文件已经存在 , 不会询问而直接覆盖.

    • -i,--interactive : 若目标文件已经存在时 , 就会询问是否覆盖。

    • -u,--update : 若目标文件已经存在 , 且源文件比较新 , 才会更新。

    • -t,--target-directory=DIRECTORY : 即指定mv的目标目录 , 该选项适用于移动多个源文件到一个目录的情况 , 此时目标目录在前 , 源文件在后。

    • -b : 当目标文件存在时 , 先进行备份在覆盖

    • -S,--suffix=SUFFIX : 设置备份时的后缀名。

    • --backup[=CONTROL] : 当目标文件存在时,会对文件进行备份。

      • CONTROL=noneoff : 不备份。

      • CONTROL=numberedt : 数字编号的备份

      • CONTROL=existingnil : 如果存在以数字编号的备份 , 则继续编号备份m+1…n :

      • CONTROL=simplenever : 使用简单备份 : 在被覆盖前进行了简单备份 , 简单备份只能有一份 , 再次被覆盖时 , 简单备份也会被覆盖。

命令格式

运行结果

mv 文件名 文件名

将源文件名改为目标文件名

mv 文件名 目录名

将文件移动到目标目录

mv 目录名 目录名

目标目录已存在 , 将源目录;移动到目标目录;目标目录不存在则改名

mv 目录名 文件名

出错

  1. 如果mv 命令的目标和源在相同的文件系统 , 作为mv命令用新的文件名创建对应的新的目录项删除旧目录条目对应的旧的文件名不影响inode表(除时间戳)或磁盘上的数据位置,没有数据被移动;如果目标和源在一个不同的文件系统 , mv相当于cprm

  2. 如果源文件与目标文件在同一个目录中,mv的作用就是改文件名,如果目标文件已存在则会覆盖该文件。

示例

[root@localhost ~]# ll ./test/1
-rw-r--r-- 1 root root 2 Nov 11 04:27 ./test/1
[root@localhost ~]# cat ./test/1
2
[root@localhost ~]# mv --backup=t 1 ./test/
mv: overwrite ‘./test/1’? y
[root@localhost ~]# cat ./test/1
1
[root@localhost ~]# cat ./test/1.~1~
2
​

3.6 rename

重命名文件 , 同样可批量修改文件名字

  • 语法 : rename [options] expression replacement file...

    • expression : 表示要修改的文件名称

    • replacement : 表示文件需要修改成什么样字

    • file : 要修改的文件名称

rename  .htm   .html   *.htm    
rename foo foo0 foo?  
rename foo foo0 foo??  
[root@centos6 ~]# touch 1.html 2.html 3.html 4.html
[root@centos6 ~]# rename .html .htm *.html
[root@centos6 ~]# ll *.ht*
-rw-r--r--. 1 root root 0 May 30 00:02 1.htm
-rw-r--r--. 1 root root 0 May 30 00:02 2.htm
-rw-r--r--. 1 root root 0 May 30 00:02 3.htm
-rw-r--r--. 1 root root 0 May 30 00:02 4.htm
​

3.7 rm

删除文件或者目录

  • 语法 : rm [OPTION]... FILE...

  • OPTIONS

    • -f,--force : 强制删除文件或者目录

    • -i :在删除文件或者目录前会询问确认

    • -I : 在删除三个以上的文件之前或递归删除时提示一次;比-i更不具侵入性 , 同时仍然防止大多数错误。

    • --no-preserve-root : 不会保护root目录,/do not treat '/' specially

    • --preserve-root : 不允许删除根目录,rm允许的默认项。

    • -r,-R,--recursive : 递归删除目录下面的文件

    • -d, --dir : 删除空目录。

    • -v, --verbose : 显示删除的详细信息。

3.8 file

查看文件类型。

  • 语法 : file [ -bchikLnNprsvz ] [ -f namefile ] [ -F separator ] [ -m magicfiles ] file ...

  • OPTIONS

    • -b : 列出文件辨识结果时 , 不显示文件名称。

    • -c : 详细显示指令执行过程 , 便于排错或分析程序执行的情形

    • -f : 列出文件中文件名的文件类型

    • -F : 使用指定分隔符号替换输出文件名后的默认的" : "分隔符。

    • -i : 输出mime类型的字符串

    • -L : 查看对应软链接对应文件的文件类型

    • -z : 尝试去解读压缩文件的内容

    • --help : 显示命令在线帮助

    • -version : 显示命令版本信息

4. 文件查看类命令

4.1 cat

文件文本查看工具

  • 语法 : cat [OPTION]...[FILE]...

  • OPTIONS

    • -n,--number:给显示的文件行编号

    • -b,--number-nonblank : 和 -n 相似 , 只不过对于空白行不编号。

    • -s, --squeeze-blank : 当遇到有连续两行以上的空白行 , 就代换为一行的空白行。

    • -E ,--show-ends : 显示行结束符$

    • -T--show-tabs : 将 TAB 字符显示为 ^I

    • -A:显示所有控制符

  • 主要功能 :

    1. 一次显示整个文件。$ cat filename

    2. 创建一个新的文件 , 并直接从键盘 , 将内容直接输入进去。$ cat > filename , 只能创建新文件,不能编辑已有文件.

    3. 将几个文件合并为一个文件 : $cat file1 file2 > file

tac : 这个命令本身的功能和cat一样 , 只是显示的结果 , 刚好和cat的顺序相反。

[root@centos6 ~]# cat /etc/issue
CentOS release 6.9 (Final)
Kernel \r on an \m
​
[root@centos6 ~]# tac /etc/issue
​
Kernel \r on an \m
CentOS release 6.9 (Final)
​

4.2 less

一页一页的查看文件或STDIN输出

  • 语法 : less [OPTIONS] filename

  • OPTIONS :

    • -e : 当文件显示结束后 , 自动离开

    • -f : 强迫打开特殊文件 , 例如外围设备代号、目录和二进制文件

    • -i : 忽略搜索时的大小写

    • -N : 显示每行行号

    • -s : 显示连续空行为一行

  • 基本操作 :

    • /文本 : 搜索文本

    • n/N : 跳到下一个 或上一个匹配

    • b : 向后翻一页

    • d : 想后翻半页

    • h : 显示帮助界面

    • Q : 退出less命令

    • u : 向前滚动半页

    • y : 向前滚动一行

    • 空白行 : 滚动一行

    • 回车键 : 滚动一页

    • [pagedown] :向下翻动一页

    • [pageup] : 向上翻动一页

    • F : 类似tail -f

    • gg : 调到文本的最前面

    • G : 调到文本末尾

    • v : 直接编辑当前文件

    • :e file2 : 打开另一个文件

正在浏览一个文件时 , 使用:e 打开另一个文件
less file1
: e file2
浏览多个文件
less log2013.log log2014.log
:n 后 , 切换到log2014.log
:p 后  , 切换到log2013.log
​

less使用的分页项命令与man类似

4.3 more

分页查看文件

  • 语法 : more [OPRIONS...] FILE...

  • OPTIONS:

    • +n : 从笫n行开始显示

    • -n : 定义屏幕大小为n

    • +/pattern : 在每个文件中显示前搜寻该字串 ( pattern ) , 然后从该字串前两行之后开始显示

    • -d : 显示翻页即退出提示

    • -c : 从顶部清屏 , 然后显示

    • -s : 把连续的多个空行显示为一行

  • 常用操作

    • Enter : 向下n行,需要定义。默认为1行

    • Ctrl+F : 向下滚动一屏

    • 空格键 : 向下滚动一屏

    • Ctrl+B : 返回上一屏

    • = : 输出当前行的行号

    • :f 输出文件名和当前行的行号

    • V : 调用vi编辑器

    • 按H键 : 显示帮助屏 , 该屏上有相关的帮助信息。

    • !命令 : 调用Shell , 并执行命令

    • q : 退出more

[root@localhost ~]# more +/22:06:05 log.ctdb-20180722
​
...skipping
2017/12/12 22:05:35.447466 [ 7643]: 49.winbind: ERROR: wbinfo -p returned error
2017/12/12 22:05:50.672362 [ 7643]: 49.winbind: ERROR: wbinfo -p returned error
2017/12/12 22:06:05.893017 [ 7643]: 49.winbind: ERROR: wbinfo -p returned error
2017/12/12 22:06:21.099632 [ 7643]: 49.winbind: ERROR: wbinfo -p returned error
2017/12/12 22:06:36.304641 [ 7643]: 49.winbind: ERROR: wbinfo -p returned error
2017/12/12 22:06:51.510972 [ 7643]: 49.winbind: ERROR: wbinfo -p returned error
​

4.4 head

查看文件中开头的几行

  • 语法 : head [OPTION]... [FILE]

  • OPTIONS

    • -c# : 指定获取前#字节

    • -n# : 指定获取前#行

    • -# : 指定行数

4.5 tail

查看文件结尾的几行

  • 语法 : tail [OPTION]... [FILE]...

  • OPTIONS

    • -c# : 指定获取后#字节

    • -n # : 指定获取后#行 //n可以省略

    • +n # : 从倒数第五行开始显示显示五行

    • -f : 跟踪显示文件fd新追加的内容 , 常用日志监控 , 相当于--follow=descriptor

tailf 类似tail -f ,当文件不增长时并不访问文件,这个对于机器的负载相对于tail -f 要低一点

5. 文件分割命令

5.1 split

split工具的功能是将文件切分为多个小文件。既然要生成多个小文件 , 必然要指定切分文件的单位 , 支持按行切分以及按文件大小切分 ,另外还需解决小文件命名的问题。例如 , 文件名前缀、后缀。如果未明确指定前缀, 则默认的前缀为x

  • 语法 : split [OPTION]... [FILE [PREFIX]]

  • options

    • -a N : 生成长度为N的后缀 , 默认N=2

    • -b N : 每个小文件的N , 即按文件大小切分文件。支持K,M,G,T(换算单位1024),或KB,MB,GB(换算单位1000)等 , 默认单位为字节

    • -l N : 每个小文件中有N行 ,即按行切分文件

    • -d N : 指定生成数值格式的后缀替代默认的字母后缀, 数值从N开始 , 默认为0。例如两位长度的后缀01/02/03

    • --additional-suffix=string : 为每个小文件追加额外的后缀 , 例如加上.log。有些老版本不支持 ,在CentOS 7.2上已支持

    • --filter CMD : 不再直接切割输出到文件 ,而是切割后作为管道的输入, 通过管道将切割的数据传递给CMD执行。如果需要指定文件 ,则split自动使用$FILE变量。

    • INPUT : 指定待切分的输入文件 , 如要切分标准输入 , 则使用-

    • PREFIX : 指定小文件的前缀 , 如果未指定 , 则默认为x

  • 按CHUNKS进行分割

    • -e : 当使用-n时 , 不要生成空文件。例如5行数据 , 却要求按行切割成100个文件 , 显然第5个文件之后都是空文件

    • -n CHUNKS,--number=CHUNKS : 按照一定规则将文件分割为多个个块输出值小文件中。

      • N : 根据文件大小均分为N个文件(最后一个文件可能大小不均)

      • K/N : 输出(打印到屏幕、标准输出)N个文件中的第K个文件内容。(不是切割后再找到这个文件进行输出 , 而是切割到这个文件时立即输出)

      • l/N : 按行的方式均分为N个文件(最后一个文件可能行数不均)

      • l/K/N : 按l/N切割的同时 , 输出属于第K个文件的内容。

      • r/N : 类似于l的形式 , 但对行进行轮询方式切割。例如第一行到第一个文件 , 第二行到第二个文件

      • r/K/N : 按照r/N切割时 , 输出第K个文件的内容

    说明 : l(小写的L)和r为文件切割模式。K: 表示在屏幕中输出第K个文件内容。N: 将原本文件分割为N个文件。

示例:

#按行切分文件/etc/fstab, 每5行分割一次文件,小文件默认后缀名为xaa,从aa开始一直往后排序
[root@centos8 ~]# split -l 5 /etc/fstab 
[root@centos8 ~]# ls
xaa  xab  xac
​
#每隔5行切割一次, 指定数值为后缀,同时后缀有3位
[root@centos8 ~]# split -l 5  -d -a 3 /etc/fstab 
[root@centos8 ~]# ls
alp.txt  anaconda-ks.cfg  x000  x001  x002
[root@centos8 ~]# cat x00* > fs.bak
[root@centos8 ~]# md5sum fs.bak /etc/fstab 
84492789c176b85d35a03dfddac66ad6  fs.bak
84492789c176b85d35a03dfddac66ad6  /etc/fstab
​
#指定前缀为test,后缀为两位数字,每隔5行分割
[root@centos8 ~]# split -l 5 -d -a 2 alp.txt  test
[root@centos8 ~]# ls
alp.txt  test00  test01  test02  test03  test04  test05
​
#将/var/log/messages文件分成10个文件
[root@centos8 ~]# split  -n 10 /var/log/messages message
​
#按行划分为10个文件,并查看第一个文件里面的内容
[root@centos8 ~]# split -n l/1/10 alp.txt 
a
b
c
[root@centos8 ~]# split -n l/10 alp.txt test
[root@centos8 ~]# ls
alp.txt  anaconda-ks.cfg  testaa  testab  testac  testad  testae  testaf  testag  testah  testai  testaj
[root@centos8 ~]# cat testaa 
a
b
c
​
#以轮询的方式分割文件,并将文件划分为10个文件,查看第一个文件中的内容
[root@centos8 ~]# split -n r/1/10 alp.txt test
a
k
u

filter CMD将切割结果传递给指定命令

默认情况下split是将文件切割传递到各文件片段中 , 如果使用--filter选项 , 则不再切割到文件片段中 , 而是通过管道的形式传递给CMD进行处理。CMD处理时 , 有可能并不需要将数据存储到文件中 , 但如果需要将处理后的数据再分片段保存到多个文件中 , 则可以使用$FILE来表示(这是split识别的变量 , 要避免被shell解析) , 就像split的普通切割模式一样。

例如 , 读取1.txt中的26行 , 平均分成5次管道传递一次 , 然后使用echo将它们输出 :

[root@centos8 ~]# split -n l/5 --filter='xargs -i echo ---:{}' alp.txt
---:a
---:b
---:c
---:d
---:e      # 第1次通过管道传递的内容
---:f
---:g
---:h
---:i
---:j      # 第2次通过管道传递的内容
---:k
---:l
---:m
---:n
---:o     # 第3次通过管道传递的内容
---:p
---:q
---:r
---:s
---:t     # 第4次通过管道传递的内容
---:u
---:v
---:w
---:x
---:y
---:z    # 第5次通过管道传递的内容

这时split是没有生成任何小文件片段的。如果想要将上面的输出保存到小文件片段中 , 使用$FILE , 这个变量是split内置变量 , 不能被shell解析 , 所以出现$FILE的地方必须使用单引号保护起来:

[root@centos8 ~]# split -n l/5 --filter='xargs -i echo ---:{} > $FILE.log' alp.txt
[root@centos8 ~]# ls xa*
xaa.log  xab.log  xac.log  xad.log  xae.log  
[root@centos8 ~]# cat xaa.log 
---:a
---:b
---:c
---:d
---:e

其中的$FILE就是split进行命名的部分。上面的小文件中 , 都是以fs_为前缀 , 以.log为后缀。

filter有时候是很有用的 , 例如将一个大的压缩文件 , 切割成多个小的压缩文件。

xz -dc BIG.xz | split -b200G --filter='xz > $FILE.xz' - big-

xz -dc表示解压到标准输出 , 解压的数据流将传递给split , 然后每200G就通过filter中的xz命令进行压缩 , 压缩后的文件名格式类似于big-aa.xz big-ab.xz

5.2 csplit

split只能按行或按照大小进行切分 , 无法按段落切分。csplitsplit的变体 , 功能更多 , 它主要是按指定上下文按段落分割文件。

  • csplit [OPTION]... FILE PATTERN...

  • OPTIONS

    • -b FORMAT : 指定文件后缀格式 , 格式为printf的格式 。默认为%02d。表示后缀以2位数值 , 且不足处以0填充。

    • -f PREFIX : 指定前缀 , 不指定是默认为xx

    • -k : 出现错误时, 不会删除原本已经生成的文件。

    • -m : 明确禁止文件的行去匹配PATTERN

    • -s : 不打印文件大小

    • -z : 如果切分后的小文件中有空文件 , 则删除它们。

    • FILE : 待切分的文件 , 如果要切分标准输入数据 , 则使用-

    • PATTERNs

      • INTEGER : 数值 ,假如为N , 表示拷贝1N-1行的内容到一个小文件中 , 其余内容到另一个小文件中。

      • /REGEXP/[OFFSET] : 从匹配到的行开始按照偏移量拷贝指定行数的内容到小文件中。其中OFFSET的格式为+N-N ,表示向后和向前拷贝N

      • %REGEXP%[OFFSET] :匹配到的行被忽略。

      • {INTEGER} : 重复匹配模式的次数。如果为N,则表示匹配模式N次。默认只是匹配一次

      • {*} : 表示一直匹配到文件结尾才停止匹配。

测试文件如下:

[root@centos8 ~]# cat test 
SERVER-1
[connection] 192.168.0.1 success
[connection] 192.168.0.2 failed
[disconnect] 192.168.0.3 pending
[connection] 192.168.0.4 success
SERVER-2
[connection] 192.168.0.1 failed
[connection] 192.168.0.2 failed
[disconnect] 192.168.0.3 success
[CONNECTION] 192.168.0.4 pending
SERVER-3
[connection] 192.168.0.1 pending
[connection] 192.168.0.2 pending
[disconnect] 192.168.0.3 pending
[connection] 192.168.0.4 failed

直接使用csplit分割工具,这里使用命令直接进行匹配时,由于第一次匹配直接匹配第一行的SERVER,导致生成的第一个文件为空文件。由于没有指定匹配次数,默认只会匹配一次,因此只会生成两个配置文件。

[root@centos8 ~]# csplit test /SERVER/
0
419
[root@centos8 ~]#  ls
test  xx00  xx01
[root@centos8 ~]# cat xx00 
[root@centos8 ~]# cat xx01
SERVER-1
[connection] 192.168.0.1 success
[connection] 192.168.0.2 failed
[disconnect] 192.168.0.3 pending
[connection] 192.168.0.4 success
SERVER-2
[connection] 192.168.0.1 failed
[connection] 192.168.0.2 failed
[disconnect] 192.168.0.3 success
[CONNECTION] 192.168.0.4 pending
SERVER-3
[connection] 192.168.0.1 pending
[connection] 192.168.0.2 pending
[disconnect] 192.168.0.3 pending
[connection] 192.168.0.4 failed

使用命令时,可以指定生成文件的前缀log.与后缀%04d.split , more情况下是%02d。其中%04d和C语言中printf表示4位数的整数,位数不够用0凑。匹配模式匹配两次 ,如果使用{*}表示一直匹配到文件结尾处

[root@centos8 ~]# csplit -f log.  -b %04d.split -z test  /SERVER/ {2}
140
139
140
[root@centos8 ~]# cat log.000
log.0000.split  log.0001.split  log.0002.split

6. linux基础文件

  • /etc/DIR_COLORS : 记录目录中各种类型文件颜色

  • /etc/issue : 用户登录前提示信息, ( 注意 : 内容只会在本地终端登录前显示出来 , 在远程ssh登录是显示不出来的。 )

    [root@centos6 ~]# cat /etc/issue
    CentOS release 6.9 (Final)
    Kernel \r on an \m

    注 : \r : 显示KERNEL内核版本号;\l : 显示虚拟控制台号;\d 显示当前日期;\n 显示主机名;\m 显示机器类型,即CPU架构,如i386等;

  • /etc/motd : linux用户登陆后的提示信息 , 默认改文件为空 , 具体信息需要用户自己填写

    缺点是 , 现在许多用户登录系统时选择自动进入图形界面 , 所以这些 信息往往看不到。

  • /etc/gdm/custom.conf : 这个文件通过设置 , 可以不用输入密码直接登陆图形化界面,将文件修改成以下内容 , 在界面中便可以直接登陆 ,

    # GDM configuration storage
    ​
    [daemon]
    AutomaticLoginEnable=true
    AutomaticLogin=root
    [security]
    ​
    [xdmcp]
    ​
    [greeter]
    ​
    [chooser]
    ​
    [debug]
  • /etc/default/useradd : 添加新用户时 , 默认用户默认配置信息。

    # useradd defaults file
    GROUP=100
    HOME=/home
    INACTIVE=-1
    EXPIRE=
    SHELL=/bin/bash
    SKEL=/etc/skel
    CREATE_MAIL_SPOOL=yes
  • /etc/skel/:这个目录中的文件会在新用户添加时 , 复制进对应新用户的家目录中


参考链接

博客园:故道、白云:linux mkfifo命令基本用法 索引节点详解(转载):CSDN:绿叶 CSDN: Linux下 通过删除inode来删除文件:zzhongcy

熊熊