Linux基础-05-文件管理
Linux文件系统介绍
文件系统
Window:C:\Users\xxx\xxx\xxx
Linux: /etc/sysconfig/network-scripts/
文件=Metadata+Data
Metadata:元数据,描述文件属性等信息
Data:数据,文件本身的信息
文件名称命名规则
- 严格区分大小写
- 可以使用除/以外的任意字符,避免使用一些特殊字符(* . ?)
- 不超过255字符
- 以.开头的文件为隐藏文件
文件路径
绝对路径:从/位置开始(从根位置开始)
相对路径:从.开始(从当前位置开始)
文件类型
- 普通文件 [-]
- 目录文件 [d]
- 块设备文件 [b]
- 字符设备文件 [c]
- 套接字文件 [s]
- 管道文件 [p]
- 链接文件 [l]
如何去查看文件类型
- ls -l -a命令(ll)
- file命令
- stat命令
目录结构
注意:介绍/下的第1级目录
bin:Binary缩写,存放着经常使用的命令
boot:启动Linux需要的部分核心文件
dev:Device缩写,Linux外部设备(磁盘等)
etc:系统管理所需要的配置文件和子目录
home:用户的家目录
lib:程序运行时所依赖的库文件(包括内核模块)
lib64:专用于x86_64系统上的辅助共享库文件存放位置
media:自动识别的设备存放位置
mnt:用户临时挂载别的文件系统
opt:安装额外软件的存放位置
proc:虚拟目录,访问该目录可以获取系统相关信息
root:超级管理员家目录
run:存储系统运行依赖所有信息
sbin:超级管理员所使用的命令
srv:服务启动后需要的数据
sys:子文件系统,会映射一些内核信息(针对内核做调整的话)
tmp:临时文件目录
usr:用户的应用程序和相关文件
var:经常被修改的文件存储位置(日志等)
显示目录结构信息
- tree /xxx — 显示指定目录中的所有数据和所有结构信息
- tree -L 2 / — 查看目录结构层级信息
- tree -d /xxx — 显示目录中所有结构信息
命令使用规则
<command> [options] [obj]
options:
- 长选项 –
- 短选项 - 短选项可以组合使用(-aild)
- 一般来说,短选项的使用放在长选项之前
obj:肯定是文件
注意有空格
ls命令[root@test ~]# ls --help
Usage: ls [OPTION]… [FILE]…
List information about the FILEs (the current directory by default).
OPTIONS:
-a : 显示所有文件(包括隐藏文件)
-l :显示列表中文件的详细信息
-i : 显示文件的inode号
-d :查看目录文件的信息
pwd命令: 显示当前路径[root@test tmp]# pwd
cd命令 : 切换目录
cd命令默认是切换到各自的家目录下:/root/
1 | [root@test tmp]# cd /etc/sysconfig/network-scripts/ |
Linux基础文件操作
目录管理命令
- mkdir 命令:创建目录
- 常用参数:
- -p:递归创建
- -v:显示创建过程
- -m:指定权限 如
mkdir -m 700 /usr/xxx
- 常用参数:
1 | [root@test tmp]# mkdir -pv book/linux |
rmdir 命令:删除目录
- -p:递归删除
- -v:显示删除过程
mktemp命令:用来建立暂存文件,其创建的临时文件是唯一的 ,供shell 使用 。
TEMPLATE 最后部分必须含有至少 3 个连续的”X“。如果 TEMPLATE 没有指定,将会使用tmp.XXXXXXXXXX。
- -q:不显示任何有关文件或目录创建错误信息
- -d:创建一个目录而非文件
- -u:不创建任何东西,仅打印出名字
- –tmpdir[=DIR]:在指定目录下
文件时间戳
文件 = 元数据 + 用户数据
metadata + data
stat命令:查看文件的元数据信息
file 显示文件信息类型命令
三种类型的文件时间戳:
Access: 2020-02-06 02:34:47.219532839 -0500 访问时间(读取文件内容) atime
Modify: 2020-02-06 02:34:47.219532839 -0500 修改时间(改变文件内容) mtime
Change: 2020-02-06 02:34:47.219532839 -0500 改变时间(元数据的改变) ctime
- touch命令:可以创建文件
- -a :只更改atime
- -m : 只更改mtime
- -t :指定更改时间的格式
文件管理类命令
cp命令
原理:新建文件
Usage: cp [OPTION]… [-T] SOURCE DEST
or: cp [OPTION]… SOURCE… DIRECTORY
or: cp [OPTION]… -t DIRECTORY SOURCE…- -a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpr参数组合。
- -d:复制时保留链接。这里所说的链接相当于Windows系统中的快捷方式。
- -f:覆盖已经存在的目标文件而不给出提示。
- -i:与-f选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答”y”时目标文件将被覆盖。
- -p:除复制文件的内容外,还把修改时间和访问权限也复制到新文件中。
- -r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。
- -l:不复制文件,只是生成链接文件。
- -t:指定复制到的目标目录
注意
- SRC是单个文件
- DEST不存在: 将SRC文件内容写入到DEST文件中
- DEST存在: 将SRC文件覆盖至DEST文件中
- SRC是多个文件
- DEST必须是个目录
- SRC是目录文件:
- 需要使用-r参数
- DEST为目录:
- DEST不存在: 创建同名目录和一致性文件
- DEST存在: 一致性文件
- DEST为文件:报错
- SRC是单个文件
mv命令: 移动文件
原理:在同一文件系统,改变的仅是其路径;不在同一文件系统,复制数据至目标文件,并删除原文件。
Usage: mv [OPTION]… [-T] SOURCE DEST
or: mv [OPTION]… SOURCE… DIRECTORY
or: mv [OPTION]… -t DIRECTORY SOURCE…- -i: 若指定目录已有同名文件,则先询问是否覆盖旧文件;
- -f: 在 mv 操作要覆盖某已有的目标文件时不给任何指示;
- -b:当文件存在时,覆盖前为其创建一个备份
命令格式 | 运行结果 |
---|---|
mv 文件名 文件名 | 将源文件名改为目标文件名 |
mv 文件名 目录名 | 将文件移动到目标目录 |
mv 目录名 目录名 | 目标目录已存在,将源目录移动到目标目录;目标目录不存在则改名 |
mv 目录名 文件名 | 出错 |
rm命令:删除文件
原理:将此文件指向的所有data block和inode标记为未使用
- -i 删除前逐一询问确认。
- -f 即使原档案属性设为唯读,亦直接删除,无需逐一确认。
- -r 将目录及以下之档案亦逐一删除。
- -v 显示过程
更多命令及用法请参看:
文件链接
stat
查看文件类型
链接方式
- 硬链接:为inode分配多个文件名,通过文件名找到inode,从而读取文件信息
- 软链接:类似Window上的快捷方式
文件 = metadata + data
inode: 一个指向数据存储位置的指针
block: 索引节点指向的位置,文件或数据的具体内容
metdata: inode 文件名 等信息
读取数据的原理
找到指定数据
读取数据内容,先获取文件数据inode信息
根据inode信息在磁盘上找到对应block
根据block信息获取文件真正内容
1 | 元数据信息 |
ln命令
作用:创建链接文件
Usage: ln [OPTION]… [-T] TARGET LINK_NAME (1st form)
常见选项:
- -s: 建立符号链接文件,默认情况下是硬链接文件
- -f: 强制创建
- -i: 交互模式
- -v:显示每个链接文件的名字
- -b:为每个已存在的目标文件创建备份文件
1 | [root@test tmp]# ll -i 1.txt |
注意:
- 当我们创建硬链接文件的时候,inode不会发生改变,链接数会加1,同时文件内容相同
- 当我们创建软链接文件的时候,inode会重新分配,链接数保持为1,同时文件内容相同
- 链接目的:在节省存储空间的情况下,共享文件
- 当源文件内容改变时,软硬链接文件内容都会改变
1 | [root@test tmp]# echo "eagles" >> 1.txt |
- 当删除源文件时,软链接失效,硬链接正常;硬链接其实和源文件可以说表现上是独立的
1 | [root@test tmp]# rm 1.txt |
硬链接特点
- 无论修改源文件还是硬链接文件,另一个文件都会改变
- 无论删除源文件还是硬链接文件,只要存在一个文件(link),这个文件依然可用
- 硬链接不会新建inode,也不会更改inode的总数
- 硬链接不能跨文件系统,因为在不同的文件系统中inode号是可以重新进行分配的
- 硬链接不能够链接目录
软链接特点
无论修改源文件还是软链接文件,另一个文件都会改变
删除软链接文件,源文件不受影响;反之,软链接文件不正常
软链接会新建inode号和block,block中不存储实际文件数据,只存源文件的inode和绝对路径
软链接是可以链接目录的
软连接是可以跨分区的
问题:导致文件创建失败的原因
- 命令有误
- 空间不足
- inode无法分配
- 无相应权限
- 文件重名
文件查找
- 在文件系统上查找符合条件的文件
- 文件查找:locate, find
- 非实时查找(数据库查找):locate
- 实时查找:find
locate
查询系统上预建的文件索引数据库
/var/lib/mlocate/mlocate.db依赖于事先构建的索引
索引的构建是在系统较为空闲时自动进行(周期性任务),管理员手动更新数据库
updatedb
索引构建过程需要遍历整个根文件系统,极消耗资源
工作特点:
- 查找速度快
- 模糊查找
- 非实时查找
- 搜索的是文件的全路径,不仅仅是文件名
- 可能只搜索用户具备读取和执行权限的目录
常用选项
- -i 不区分大小写的搜索
- -n N 只列举前N个匹配项目
- -r 使用基本正则表达式
示例
- 搜索名称或路径中带有“conf”的文件
locate conf
- 使用Regex来搜索以“.conf”结尾的文件
locate -r ‘\.conf$’
- 搜索名称或路径中带有“conf”的文件
find
实时查找工具,通过遍历指定路径完成文件查找
工作特点:
- 查找速度略慢
- 精确查找
- 实时查找
- 可能只搜索用户具备读取和执行权限的目录
语法:find [OPTION]… [查找路径] [查找条件] [处理动作]
- 查找路径:指定具体目标路径;默认为当前目录
- 查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件
- 处理动作:对符合条件的文件做操作,默认输出至屏幕
查找条件
指搜索层级
- -maxdepth level 最大搜索目录深度,指定目录下的文件为第1级
- -mindepth level 最小搜索目录深度
先处理目录内的文件,再处理指定目录
- -depth
使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用了- depth选项,那么-prune选项将被find命令忽略。
- -prune
根据文件名和inode查找:
- -name “文件名称”:支持使用glob
- *, ?, [], [^]
- -iname “文件名称”:不区分字母大小写
- -inum n 按inode号查找
- -samefile name 相同inode号的文件
- -links n 链接数为n的文件
- -regex “PATTERN”:以PATTERN匹配整个文件路径,而非文件名称
- -name “文件名称”:支持使用glob
根据属主、属组查找:
- -user USERNAME:查找属主为指定用户的文件
- -group GRPNAME: 查找属组为指定组的文件
- -uid UserID:查找属主为指定的UID号的文件
- -gid GroupID:查找属组为指定的GID号的文件
- -nouser:查找没有属主的文件
- -nogroup:查找没有属组的文件
根据文件类型查找
-type TYPE
- f: 普通文件
- d: 目录文件
- l: 符号链接文件
- s:套接字文件
- b: 块设备文件
- c: 字符设备文件
- p: 管道文件
空文件或目录
-empty
示例:find /app -type d -empty
组合条件:
- 与:-a
- 或:-o
- 非:-not !
德·摩根定律:
- (非 A) 或 (非 B) = 非(A 且 B)
- (非 A) 且 (非 B) = 非(A 或 B)
示例:
- !A -a !B = !(A -o B)
- !A -o !B = !(A -a B)
根据文件大小来查找:
- -size [+|-]#UNIT
常用单位:k, M, G,c(byte) - #UNIT: (#-1, #]
- 如:6k 表示(5k,6k]
- -#UNIT:[0,#-1]
- 如:-6k 表示[0,5k]
- +#UNIT:(#,∞)
- 如:+6k 表示(6k,∞)
- -size [+|-]#UNIT
根据时间戳:
以“天”为单位
-atime [+|-]#,
- #: [#,#+1)
- +#: [#+1,∞]
- -#: [0,#)
-mtime
-ctime
以“分钟”为单位
-amin
-mmin
-cmin
根据权限查找:
-perm [/|-]MODE
- MODE: 精确权限匹配
- /MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系,+ 从centos7开始淘汰
- -MODE:每一类对象都必须同时拥有指定权限,与关系
- 0 表示不关注
- find -perm 755 会匹配权限模式恰好是755的文件
- 只有当每个人都有写权限时,find -perm -222才会匹配
- 只有当其它人(other)有写权限时,find -perm -002才会匹配
处理动作
- -print:默认的处理动作,显示至屏幕
- -ls:类似于对查找到的文件执行“ls -l”命令
- -delete:删除查找到的文件
- -fls file:查找到的所有文件的长格式信息保存至指定文件中
- -ok COMMAND {} ; 对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,都会交互式要求用户确认
- -exec COMMAND {} ; 对查找到的每个文件执行由COMMAND指定的命令
- {}: 用于引用查找到的文件名称自身
- find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令
参数替换xargs
- 由于很多命令不支持管道|来传递参数,xargs用于产生某个命令的参数,xargs
可以读入 stdin 的数据,并且以空格符或回车符将 stdin 的数据分隔成为参数 - 许多命令不能接受过多参数,命令执行可能会失败,xargs可以解决
- 注意:文件名或者是其他意义的名词内含有空格符的情况
- find和xargs的组合:find | xargs COMMAND
- -i 用{}来指定传递的数据
- 示例:
ls | xargs rm
删除当前目录下的大量文件- find /sbin/ -perm +700 | ls -l 这个命令是错误的
- find /bin/ -perm /7000 | xargs ls -sl 查找有特殊权限的文件,并排序
- find -type f -name “*.txt” -print0 | xargs -0 rm 以字符nul分隔
示例
找出/tmp目录下,属主不是root,且文件名不以f开头的文件
find /tmp \( -not -user root -a -not -name 'f*' \) -ls
find /tmp -not \( -user root -o -name 'f*' \) –ls
查找/etc/下,除/etc/sane.d目录的其它所有.conf后缀的文件
find /etc -path ‘/etc/sane.d’ -a -prune -o -name "*.conf"
查找/etc/下,除/etc/sane.d和/etc/fonts两个目录的所有.conf后缀的文件
find /etc \( -path "/etc/sane.d" -o -path "/etc/fonts" \) -a -prune -o -name "*.conf"
备份配置文件,添加.orig这个扩展名
find -name “*.conf” -exec cp {} {}.orig \;
提示删除存在时间超过3天以上的joe的临时文件
find /tmp -ctime +3 -user joe -ok rm {} \;
在主目录中寻找可被其它用户写入的文件
find ~ -perm -002 -exec chmod o-w {} \;
查找/data下的权限为644,后缀为sh的普通文件,增加执行权限
find /data –type f -perm 644 -name “*.sh” –exec chmod 755 {} \;
查看/home的目录
find /home –type d -ls
查找/var目录下属主为root,且属组为mail的所有文件或目录
find /var ‐user root ‐group mail
查找/usr目录下不属于root,bin或Hadoop的所有文件或目录
find /usr ‐not ‐user root ‐a ‐not ‐user bin ‐a ‐not ‐user centos
find /usr ‐not \(‐user root ‐o ‐user bin ‐o ‐user hadoop\)
查找/etc目录下最近一周内容曾被访问过的文件或目录
find /etc/ ‐atime ‐7
查找当前系统上没有属主或属组,且最近一周内曾被访问过的文件或目录
find / ‐nouser ‐a ‐nogroup ‐a ‐atime ‐7
查找/etc目录下大于1M且类型为普通文件的所有文件或目录
find /etc ‐size +1M ‐type f
查找/etc目录下所有用户都没有写权限的文件
find /etc ‐not ‐perm /222
查找/etc目录下至少一类用户没有执行权限的文件
find /etc ‐not ‐perm ‐111
查找/etc/init.d目录下,所有用户都执行权限,且其它用户写权限的文件
find /etc/init.d ‐perm ‐113
查找指定数据信息进行复制 查找出*.txt文件,批量复制到/tmp目录*
将找到的信息放到cp 和 最终目录中间
find /oldboy -type f -name "*.txt"|xargs -i cp {} /tmp
xargs -i:用{}代替传递的数据
利用cp指明谁是数据最终保存的目录信息
find /oldboy -type f -name "*.txt"|xargs cp -t /tmp
查找指定数据信息进行移动 查找出*.txt文件,批量移动到/tmp目录
- 将找到的信息放到cp 和 最终目录中间
find /oldboy -type f -name "*.txt"|xargs -i mv {} /tmp
- 利用cp指明谁是数据最终保存的目录信息
find /oldboy -type f -name "\*.txt"|xargs mv -t /tmp
- 将找到的信息放到cp 和 最终目录中间
文件压缩
- file-roller
- compress/uncompress: .Z
- gzip/gunzip: .gz
- bzip2/bunzip2: .bz2
- xz/unxz: .xz
- zip/unzip
- tar
- cpio
compress/uncompress
- compress [-dfvcVr] [-b maxbits] [file …]
- -d 解压缩,相当于uncompress
- -c 结果输出至标准输出,不删除原文件
- -v 显示详情
- uncompress file.Z 解压缩
- zcat file.Z 不显式解压缩的前提下查看文本文件内容
示例:zcat file.Z >file
gzip/gunzip
- gzip [OPTION]… FILE …
- -d 解压缩,相当于gunzip
- -c 结果输出至标准输出,保留原文件不改变
- -# 指定压缩比,#取值为1-9,值越大压缩比越大
- gunzip file.gz 解压缩
- zcat file.gz 不显式解压缩的前提下查看文本文件内容
- 示例:
gzip -c messages >messages.gz
gzip -c -d messages.gz > messages
zcat messages.gz > messages
cat messages | gzip > m.gz
bzip2/bunzip2/bzcat
- bzip2 [OPTION]… FILE …
- -k keep, 保留原文件
- -d 解压缩
- -# 1-9,压缩比,默认为9
- bunzip2 file.bz2 解压缩
- bzcat file.bz2 不显式解压缩的前提下查看文本文件内容
xz/unxz/xzcat
- xz [OPTION]… FILE …
- -k keep, 保留原文件
- -d 解压缩
- -# 压缩比,取值1-9,默认为6
- unxz file.xz 解压缩
- xzcat file.xz 不显式解压缩的前提下查看文本文件内容
zip/unzip
- 打包压缩
zip –r /backup/sysconfig /etc/sysconfig/
- 解包解压缩
unzip sysconfig.zip
cat /var/log/messages | zip messages
unzip -p message.gz > message
-p 表示管道
tar工具
tar(Tape ARchive,磁带归档的缩写)
tar [OPTION]…
-A 追加 tar 文件至归档
-c 创建一个新归档
-r 追加文件至归档结尾
-t 列出归档内容
-x 从归档中解压文件
-f 使用归档文件或 ARCHIVE 设备
-p 解压文件权限信息(默认只为超级用户服务)
-z 通过 gzip 过滤归档
创建归档,保留权限
tar -cpvf /PATH/FILE.tar FILE...
追加文件至归档: 注:不支持对压缩文件追加
tar -rf /PATH/FILE.tar FILE...
查看归档文件中的文件列表
tar -tf /PATH/FILE.tar
展开归档
tar -xf /PATH/FILE.tar
tar -xf /PATH/FILE.tar -C /PATH/
-C 指定目录结合压缩工具实现:归档并压缩
-j: bzip2, -z: gzip, -J: xz
–exclude 排除文件
tar zcvf /root/a3.tgz --exclude=/app/host1 --exclude=/app/host2 /app
–exclude-from=FILE 批量排除FILE中指定的文件
tar zcvf /root/a3.tgz --exclude-from=a.txt
- –remove-files 归档/压缩之后删除源文件
- -T 选项指定输入文件 -X 选项指定包含要排除的文件列表
tar zcvf mybackup.tgz -T /root/includefilelist -X /root/excludefilelist
- split:分割大的 tar 文件为多份小文件
- split -b Size –d tar-file-name prefix-name
- split -b 1M –d mybackup.tgz mybackup-parts
- split -b 1M mybackup.tgz mybackup-parts
- 合并:
cat mybackup-parts* > mybackup.tar.gz-
其他常用:
- -d 记录文件差异
- -v 显示指令执行过程
-z 通过gzip指令压缩/解压缩文件,文件名最好为*.tar.gz
-h 跟踪符号链接;将它们所指向的文件归档并输出
cpio
功能:复制文件从或到归档
cpio命令是通过重定向的方式将文件进行打包备份,还原恢复的工具,它可以解压以“.cpio”或者“.tar”结尾的文件
cpio [选项] > 文件名或者设备名
cpio [选项] < 文件名或者设备名
选项
- -o 将文件拷贝打包成文件或者将文件输出到设备上
- -O filename 输出到指定的归档文件名
- -A 向已存在的归档文件中追加文件
- -i 解包,将打包文件解压或将设备上的备份还原到系统
- -I filename 对指定的归档文件名解压
- -t 预览,查看文件内容或者输出到设备上的文件内容
- -F filename 使用指定的文件名替代标准输入或输出
- -d 解包生成目录,在cpio还原时,自动的建立目录
- -v 显示打包过程中的文件名称
示例
- 将etc目录备份:
find ./etc -print |cpio -ov >bak.cpio
- 将/data内容追加bak.cpio
find /data | cpio -oA -F bak.cpio
- 内容预览
cpio –tv < etc.cpio
- 解包文件
cpio –idv < etc.cpio
- 将etc目录备份: