1. Linux文件类型

参考:File types In Linux/Unix explained in detail. 我就是翻译一下

一般认为Unix中有3类文件,分别是

  • 一般文件(Regular files),-
  • 目录文件(Directory files),d
  • 特殊文件,其中包含五种子类型)(Special files)
    • 块设备——Block file(b)
    • 字符设备 ——Character device file©
    • 管道——Named pipe file or just a pipe file§
    • 符号链接——Symbolic link file(l)
    • 套接字——Socket file(s)

其实Sun Solaris中还存在另一种文件类型,名为door file(D)。door是一种特殊的文件,用于客户端和服务器之间的进程间通信(因此,其实在Unix中,一共有8种文件类型)。

1.1 一般文件介绍

ls -l或者ll命令输出结果中,每行第一个字符为-的,就是普通文件,一般会是

  • 可读文件,
  • 或者 二进制文件
  • 或者 图像文件
  • 或者 压缩文件 等

如何创建一般文件?

  • 在linux中,只需要使用touch/vi 命令,创建出来的文件,保存后就是一般文件

如何例举出所有的一般文件?

hs@hs:~$ ls
KGBench      KgCLUEbench-main  main.zip                                 nebula-graph-studio                      outputs
KgCLUE-main  logs              nebula-graph-2.6.1.ubuntu2004.amd64.deb  nebula-graph-studio-3.1.0.x86_64.tar.gz

在这里插入图片描述

使用ls -l | grep ^- 命令,就只会列出,一般文件了(如果使用的CLI比较好,-还会用颜色高亮)


1.2 目录文件介绍

目录文件一般会包含 存储在物理设备上的一般文件/文件夹/特殊文件。同时使用蓝色表示,一般链接数≥2,(链接数就是ll命令第二列)

  • 和一般文件类似,筛选目录文件只需要ls -l | grep ^d
    在这里插入图片描述
    输出也会使用颜色对d进行高亮
  • 创建目录文件使用,mkdir your_categary

1.3 其他介绍

其他和上面也都是类似,包括如何创建,和如何列出这类型文件,整理成表格如下:

类型创建筛选
块设备`ls -lgrep ^b`
字符设备`ls -lgrep ^c`
管道`ls -lgrep ^p`
软链接`ls -lgrep ^l`
套接字`ls -lgrep ^s`

2. ls命令

使用ls -l或者ll查看文件详细信息。
在这里插入图片描述

  • 从上面可以看到,每一行都有7列,分别是:
  • 第一列共10位,第1位表示文档类型
    • d表示目录,-表示文件,l表示链接文件,d表示可随机存取的设备,如U盘等,c表示一次性读取设备,如鼠标、键盘等。
    • 后9位,依次对应三种身份所拥有的权限,身份顺序为:owner、group、others,权限顺序为:readable、writable、excutable。如:-r-xr-x—的含义为当前文档是一个文件,拥有者可读、可执行,同一个群组下的用户,可读、可执行,其他人没有任何权限。
  • 第二列表示链接数,表示有多少个文件链接到inode号码。
  • 第三列表示拥有者
  • 第四列表示所属群组
  • 第五列表示文档容量大小,单位字节
  • 第六列表示文档最后修改时间,注意不是文档的创建时间哦
  • 第七列表示文档名称。以点(.)开头的是隐藏文档

例如:

  • 对于第二行,也就是文件anyq_deps来说,其第一列内容为-rw-r--r--,其中第一个符号是-(英文字符减号),在linux中,这样的字符开头就表示普通文件(regular file)
    • 这些文件一般是用相关的应用程序或系统命令创建,比如touch、cp、tar等工具命令。普通命令的删除方式可以使用rm命令。
    • 提示:windows下的doc、ppt、zip、jpg等格式的文档在linux下都属于普通文件。
  • 对于最后一行,也就是文件夹third_party来说,其第一列内容为drwxr-xr-,其中第一个符号是d,表示目录类型
    • 如果仅仅想看目录权限属性时,可以使用ls的-d参数,搭配组合为ls -ld 目录名
    • 创建目录的命令可以用mdkir命令,或cp可以把一个目录复制为另一个目录。删除用rm -r或rmdir(删除空目录才可以)命令。
  • 执行ls -F,返回结果时可以直接区别目录和文件,每个目录的后面多了个斜线。如下: 在这里插入图片描述
    • 关于-F参数的解释:
      -F, --classify             append indicator (one of */=>@|) to entries
      --file-type            likewise, except do not append '*'
      --format=WORD          across -x, commas -m, horizontal -x, long -l,
                               single-column -1, verbose -l, vertical -C
      --full-time            like -l --time-style=full-iso
    
    • 代表可执行文件
    • / 代表目录
    • 代表链接文件
    • | 代表管道文件
    • 代表套接字
    • > 代表进程间通讯设备

参考:

3. 可执行文件后缀

  • 在linux中,可执行文件一般没有后缀,
  • 因为linux可以自动识别文件类型,有很多类型都不用加后缀。
  • 只要设了执行权限,有elf文件头,就可以看成可执行文件,即便是纯文本文件也可以看成是可执行的脚本。
  • 一部分下载的商业软件安装程序之类的可执行文件有.bin的后缀。有些时候可执行文件的后缀名为.out。
  • Linux下的后缀名并没用windows下那么有用,Linux不根据扩展名判断文件类型,而是根据文件的内容来判断。所以扩展名的作用是帮助人来识别文件,对于Linux系统本身来说没有什么用处。

可执行文件:
指计算机的操作系统能够解释并执行的二进制代码文件。最初的可执行文件包括代码段、数据段、堆栈段和扩展段等。代码段存放了计算机的执行指令,即CPU要进行的操作指令,数据段存放了CPU要用到的数据,堆栈段则存放了与寄存器有关的信息等等。现在你觉得许多文件都能够被计算机执行,是因为操作系统已经做得比较人性化,例如你双击一个文本文件(*.txt),该文件即被打开,这是因为操作系统调用了Notepad.exe这个可执行文件打开了这个文本文件。实际上,被执行的文件是Notepad.exe,而文本文件只是Notepad.exe的执行目标

  • 所以在linux系统中,使用ls命令返回的内容中,绿色显示的文件就都是可执行文件,没有后缀。

elf:(Executable and Linking Format)是可执行连接格式
可执行连接格式是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface(ABI)而开发和发布的。工具接口标准委员会(TIS)选择了正在发展中的ELF标准作为工作在32位INTEL体系上不同操作系统之间可移植的二进制文件格式。

参考:

4. linux的.a文件,.so文件等理解/动态链接库和静态链接库

  • .o 就相当于windows里的obj文件 ,一个.c或.cpp文件对应一个.o文件
  • .a 是好多个.o合在一起,用于静态连接 ,即STATIC mode,多个.a可以链接生成一个exe的可执行文件
  • .so 是shared object,用于动态连接的,和windows的dll差不多,使用时才载入。

(注意,上面这几个链接库文件并不是可执行文件,其可以被可执行文件调用!)

参考:


  • 库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。
  • 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)。 windows上对应的是.lib .dll linux上对应的是.a .so
  • 所谓静态、动态是指链接,下图是一个典型的编译过程
  • 静态库之所以成为【静态库】,是因为在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。因此对应的链接方式称为静态链接。
  • 试想一下,静态库与汇编生成的目标文件一起链接为可执行文件,那么静态库必定跟.o文件格式相似。其实一个静态库可以简单看成是一组目标文件(.o/.obj文件)的集合,即很多目标文件经过压缩打包后形成的一个文件。
  • 静态库特点总结:
    • 静态库对函数库的链接是放在编译时期完成的。
    • 程序在运行时与函数库再无瓜葛,移植方便。
    • 浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。
  • 动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。
  • 不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,规避了空间浪费问题。
  • 动态库在程序运行是才被载入,也解决了静态库对程序的更新、部署和发布页会带来麻烦。用户只需要更新动态库即可,增量更新。
    在这里插入图片描述
  • 动态库特点总结:
    • 动态库把对一些库函数的链接载入推迟到程序运行的时期。
    • 可以实现进程之间的资源共享。(因此动态库也称为共享库)
    • 将一些程序升级变得简单。
    • 甚至可以真正做到链接载入完全由程序员在程序代码中控制(显示调用)

参考:

5. 文件属性/权限

参考菜鸟教程:Linux 文件基本属性

Logo

更多推荐