Python学习week1-linux文件系统与IO重定向

1、linux文件系统

1.1、文件系统

# 什么是文件系统?

硬盘分区之后,还需要格式化,这个格式化操作其实就是指定文件系统;文件系统的本质就是对一个存储设备上的元数据和数据的组织;

1.2、文件系统特征

(1)文件和目录被组织成一个单根倒置树状结构;

(2)文件系统从根目录下开始,用“/”表示;

(3)根文件系统(rootfs)

(4)文件名区分大小写

(5)以“.”开头的为隐藏文件,路径分隔符为“/”

(6)文件有两类数据:元数据和数据

(7)文件系统分层结构

(8)FHS:文件系统结构标准

1.3、文件名命名规范

(1)文件名最长255字节;

(2)包括路径在内的文件名称最长4095字节;

(3)除了/和nul,所有字符都有效;

(4)区分字符大小写

1.4、文件系统结构

# /boot:引导文件存放目录,内核文件(vmlinuz),引导加载器(bootloader,grub)等文件存放目录;

# /bin:提供所有用户使用的基本命令,不能关联至其他分区,系统启动会用到的程序;

# /sbin:管理类的基本命令;

# /lib:启动时程序依赖的基本共享库文件以及内核模块文件(/lib/modules)

# /lib64:专用于x86_64位系统的辅助共享库文件存放目录;

# /etc:配置文件存放目录;

# /home:普通用户家目录;

# /root:管理员家目录;

# /media:移动设备挂载点;

# /dev:设备文件以及特殊文件存储位置;例如:b --->block device 随机访问,c--->character device 线性访问(顺序访问);

# /usr ---> universal shared read-only data

# /var ---> variable data files

  /var/cache:应用程序缓存数据目录;

  /var/lib:应用程序状态信息数据;

  /var/lock:锁文件

  /var/log:日志文件

  /var/run:运行中的进程相关数据,通常用于存放进程pid文件;

  /var/tmp:保存系统2次重启之间产生的临时数据;

# /proc:用于输出内核与进程信息相关的虚拟文件系统;

# /sys:用于输出当前系统上硬件设备相关信息的虚拟文件系统;

# /tmp:存放临时文件,存放在该目录中的文件默认如果30天内没有被访问则会被清除;(重启系统也会清除)

###总结:一般linux上的应用程序的组成部分:

(1)二进制程序存放位置:/bin,/sbin,/usr/bin,/usr/sbin,/usr/local/bin,/usr/local/sbin等;

(2)库文件:/lib,/lib64,/usr/lib,/usr/lib64,/usr/local/lib,/usr/local/lib64等;

(3)配置文件:/etc,/etc/apps,/usr/local/etc等;

(4)帮助文件:/usr/share/man等;

1.5、linux下的文件类型

 

2、文件管理

2.1、文件查看命令

# ls命令:列出目录内容

  用法:ls [options][files_or_dirs]

  实例:

    ls -a:显示所有文件,包含隐藏文件;

    ls -A:显示所有文件,不包含"."和“..”;

    ls -l:长格式显示;

    ls -R:递归显示目录及子目录;

    ls -1:以一列的方式显示;

    ls -ld:以长格式显示目录及文件,不显示子文件及子目录信息;

# stat命令:查看文件状态信息

# 三个时间说明:

(1)atime:文件访问时间,当文件被读取和查看的时候时间更新;

(2)mtime:文件数据修改时间,当文件数据被修改的时候更新,但是文件的元数据被修改,mtime时间不变;

(3)ctime:当文件的元数据或者数据被修改,时间都会被更新

2.2、创建文件

# touch命令:文件存在则修改文件时间戳,不存在则创建文件;

  选项:

    -a:更新atime和ctime;

    -m:更新mtime和cime;

    -c:如果文件存在则更新3个时间戳,不存在则不做任何操作;

# mkdir命令:创建目录

  选项:

    -p:可以创建多级目录;

    -v:显示创建过程信息;

    -m:创建的同时指定目录权限;

2.3、删除文件

# rmdir命令:删除空目录;

# rm -rf :删除命令,慎用;

2.4、修改文件

# cp命令:复制文件或者目录;

(1)当源文件是一个文件时

    # 当目标文件不存在,就新建同名文件,并拷贝源文件内容至新文件;

    # 当目标文件存在,且为一个文件,则覆盖该文件,

    # 当目标文件时一个目录时,则将源文件拷贝至目标目录文件之下;

(2)当源文件时多个文件时

    # 当目标文件不存在,则报错(目标文件必须为一个目录文件)

(3)当源文件是一个目录文件时

    # 当目录不存在,则创建指定名称的目录,并将所有文件放在这个目录下;

    # 当目标文件存在,且为一个文件则会报错;如果为一个目录,则会合并两个目录,相同文件则会被覆盖;

##常用选项:

  -i:覆盖文件时候的交互式提示;

  -r:递归复制,可以复制目录;

  -a:归档,相当于 -dR --preserve=all;

  -f:强制覆盖;

  -v:显示复制过程;

# mv命令:移动或重命名文件

  -i:交互式;

  -f:强制覆盖;

记录一个特殊用法:mv  /tmp/b{,.dir} ==> mv /tmp/b /tmp/b.txt

2.5、绝对路径与相对路径

# 绝对路径:从“/”开始的路径,例如:/home/lxroot/a.txt;

# 相对路径:相对于当前目录,例如:../jjgame/;

# 以/home/lxroot/a.txt 位列

# 基名:basename  a.txt

# 目录名:dirname  /home/lxroot

2.6、文件通配符

# 文件通配符一般用来作为文件名的匹配;

3、文件系统特性

3.1、文件系统组成

(1)superblock超级块

# 文件系统中第一个块被称为超级块,记录了整个文件系统的整体信息,包括inode/block的总量,剩余量等;

(2)inode

# 记录文件的属性,一个文件占用一个inode,同时也记录文件所在的block号;

(3)block数据块

# 实际记录文件内容区域,如果文件内容大于1个block的大小(最小block为1k),则需要多个block;

# 一个文件由目录项+inode+block组成,其中目录项=文件名+inode;

3.2、各种操作对于inode号变化

(1)cp对于inode变化

# 复制文件,简单的理解为复制文件就是所有新inode号+新的block;

(2)rm对于inode变化

# 释放inode号,删除目录项,将inode和block位置标记为空闲,实际数据不会马上被删除,当其他文件使用到该block块,数据会被覆盖;

(3)mv对于inode变化

# 如果在同一文件系统下移动,在目录项中添加新的文件名和inode号的对应关系(inode号不变),如果不在同一文件系统中,则和cp或rm类似;

4、软或硬链接

4.1、硬链接(hard link)

# 对于文件而言,计算机真正的识别标识为inode号而非文件名,目录文件的机构可以理解为[ dir:(filename,inode_number)]

# 目录或者文件名不相同,但是inode号相同的文件,称为“硬链接”;由于硬链接的inode号相同,就会拥有相同的inode与block的对应关系;

# 简单来说,对于一个文件做硬链接,相当于对这个文件的内容增加了一个读取入口而已;

# 总结:

(1)硬链接创建的时候占用一个计数引用(连接数),不占用新的inode号;

(2)对于被硬链接的文件和链接文件,任意其一被修改,二者内容都会被修改;

(3)硬链接不支持跨区,不支持目录文件;

(4)删除文件时候,只减少连接数,直到连接数为0;

4.2、软链接(soft link)

# 语法:ln -s file1 file2

(1)软链接又称为符号链接,相当于windows的快捷方式,完全依赖原文件;

(2)软链接创建的时候不会占用连接数,但是会额外占用一个inode号;

(3)软链接需要使用绝对路径,且大小取决于路径字符数;

(4)软链接可以跨分区,也可用于目录文件;

5、I/O重定向

5.1、文件的标准输入与输出

# 程序=指令+数据

  数据分为:读入数据input,输出数据output

# 打开的文件都有一个fd:file description 文件描述符

# linux提供给程序三种I/O设备

  标准输入(stdin,0) 默认接受键盘的输入

  标出输出(stdout,1)默认输出到终端minor

  标准错误输出(stderr,2)默认输出到终端minor

# 什么叫I/O重定向:其实就是改变输入与输出的默认位置;

 # 支持的符合操作

# >>:表示为追加重定向;

2>&1 :表示2追随1,即正确输出到哪,错误输出也到哪;

/dev/null:是一个特殊文件,它把所有传递给它的内容全部丢弃;

() :能合并多个程序改变标准输出;

6、管道的使用

# 管道(使用符号“|”表示)用来连接命令

# 语法:command1 | command2 | command3

# 说明:将命令1的STDOUT发送给命令2的STDIN,命令2的STDOUT发送到命令3的STDIN;

# 注意:STDERR默认不能通过管道转发,可以利用2>&1或者|&来实现;

原文地址:https://www.cnblogs.com/soulgou123/p/9377189.html