09Linux之文件管理
- 09Linux之文件管理
-
9 文件管理
-
9.1 命令
- 9.1.1 pwd
- 9.1.2 cd
- 9.1.3 ls
- 9.1.4 tree
-
9.2 增删改查
- 9.2.1 创建(touch、mkdir)
- 9.2.2 删除(rm)
- 9.2.3 复制(cp)
- 9.2.4 移动(mv)
-
9.3 查看文件内容
- 9.3.1 常用文本文件
- 9.3.2 cat
- 9.3.3 less、more、head、tail
- 9.3.4 grep
-
9.4 修改文件内容vim
- 9.4.1 vim编辑
- 9.4.2 设置环境
- 9.4.3 同时编辑多文件
- 9.4.4 文件内容对比
- 9.4.5 vim保护机制
- 9.4.6 打补丁
-
9.5 文件处理三剑客(支持|)
- 9.5.1 sed流式编辑器
- 9.5.2 awk
- 9.5.3 grep
-
9.6 文件查找命令find
-
9.7 文件的上传与下载
-
9.8 输出与重定向
- 9.8.1 基本概念
- 9.8.2 输出重定向
- 9.8.3 输入重定向
-
9.9 字符处理命令
- 9.9.1 sort排序
- 9.9.2 uniq去重
- 9.9.3 cut处理规律文本
- 9.9.4 tr替换
- 9.9.5 wc统计
-
9.10 打包压缩
- 9.10.1 基本概念
- 9.10.2 tar.gz与tar.biz2
- 9.10.3 解包
- 9.10.4 zip
- 9.10.5备份
-
9.11 文件系统
- 9.11.1 简介
- 9.11.2 文件系统工作原理
- 9.11.3 扩展
- 9.11.4 软链接、硬链接
- 9.11.5 实战应用
9 文件管理
9.1 命令
9.1.1 pwd
9.1.2 cd
9.1.3 ls
9.1.4 tree
-
查目录树:需先安装tree命令,执行yum install tree -y
# 常用命令
tree -a 目录 # 显示所有文件,包括隐藏文件
tree -d 目录 # 只显示子目录
tree -L 1 目录 # —L:遍历目录的最大层数,后接大于0整数
tree -F 目录 # -F在条目后加上文件类型的指示符(如目录后加/)
# 其他命令
-C # 在文件和目录清单上加色彩,便于区分各种类型
-r # 不显示符合范本样式的文件或目录名称
-P # 只显示符合范本样式的文件或目录名称
-s # 列出文件或目录的大小
-f # 在每个文件或目录前,显示完整的相对路径名称
-t # 以文件或目录的更改时间排序
9.2 增删改查
9.2.1 创建(touch、mkdir)
-
创建文件 touch
============================创建文件touch==========================
# 创建单个文件
touch file1.txt # 无则创建,有则更新时间(相对路径)
touch /boot/file1.txt # 无则创建,有则更新时间(绝对路径)
# 创建多个文件
touch a.txt b.txt c.txt # (以空格分开)创建a.txt b.txt c.txt
touch file{1..3}.py # (以{}创建)创建file1.py file2.py file3.py
touch c{j,J}x.py # 创建cjx.py cJx.py
touch {1..2}{a..b}.txt # 创建1a.txt 1b.txt 2a.txt 2b.txt
# 修改文件时间 -t # stamp
touch -t 2022222111 2020.rmvb # 用[[CC]YY]MMDDhhmm[.ss]代替现在的时间
-
创建目录 mkdir
============================创建目录mkdir==========================
# 创建单个目录
mkdir dir1 # 创建目录dir1(相对路径)
nkdir /home/dir2 # 创建目录dir2(绝对路径)
# 创建多个目录
mkdir dir3 dir4 # 创建目录dir3 dir4(相对路径,以空格分隔)
nkdir /home/dir5 /home/dir6 # 创建目录dir5 dir6(绝对路径,以空格分隔)
mkdir /home/{dir7,dir8} # 创建目录dir7 dir8
# 显示结果 -v
mkdir -v /home/{dir9,dir10}
mkdir:已创建目录 "/home/dir9"
mkdir:已创建目录 "/home/dir10"
# 递归创建 -p
mkdir -p a/b/c/d # a目录不存在
9.2.2 删除(rm)
9.2.3 复制(cp)
-
复制 cp 源文件 目标文件
# 常见用法
cp -v # 显示过程
cp -r # 复制目录
cp -a # 保留源文件或目录的属性,包括所有者、所属组、权限和时间(同-p)
cp -f # 强行复制文件或目录,不论目的文件或目录是否已经存在
cp -i # 交互,覆盖文件之前先询问用户
cp -u # 只会在源文件的修改时间较目标文件更新时,或目标文件不存在时才复制文件
# 示例
cp -r /boot/* /test/ # 将boot目录下所有文件复制到/test/目录下
cp -a /home/cjx/a.py /mnt/ # 将用户cjx家目录下的a.py复制到root的/mnt目录下且保留a.py的属性
cp -f /test/a.txt /test1/a.txt # 强制将/test/a.txt覆盖/test1/a.txt
# 具体步骤为
# 1、先执行rm -rf /test1/a.txt
# 2、再执行cp /test/a.py /test1/
# 拓展
!$ # 上条命令最后一个参数
su # 切换用户
cp -rfv /etc/hosts{,.old} # 将hosts在源路径下再复制一份hosts.old
# >用法以及>>用法
echo "111" > /opt/a.py # 将111覆盖到/opt/a.py
echo "222" >> /opt/a.py # 将222追加到/opt/a.py的后面
9.2.4 移动(mv)
9.3 查看文件内容
9.3.1 常用文本文件
9.3.2 cat
-
cat命令用于连接文件并打印到标准输出设备上(即查看)
# 常见命令
-n # --number 由1开始对所有输出的行数编号
-b # --number-nonblank 不对空白行编号
-s # --squeeze-blank 当遇到连续两行以上空白行时,替换为一行空白行
-v # --show-nonprinting 使用^和M-符号,除了LFD和TAB之外
-E # --show-ends 在每行结尾处显示$
-T # --show-tabs 将TAB字符显示为^l
-A # --show-all 等价于-vET
-e # 等价于-vE
-t # 等价于-vT
# 拓展
unix2dos file1 # 将文件file1的格式从Unix格式转换为Windows格式
dos2unix file2 # 将文件file2的格式从Windows格式转换为unix格式
9.3.3 less、more、head、tail
9.3.4 grep
9.4 修改文件内容vim
9.4.1 vim编辑
-
vim基础
# 什么是vim
vim是vi发展出来的一个文本编辑器(vi iMproved)。没有菜单,只有命令
# vim的作用
修改配置、写脚本
# vi与vim区别
vi不显示高亮颜色语法,vim显示高亮语法
vi默认安装,vim需要yum install vim -y来安装
-
vim三种模式
# 三种模式
命令模式、输入模式、末行模式
# 三种模式切换方式
=====================命令模式-->输入模式=======================
a-->光标所在处后面一个字符开始输入 A-->光标所在行行尾开始输入
i-->光标所在处前面一个字符开始输入 I-->光标所在行行首开始输入
o-->光标所在处的下另起一行开始输入 O-->光标所在处上面另起一行开始输入
=====================命令模式-->末行模式=======================
按下":"
===================输入、末行模式-->命令模式=====================
按下"Esc"键
--------------------------over-------------------------------
# 三种模式的用法
==========================命令模式============================
# 光标的移动
0 # 光标移动到当前行的行首
$ # 光标移动到当前行的行尾
gg # 光标移动到首行的行首
G # 光标移动到末行的行首
nG # (ngg)n为数字,光标移动感到第n行(20G/20gg就是移动到第20行行首)
H # 光标移动到当前界面的首行的行首
M # 光标移动到当前界面的中间行的行首
L # 光标移动到当前界面的末行的行首
^ # 光标移动到该行第一个非空字符
h # 光标往左移一个字符(←)
j # 光标向下移一个字符(↓)
k # 光标向上移一个字符(↑)
l # 光标向右移一个字符(→)
zz # 将光标所在行居屏幕的中央
zt # 将光标所在行居屏幕最上行
CTRL+f # forword向下翻页(PgUp)
CTRL+b # backword向前翻页(PgDn)
CTRL+d # 向下翻半页
CTRL+u # 向上翻半页
CTRL+e # 向下滚一行
CTRL+y # 向上滚一行
# 文本编辑
d # 删除、剪切 dd 3dd dgg dG
y # 复制 yy 3yy ygg yG
p # 粘贴到下一行
np # n为次数,5p就是粘贴五次
P # 粘贴到上一行
x # 删除光标所在字符
D # 从光标处删除至行尾
r # 修改光标所在字符
u # undo撤回
CTRL+r # 撤销撤回
# 进入其他模式
a、i、o、A、I、O #进入编辑模式
: # 进入末行模式
CTRL+v # 进入可视块模式
R # 进入替换模式
# 可视块
# 批量加注释
1、光标移动到需要被注释的行的行首
2、CTRL+v进入可视块模式,方向键选择选中
3、shift+i编辑,按#
4、连续按两次'Esc'
# 批量去注释
1、光标移动到需要去掉注释的行的行首
2、CTRL+v进入可视块模式,方向键选择好#
3、按'd'删除
# 查找内容
/需要查找的内容 # n在查找结果中顺着走,N在查找结果中倒着走,可循环。5n即跳到光标下第五个查找结果
==========================输入模式============================
CTRL+p # 同CTRL+n 自动补全命令(相当于Tab)
例如上文输入过ifconfig,下文输入if按ctrl+p/n可自动补全为ifconfig
上文如果输入过print、prend,下文输入pr按ctrl+p/n时可选择补全为print或prend
==========================末行模式============================
# 保存退出
:10 # 进入第十行
:w # 保存
:q # 退出(:q!强制退出)
:wq # 保存退出(:wq!强制保存退出)
:x # 保存退出
# 查找替换 :范围 s/xxx/yyy/选项
:1,5 s/xxx/yyy/ # 表示1~5行的首个xxx改为yyy
:2,$ s/xxx/yyy/ # 2~最后一行的首个xxx改为yyy
:1,5 s/xxx/yyy/g # 表示1~5行的全部xxx改为yyy
:% s/xxx/yyy/ # 表示全文的首个xxx替换为yyy(%:所有行,g:一整行)
:% s/^xxx$/yyy/g # 表示以xxx开头且以xxx为结尾的替换为yyy
# 读入文件/写文件
:w /aaa.py # 另存为aaa.py
:1,3 w/2.txt # 将1~3行另存到2.txt
:r /etc/hosts # 将etc/hosts插入到光标下一行
--------------------------over-------------------------------
9.4.2 设置环境
9.4.3 同时编辑多文件
9.4.4 文件内容对比
9.4.5 vim保护机制
- 遇到故障意外退出时,会保存.swp文件,再次编辑时会提示
- 删除临时文件或先恢复内容再删除(-r选项进行恢复)来解决故障
9.4.6 打补丁
9.5 文件处理三剑客(支持|)
9.5.1 sed流式编辑器
-
事先制定好编辑文件的指令,让sed自动完成对文件的整体编辑(同一时间内存中只有文件中一条)
# 用法
sed 选项 '定位 + 命令' 文件路径
# 选项
-n # 取消默认输出
-i # 取消输出流向(将输出到屏幕中的内容流向文件即立即编辑文件)
# 定位
行定位:
1定位到第一行
1,3代表从第一行到第三行
不写定位代表定位到所有行
正则表达式定位:
/ccc/ # 包含ccc的行
/^ccc/ # 以ccc开头的行
/ccc$/ # 以ccc结尾的行
数字+正则表达式定位
"1,8p" # 代表打印第一到第八行
"1,/ccc/p" # 代表取从第一行到首次匹配到/ccc/的行
# 命令
d # 删除
p # 打印
s///gi #查找替换,s表示所有行,g表示一整行,i表示不区分大小写
命令可以用";"来连接多条,如1d;3d;5d代表删除1,3,5行
================================================
[root@ccc ~]# cat a.txt
ccc
111ccc
111ccc111
ccc111ccc
111ccc111ccc
111Ccc
CcC111cCc111ccc
# i在第二行上面加上222,a是在下面
[root@ccc ~]# sed '2i 222' a.txt
ccc
222
111ccc
111ccc111
ccc111ccc
111ccc111ccc
111Ccc
CcC111cCc111ccc
[root@ccc ~]#
=====================p的用法=====================
[root@ccc ~]# sed '' a.txt
ccc
111ccc
111ccc111
ccc111ccc
111ccc111ccc
111Ccc
CcC111cCc111ccc
[root@ccc ~]# sed -n '' a.txt
[root@ccc ~]#
[root@ccc ~]# sed -n '1,/111ccc111/p' a.txt
ccc
111ccc
111ccc111
[root@ccc ~]#
=====================d的用法=====================
[root@ccc ~]# cat a.txt
ccc
111ccc
111ccc111
ccc111ccc
111ccc111ccc
111Ccc
CcC111cCc111ccc
[root@ccc ~]# sed '1,/111ccc111ccc/d' a.txt
111Ccc
CcC111cCc111ccc
[root@ccc ~]# sed '1d;3d;5d;7d' a.txt
111ccc
ccc111ccc
111Ccc
[root@ccc ~]#
=====================s///gi的用法=====================
[root@ccc ~]# cat a.txt
ccc
111ccc
111ccc111
ccc111ccc
111ccc111ccc
111Ccc
CcC111cCc111ccc
[root@ccc ~]# sed 's/ccc/yyy/g' a.txt # 将所有行所有ccc改为yyy
yyy
111yyy
111yyy111
yyy111yyy
111yyy111yyy
111Ccc
CcC111cCc111yyy
[root@ccc~]#sed 's/ccc/yyy/gi' a.txt # 将所有行所有ccc(不区分大小写)改为yyy
yyy
111yyy
111yyy111
yyy111yyy
111yyy111yyy
111yyy
yyy111yyy111yyy
[root@ccc~]#sed '/^ccc/s/111/222/g' a.txt #将所有以ccc开头的行的111改为222
ccc
111ccc
111ccc111
ccc222ccc
111ccc111ccc
111Ccc
CcC111cCc111ccc
[root@ccc ~]# sed '1,3s/ccc/zzz/g' a.txt #将1~3行的ccc改为zzz
zzz
111zzz
111zzz111
ccc111ccc
111ccc111ccc
111Ccc
CcC111cCc111ccc
[root@ccc ~]#
=====================sed搭配管道|的用法=====================
[root@ccc ~]# cat a.txt
ccc
111ccc
111ccc111
ccc111ccc
111ccc111ccc
111Ccc
CcC111cCc111ccc
[root@ccc ~]# cat a.txt | sed '2,6d' # 将a.txt的2~6行删掉
ccc
CcC111cCc111ccc
[root@ccc ~]#
9.5.2 awk
-
处理有规律的文本,做一些格式化处理(awk实际上是一门编程语言)
-
例如/etc/passwd这种
# 用法
awk 选项 'pattern{action}' 文件路径
# 选项
-F # 指定分隔符(后面可以接,: 等)
不加默认以空格分隔 # 连续空格视为1个
# awk -F:'{print $1,$3}' /etc/passwd的工作流程
1、awk会读取文件的一行内容然后赋值给$0
2、awk会以-F指定的分隔符将该段切分成n段(最多100段),第一段给$1,第二段给$2,依次递推
3、print输出该行的第一第三段(逗号表示输出分隔符,默认与-F保持一致)
4、重复123直到文件内容读完
# 内置变量
$0 # 一整行内容
NR # 记录号,等同于行号
NF # 以-F分隔符分割的段数
# pattern的种类
正则
/正则/ # 该行内容匹配成功正则
$1 ~ /正则/ # 第一段内容匹配成功正则
$1 !~ /正则/ # 第一段内容没有匹配成功正则
比较运算
NR >= 3 && NR <= 5 # 3~5行
$1 == "root" # 第一段内容等于root
# action的类型
print $1,$3
=====================用法示例=====================
[root@ccc ~]# cat 1.py
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
# 以root开头的行打印第一段和第三段
[root@ccc ~]# awk -F: '/^root/{print $1,$3}' 1.py
root 0
# 第一段内容以d开头的打印第一和第三段
[root@ccc ~]# awk -F: '$1 ~ /^d/{print $1,$3}' 1.py
daemon 2
# 第一段内容不是以d开头的打印第一和第三段(取反)
[root@ccc ~]# awk -F: '$1 !~ /^d/{print $1,$3}' 1.py
root 0
bin 1
adm 3
lp 4
# 第四行以后的行打印第一段
[root@ccc ~]# awk -F: 'NR>4{print $1}' 1.py
lp
# 第一段内容是root的,打印整行
[root@ccc ~]# awk -F: '$1 == "root"{print $0}' 1.py
root:x:0:0:root:/root:/bin/bash
# awk支持管道
[root@ccc ~]# cat 1.py | awk -F: '{print $1}'
root
bin
daemon
adm
lp
[root@ccc ~]#
9.5.3 grep
-
从一堆杂乱无章的内容中过滤
# 用法
grep 选项 '正则' 文件路径
# 选项
-n # --line-number 在过滤出的每行前面加上他在文件中的相对行号
-i # --ignore-case 忽略大小写
--color # 颜色
-l # --files-with-matches 如果匹配成功,则将文件名打印出来,失败不打印
-r # --recursive 递归,在查找的文件夹下寻找,匹配成功返回文件名,失败不打印
通常-rl一起用 grep -rl 'rppt' /etc
=====================用法示例=====================
[root@ccc ~]# grep 'root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@ccc ~]# grep -n 'bash$' /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
[root@ccc ~]# grep -rl 'bash$' /etc
/etc/pki/tls/certs/renew-dummy-cert
/etc/crontab
/etc/libuser.conf
=====================管道|========================
[root@ccc ~]# ps aux |grep ssh # 查看包含ssh的进程
root 802 0.0 0.4 112924 4328 ? Ss 10:06 0:00 /usr/sbin/sshd -D
root 1483 0.0 0.6 161536 6092 ? Ss 14:33 0:00 sshd: root@pts/0
root 1851 0.0 0.0 112824 980 pts/0 R+ 19:52 0:00 grep --color=auto ssh
[root@ccc ~]# ps aux |grep [s]sh # 不包括刚输命令的进程
root 802 0.0 0.4 112924 4328 ? Ss 10:06 0:00 /usr/sbin/sshd -D
root 1483 0.0 0.6 161536 6092 ? Ss 14:33 0:00 sshd: root@pts/0
[root@ccc ~]#
9.6 文件查找命令find
9.6.1 基本命令
- find [path] [-option] [expression]
9.6.2 基本用法
-
基础
# 按文件名 -name
[root@ccc ~]# find /etc -name 'ifcfg-ens33'
/etc/sysconfig/network-scripts/ifcfg-ens33 # 查找ifcfg-ens33
[root@ccc ~]# find /etc -name 'ifcfg-*'
/etc/sysconfig/network-scripts/ifcfg-lo
/etc/sysconfig/network-scripts/ifcfg-ens33
/etc/sysconfig/network-scripts/ifcfg-ENS33 # 查找以ifcfg开头的文件
[root@ccc ~]# find /etc/ -iname 'ifcfg-ens33'
/etc/sysconfig/network-scripts/ifcfg-ens33
/etc/sysconfig/network-scripts/ifcfg-ENS33 # i不区分大小写
# 按文件大小 -size
[root@ccc ~]#
[root@ccc ~]# find /etc -size +5M # 大于5M的文件
/etc/udev/hwdb.bin
[root@ccc ~]# find /etc -size 3M # 等于3M的文件
[root@ccc ~]# find /etc -size -1k # 小于1k的文件
/etc/crypttab
/etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem
/etc/environment
/etc/exports
/etc/motd
/etc/sysconfig/network-scripts/ifcfg-ENS33
[root@ccc ~]# find /etc -size +3M -ls # -ls找到的处理动作
70 8188 -r--r--r-- 1 root root 8384358 10月 16 12:32 /etc/udev/hwdb.bin
8809555 3816 -rw------- 1 root root 3905267 4月 1 2020 /etc/selinux/targeted/active/policy.kern
13347359 3816 -rw-r--r-- 1 root root 3905267 4月 1 2020 /etc/selinux/targeted/policy/policy.31
# 指定查找的目录深度 -maxdepth levels
[root@ccc ~]# find / -maxdepth 5 -a -name 'ifcfg-ens33'
/etc/sysconfig/network-scripts/ifcfg-ens33
/test/ifcfg-ens33 # -a并且,-o或者,不加-a默认就是-a
# 按时间找 -atime -mtime -ctime
[root@ccc ~]# find . -mtime +15 # 修改时间超过15天
./.bash_logout
./.bash_profile
./.bashrc
./.cshrc
./.tcshrc
./Python-2.7.18.tgz
./1.jpg
[root@ccc ~]# find . -mtime 1 # 修改时间等于1天
[root@ccc ~]# find . -mtime -3 # 修改时间3天以内
.
./.bash_history
./t.txt
./f.txt
./1.py
./.viminfo
./a.txt
# 按文件属主、属组找 -user -group
[root@ccc ~]# find /home -user lili # 属主是lili的文件
/home/lili
/home/lili/.bash_logout
[root@ccc ~]# find /home -group lili # 数组是lili的文件
/home/lili
/home/lili/.bash_logout
[root@ccc ~]# find /home -user lili -a -group lili # 属主lili且数组lili的文件
/home/lili
/home/lili/.bash_logout
[root@ccc ~]# find /home -user lili -group lili # 同上-a
/home/lili
/home/lili/.bash_logout
[root@ccc ~]# find /home -user lili -o -group lili # 属主lili或数组lili的文件
/home/lili
/home/lili/.bash_logout
[root@ccc ~]# su - lili # 切换到lili用户
[lili@ccc ~]$ touch 111.txt # 创建111.txt
[lili@ccc ~]$ exit
登出
[root@ccc ~]# ll /home/lili/111.txt
-rw-rw-r-- 1 lili lili 0 10月 26 14:34 /home/lili/111.txt
[root@ccc ~]# vim /etc/group
[root@ccc ~]# find /home -nogroup -ls # 用户还存在,在/etc/group删除了记录
8494233 0 drwx------ 2 lili 1000 98 10月 26 14:34 /home/lili
8494238 4 -rw-r--r-- 1 lili 1000 18 4月 1 2020 /home/lili/.bash_logout
8494239 4 -rw-r--r-- 1 lili 1000 193 4月 1 2020 /home/lili/.bash_profile
8493577 4 -rw-r--r-- 1 lili 1000 231 4月 1 2020 /home/lili/.bashrc
8493579 0 -rw-rw-r-- 1 lili 1000 0 10月 26 14:34 /home/lili/111.txt
8493580 4 -rw------- 1 lili 1000 19 10月 26 14:34 /home/lili/.bash_history
[root@ccc ~]# find /home -nouser -ls
8494233 0 drwx------ 2 1000 1000 98 10月 26 14:34 /home/lili
8494238 4 -rw-r--r-- 1 1000 1000 18 4月 1 2020 /home/lili/.bash_logout
8494239 4 -rw-r--r-- 1 1000 1000 193 4月 1 2020 /home/lili/.bash_profile
8493577 4 -rw-r--r-- 1 1000 1000 231 4月 1 2020 /home/lili/.bashrc
8493579 0 -rw-rw-r-- 1 1000 1000 0 10月 26 14:34 /home/lili/111.txt
8493580 4 -rw------- 1 1000 1000 19 10月 26 14:34 /home/lili/.bash_history
[root@ccc ~]# find /home -nouser -ls -o -nogroup -ls
8494233 0 drwx------ 2 1000 1000 98 10月 26 14:34 /home/lili
8494238 4 -rw-r--r-- 1 1000 1000 18 4月 1 2020 /home/lili/.bash_logout
8494239 4 -rw-r--r-- 1 1000 1000 193 4月 1 2020 /home/lili/.bash_profile
8493577 4 -rw-r--r-- 1 1000 1000 231 4月 1 2020 /home/lili/.bashrc
8493579 0 -rw-rw-r-- 1 1000 1000 0 10月 26 14:34 /home/lili/111.txt
8493580 4 -rw------- 1 1000 1000 19 10月 26 14:34 /home/lili/.bash_history
# 按文件类型 -type
[root@ccc ~]# find /dev -type f # f普通
[root@ccc ~]# find /dev -type d # d目录
[root@ccc ~]# find /dev -type l # l链接
[root@ccc ~]# find /dev -type b # b块设备
[root@ccc ~]# find /dev -type c # c字符设备
[root@ccc ~]# find /dev -type s # s套接字
[root@ccc ~]# find /dev -type p # p管道文件
# 根据inode号查找 -inum n
[root@ccc ~]# find / -inum 1811
# 按文件权限 -perm
[root@ccc ~]# find . -perm 644 -ls
-
后续处理
-print
-ls
-delete
-exec
-ok
# -exec非交互
[root@ccc ~]# find /etc/ -name "ifcfg-*" -exec cp -rvf {} /tmp ;
"/etc/sysconfig/network-scripts/ifcfg-lo" -> "/tmp/ifcfg-lo"
"/etc/sysconfig/network-scripts/ifcfg-ens33" -> "/tmp/ifcfg-ens33"
"/etc/sysconfig/network-scripts/ifcfg-ENS33" -> "/tmp/ifcfg-ENS33"
# -ok交互
[root@ccc ~]# find /etc/ -name "ifcfg-*" -ok cp -rvf {} /tmp ;
< cp ... /etc/sysconfig/network-scripts/ifcfg-lo > ? y
"/etc/sysconfig/network-scripts/ifcfg-lo" -> "/tmp/ifcfg-lo"
< cp ... /etc/sysconfig/network-scripts/ifcfg-ens33 > ? y
"/etc/sysconfig/network-scripts/ifcfg-ens33" -> "/tmp/ifcfg-ens33"
< cp ... /etc/sysconfig/network-scripts/ifcfg-ENS33 > ? y
"/etc/sysconfig/network-scripts/ifcfg-ENS33" -> "/tmp/ifcfg-ENS33"
# 删除的一种用法
[root@ccc ~]# find /etc/ -name "ifcfg-*" -exec rm -rf {} ;
[root@ccc ~]# find /etc/ -name "ifcfg-*" -delete
-
拓展:find用管道必须结合xargs
[root@ccc ~]# find . -name 'cjx*.txt' |xargs rm -rf # 删除的另一种方式
[root@ccc ~]# find /etc/ -name 'ifcfg-ens33' |xargs -I {} cp -rf {} /var/tmp/
[root@ccc ~]# ll /var/tmp/
总用量 1
-rw-r--r-- 1 root root 262 10月 26 15:07 ifcfg-ens33
[root@ccc ~]# find /test -name 'ifcfg-ens33' | xargs -I {} mv {} /ttt
9.7 文件的上传与下载
9.7.1 下载
-
wget命令
# 将远程包下载到本地,-O指定下载到哪里,也可省略-O 本地路径
wget -O 本地路径 远程包链接地址
[root@ccc ~]# wget -O ./2.jpg http://pic17.nipic.com/20222225/8754739_105205490111_2.jpg
# 如果wget下载提示无法建立SSL连接,需加上选项--no-check-certificates
[root@ccc ~]# wget --no-check-certificate -O ./2.jpg http://pic17.nipic.com/20222225/8754739_105205490111_2.jpg
-
curl命令
# curl命令是一个利用URL规则在命令行下工作的文件传输工具
# 支持文件的上传和下载,是综合传输工具,按传统称curl为下载工具
# wget会将下载的内容直接打印在屏幕上
[root@ccc ~]# curl -O ./3 https://tiyu.baidu.com/match/S10/tab/赛程
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0curl:
# 如果遇到下载提示无法建立SSL连接,使用-k选项或者--insecure
[root@ccc ~]# curl -k -O ./3 https://tiyu.baidu.com/match/S10/tab/赛程
-
sz命令
# 系统默认没有sz命令,需下载yum install -y lrzsz
# 将服务器上选定的文件下载/发送到本机
[root@ccc ~]# sz 1.jpg
9.7.2 上传
9.8 输出与重定向
9.8.1 基本概念
9.8.2 输出重定向
9.8.3 输入重定向
- cat >目标文件<内容来源(源文件地址):也可以写成cat<内容来源>目标文件(将源文件内容写至目标文件)
- cat >目标文件<<EOF(键盘输入,最后以EOF结尾)将键盘输入内容写入目标文件,也可以写成cat<<EOF>目标文件
9.9 字符处理命令
9.9.1 sort排序
-
用于将文件内容加以排序(默认以字符串的字符编码从小到大排序)
-n # 依照数值的大小排序
-r # 以相反的顺序来排序
-k # 以某列进行排序
-t # 指定分隔符,默认是空格
[root@ccc ~]# cat a.py
b:3
c:2
a:4
4:1
f:5
[root@ccc ~]# sort a.py
4:1
a:4
b:3
c:2
f:5
[root@ccc ~]# sort -t ":" -n -k2 a.py
4:1
c:2
b:3
a:4
f:5
[root@ccc ~]# sort -t ":" -n -r -k2 a.py
f:5
a:4
b:3
c:2
4:1
9.9.2 uniq去重
-
用于检查及删除文本文件中重复出现的行列,一般与sort命令结合使用
-c # 在每列旁边显示出该行重复出现的次数
-d # 仅显示重复出现的行列
-u # 仅显示出现一次的行列
[root@ccc ~]# cat b.py
hello
123
hello
123
hahaha
[root@ccc ~]# sort b.py # sort默认以字符串的字符编码从小到大排序
123
123
hahaha
hello
hello
[root@ccc ~]# sort b.py |uniq # 去重
123
hahaha
hello
[root@ccc ~]# sort b.py | uniq -c # 在每列旁边显示出该行重复出现的次数
2 123
1 hahaha
2 hello
[root@ccc ~]# sort b.py | uniq -d # 仅显示重复出现的行列
123
hello
[root@ccc ~]# sort b.py | uniq -u # 仅显示出现一次的行列
hahaha
9.9.3 cut处理规律文本
9.9.4 tr替换
9.9.5 wc统计
9.10 打包压缩
9.10.1 基本概念
9.10.2 tar.gz与tar.biz2
-
打包
[root@ccc test]# tar cvf bak.tar /etc/passwd # c:创建,v:详细过程,f:打包后文件路径
tar: 从成员名中删除开头的“/”
/etc/passwd
[root@ccc test]# ll
总用量 16
-rw-r--r-- 1 root root 10240 10月 27 21:36 bak.tar
-
压缩
# gzip -> gunzip
[root@ccc test]# gzip bak.tar
[root@ccc test]# ll
总用量 8
-rw-r--r-- 1 root root 520 10月 27 21:36 bak.tar.gz
# bzip2 -> bunzip
[root@ccc test]# bzip2 bak.tar
[root@ccc test]# ll
总用量 12
-rw-r--r-- 1 root root 530 10月 27 21:43 bak.tar.bz2
-
合二为一
# gzip压缩算法(.gz结尾)
[root@ccc test]# tar cvzf bak.tar.gz /etc/passwd
tar: 从成员名中删除开头的“/”
/etc/passwd
[root@ccc test]# ll
总用量 16
-rw-r--r-- 1 root root 512 10月 27 21:47 bak.tar.gz
# bzip2压缩算法(.bz2结尾)
[root@ccc test]# tar cvjf bak.tar.bz2 /etc/passwd
tar: 从成员名中删除开头的“/”
/etc/passwd
[root@ccc test]# ll
总用量 4
-rw-r--r-- 1 root root 530 10月 27 21:48 bak.tar.bz2
9.10.3 解包
9.10.4 zip
-
zip后的第一个参数是压缩包路径,其余为被压缩的文件
[root@ccc test]# zip bak.zip /etc/passwd /etc/yum
adding: etc/passwd (deflated 58%)
adding: etc/yum/ (stored 0%)
[root@ccc test]# ll
总用量 4
-rw-r--r-- 1 root root 704 10月 27 21:52 bak.zip
9.10.5备份
-
打包压缩常用于备份文件,文件名必须见名知意且带上时间、主机名之类
# 时间命令date
[root@ccc test]# date
2020年 10月 27日 星期二 22:02:15 CST
[root@ccc test]# date +%F
2020-10-27
[root@ccc test]# date +%Y_%m_%d
2020_10_27
[root@ccc test]# date +%T
22:03:10
[root@ccc test]# date +%H_%M_%S
22_03_38
[root@ccc test]# date +%Y_%m_%d_%H_%M_%S
2020_10_27_22_04_14
[root@ccc test]# date -d "-1 day" +%F
2020-10-26
[root@ccc test]# date -d "1 day" +%F
2020-10-28
# 备份,引用执行结果用反引号``
[root@ccc test]# tar cvzf `date +%Y_%m_%d_%H_%M_%S`_bak.tar.gz /etc/passwd
tar: 从成员名中删除开头的“/”
/etc/passwd
[root@ccc test]# ll
总用量 16
-rw-r--r-- 1 root root 512 10月 27 22:07 2020_10_27_22_07_12_bak.tar.gz
9.11 文件系统
9.11.1 简介
9.11.2 文件系统工作原理
-
两部分组成:
①文件的元信息:例如权限(rwx)、拥有者、群组、时间参数等
②文件的实际内容
-
文件系统通常会把这两部分分别存放在不同的区块
①文件的元信息放置到inode区块中
②文件的实际内容则放置到data block区块中
③每个inode与block都有自己的编号
-
文件的超级区块(superblock)会记录整个档案的整体信息
包括inode与block的总量、使用量、剩余量等
-
硬盘的最小存取单位->扇区(Sector)->512字节->0.5kb
操作系统的最小存取单位->block块->8个扇区->4kb
-
总结
# superblock
记录此filesystem的整体信息,包括inode/block的总量、使用量、剩余量,及问价系统的格式与相关信息等
# inode
1、记录文件元信息,包括文件对应的一个或多个block块号码
2、一个文件被分配唯一一个inode
# block
1、记录文件实际内容
2、一个文件过大时可能会被分配多个block块,即一个文件可能对应多个block块的号码,这些号码都存放在该文件的inode里

-
举例
[root@ccc test]# ls -di /
64 /
[root@ccc test]# ls -di /etc/
4194369 /etc/
[root@ccc test]# ls -i /etc/passwd
4739260 /etc/passwd
-
cat /etc/passwd的整体过程

-
通常称ext文件系统为索引式文件系统(indexed allocation)
9.11.3 扩展
-
inode信息
inode为索引节点,是Unix操作系统的一种数据结构,本质是结构体
inode负责存文件的元信息,如文件的创建者、创建日期、大小、inode等
根本上inode存放除了文件的名字及真实内容外所有有关文件的信息/元数据(metadata)
? 1、inode编号
? 2、用来识别文件类型及用于stat C函数的模型信息
? 3、链接数,即有多少文件名指向这个inode
? 4、属主的ID(UID)
? 5、属主的组ID(GID)
? 6、文件的字节数
? 7、文件所使用的磁盘块的实际数目
? 8、文件的时间戳(ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上依次打开的时间
? 9、指向数据块的指针
可以用stat命令查看某个文件的inode信息
[root@ccc test]# touch cjx.py
[root@ccc test]# stat cjx.py
文件:"cjx.py"
大小:0 块:0 IO 块:4096 普通空文件
设备:803h/2051d Inode:584529 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2020-10-27 22:55:07.390351576 +0800
最近更改:2020-10-27 22:55:07.390351576 +0800
最近改动:2020-10-27 22:55:07.390351576 +0800
创建时间:-
atime # access time访问文件内容的时间。对文件内容进行一次读操作,访问时间就会变。
# cat、more等操作都会,但stat、ls不会对atime产生影响
mtime # modify time修改文件内容的时间。文件内容最后一次修改的时间
# ll命令显示的就是mtime
# vim编辑保存后,mtime就会改变。
# 如echo aa >> a.sh 或vim a.txt修改内容
ctime # change time指inode上一次文件属性变动时间。
# 文件状态改变,ctime就会改变,例如chmod、chown等
# 使用cat命令查看文件后,文件atime变更
[root@ccc test]# touch cjx.py
[root@ccc test]# stat cjx.py
文件:"cjx.py"
大小:0 块:0 IO 块:4096 普通空文件
设备:803h/2051d Inode:584529 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2020-10-27 22:55:07.390351576 +0800
最近更改:2020-10-27 22:55:07.390351576 +0800
最近改动:2020-10-27 22:55:07.390351576 +0800
创建时间:-
[root@ccc test]# cat cjx.py
[root@ccc test]# stat cjx.py
文件:"cjx.py"
大小:0 块:0 IO 块:4096 普通空文件
设备:803h/2051d Inode:584529 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2020-10-27 23:04:49.565459717 +0800
最近更改:2020-10-27 22:55:07.390351576 +0800
最近改动:2020-10-27 22:55:07.390351576 +0800
创建时间:-
# atime不变mtime及ctime改变
[root@ccc test]# touch zzz.py
[root@ccc test]# stat zzz.py
文件:"zzz.py"
大小:0 块:0 IO 块:4096 普通空文件
设备:803h/2051d Inode:584530 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2020-10-27 23:07:46.877188087 +0800
最近更改:2020-10-27 23:07:46.877188087 +0800
最近改动:2020-10-27 23:07:46.877188087 +0800
创建时间:-
[root@ccc test]# cat >> zzz.py << EOF
111
EOF
[root@ccc test]# stat zzz.py
文件:"zzz.py"
大小:4 块:8 IO 块:4096 普通文件
设备:803h/2051d Inode:584530 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2020-10-27 23:07:46.877188087 +0800
最近更改:2020-10-27 23:08:00.638167014 +0800
最近改动:2020-10-27 23:08:00.638167014 +0800
创建时间:-
# atime、mtime不变,ctime改变
[root@ccc test]# touch mmm.py
[root@ccc test]# stat mmm.py
文件:"mmm.py"
大小:0 块:0 IO 块:4096 普通空文件
设备:803h/2051d Inode:584531 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2020-10-27 23:09:11.228058875 +0800
最近更改:2020-10-27 23:09:11.228058875 +0800
最近改动:2020-10-27 23:09:11.228058875 +0800
创建时间:-
[root@ccc test]# ll mmm.py
-rw-r--r-- 1 root root 0 10月 27 23:09 mmm.py
[root@ccc test]# chmod 000 mmm.py
[root@ccc test]# stat mmm.py
文件:"mmm.py"
大小:0 块:0 IO 块:4096 普通空文件
设备:803h/2051d Inode:584531 硬链接:1
权限:(0000/----------) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2020-10-27 23:09:11.228058875 +0800
最近更改:2020-10-27 23:09:11.228058875 +0800
最近改动:2020-10-27 23:10:03.715978463 +0800
创建时间:-
[root@ccc test]# ll mmm.py
---------- 1 root root 0 10月 27 23:09 mmm.py
-
inode大小(df -i)
inode会消耗硬盘空间,因此硬盘格式化时操作系统会将硬盘分为两个区域
? ①inode区(inode table):存放inode所包含的信息
? ②block数据区:存放文件数据
查看硬盘分区的inode总数和已使用量用df -i命令
每个文件必须要有一个inode,因此inode用光但硬盘未存满时也无法在硬盘上创建新文件
# 查看xfs文件系统每个inode节点大小(centos7)
xfs_info /dev/sda3
# 查看ext文件系统每个inode节点大小(centos6)
sudo dumpe2fs -h /dev/hda | grep "Inode size"
-
inode号码
每个inode都有一个号码,操作系统用inode号码来识别不同的文件
Linux系统不使用文件名,而使用inode号码来识别文件
? ①系统找到这个文件名是对应的inode号码
? ②通过inode号码获取inode信息
? ③根据inode信息找到文件数据所在的block,读出数据
使用ls -i命令可以看到文件名对应的inode号码
[root@ccc test]# ls -i cjx.py
584529 cjx.py
-
目录项
Linux系统中目录(directory)也是一种文件。打开目录实际上就是打开目录文件
目录结构:一系列目录项(dirent)的列表。
目录项两个组成部分:所包含文件的文件名,给文件名对应的inode号码
ls命令:列出目录文件中的所有文件名
[root@ccc test]# ls
cjx.py mmm.py zzz.py
ls -i命令:列出整个目录文件,即文件名和inode号码
要查看文件的详细信息就要根据inode号码访问inode节点,读取信息
[root@ccc test]# ls -i
584529 cjx.py 584531 mmm.py 584530 zzz.py
-
FAT文件系统
U盘采用的档案系统一般为FAT格式。
FAT格式的档案系统没有inode,每个block号码都记录在前一个block当中。
档案系统无法一次知道四个block号码,只能将前block读出后才会知道下一个block在哪里,归于分散时,磁盘要多转好几圈才能完整读取档案的内容。
碎片整理:原因是档案写入的block过于离散,读取性能会变差,此时通过碎片整理将同一个档案归属的blocks汇整在一起,读取会比较容易。
-
inode特殊作用
①文件名包含特殊字符无法正常删除时,直接删除inode节点可以删除文件
②移动文件或重命名文件,只改变文件名,不影响inode号码
③打开一个文件后,系统就以inode号码来识别这个文件,不考虑文件名
? 通常来说,系统无法从inode号码来得知文件名
[root@ccc test]# ls -i
584529 cjx.py 584531 mmm.py 584530 zzz.py
[root@ccc test]# ls -i cjx.py
584529 cjx.py
[root@ccc test]# vim cjx.py
[root@ccc test]# ls -i cjx.py
584533 cjx.py
[root@ccc test]# mv cjx.py CJX.py
[root@ccc test]# ls -i CJX.py
584533 CJX.py
Q:每次修改完服务器配置文件后,为什么需要重新加载配置文件?
A:因为每次修改完inode都会变,系统还是读取原来的inode号的配置文件,每次修改完服务器的配置文件都要重启服务,重新读一下配置文件。
9.11.4 软链接、硬链接
-
硬链接(Hard Link) ---->通过"ln 源文件 目标文件" 设置硬链接
①对硬链接文件内容进行修改,会影响到所有文件名
②硬链接文件与源文件具有相同inode的不同文件名。一个文件只能有一个inode号,但多个文件的inode号可以相同
③删除硬链接或源文件之一,不影响另一个文件名的访问,除非都删掉
? 硬链接允许一个文件拥有多个有效路径,用户可以建立硬链接连接到重要文件以防误删
④创建目录自动生成的两个目录项"."和".."
? "."的inode号码是当前目录的inode号码,等同于当前目录的硬链接
? ".."的inode号码是当前目录父目录的inode号码,等同于父目录的硬链接
? 任何一个目录的硬链接总数=2+他的子目录总数(含隐藏目录)
⑤删除所有的硬链接,数据会在被磁盘检查或新数据写入时删除回收
⑥通过rm -rf删除硬链接
⑦目录不可创建硬链接,且硬链接无法跨区
-
软链接(符号链接Symbolic Link) ---->通过"ln -s 源文件 目标文件" 创建软链接
①对软链接的源文件或目标文件内容进行修改,会影响到所有文件名
②软链接文件与源文件具有不同的inode号
③删除软链接文件的源文件,软链接文件将无法使用
④软链接作用:软件升级、企业代码发布、不方便目录移动
⑤删除源文件后,软链接文件无效,也应一起删除以便回收
⑥通过rm -rf删除软链接
⑦可以对目录创建软链接,且软链接可以跨分区
-
示例
==============================硬链接===================================
[root@ccc ~]# touch aaa.py
[root@ccc ~]# ln aaa.py bbb.py
[root@ccc ~]# ls -i aaa.py
8493577 aaa.py
[root@ccc ~]# ls -i bbb.py
8493577 bbb.py
[root@ccc ~]# ll aaa.py
-rw-r--r-- 2 root root 0 10月 28 22:52 aaa.py
[root@ccc ~]# ll bbb.py
-rw-r--r-- 2 root root 0 10月 28 22:52 bbb.py
[root@ccc ~]#
==============================软链接===================================
[root@ccc test]# touch 1.py
[root@ccc test]# ln -s 1.py 2.py
[root@ccc test]# ls -i 1.py
584530 1.py
[root@ccc test]# ls -i 2.py
584531 2.py
[root@ccc test]# ll 1.py # 硬链接数为1
-rw-r--r-- 1 root root 0 10月 28 22:57 1.py
[root@ccc test]# ll 2.py # 硬链接数为1
lrwxrwxrwx 1 root root 4 10月 28 22:57 2.py -> 1.py
[root@ccc test]# rm -rf 1.py
[root@ccc test]# ll 2.py # 删掉1.py,2.py不可用
lrwxrwxrwx 1 root root 4 10月 28 22:57 2.py -> 1.py
[root@ccc test]# mkdir ./dir1
[root@ccc test]# ln ./dir1 ./dir2
ln: "./dir1": 不允许将硬链接指向目录
[root@ccc test]# ln -s ./dir1 ./dir2
[root@ccc test]# ll
总用量 0
drwxr-xr-x 2 root root 6 10月 28 23:00 dir1
lrwxrwxrwx 1 root root 6 10月 28 23:01 dir2 -> ./dir1
9.11.5 实战应用
-
磁盘有空间但创建不了文件
df -h查看磁盘使用情况(此时磁盘空间足够)
df -i查看磁盘的索引节点(inode)(此时IUsed=100%)
原因:数量众多的小字节缓存文件占用大量的inode,但占用的block不多
解决方案:
①删除目录中部分文件,释放分区一部分inode
②备份好文件,然后删除这些文件来释放inode,然后创建一个新文件夹。
? 在cache2下挂在一个新分区sda4,下次写数据写到新分区cache2目录下
tips:inode分区完后不增加inode数量,改变inode大小
-
其他场景
大量小文件问题:
可能会使inode耗尽,使得文件无法创建(磁盘利用率低)
方案:将block划分小一点
大文件问题:
一个文件占用多个block,是的文件读写速率慢
方案:将block划分大一点
ext文件系统---->xfs文件系统
-
解决硬盘不够用的方案
1、加一块硬盘
2、分区(不分区整体相当于一个分区)
3、制作文件系统:mkfs.xfs /dev/sdb
4、挂载:mount /dev/sdb /boot/data
? touch /boot/data/aaa.txt
-
面试题:Linux中软链接与硬链接区别
1、从定义: linux系统中,链接有两种,一种被称为软链接,类似于快捷方式,存放指向原文件inode的信息,与原文件inode不同。 一种是硬链接,与原文件有相同的inode,可以指向数据block。
2、从创建方式:硬链接命令In 原文件 目标文件,软链接命令ln -s 原文件目 标文件
3、从创建对象: In命令不能对目录创建硬链接,但是可以对目录创建软链接。因为软链接可以跨越文件系统,硬链接则不能。对目录和为客户创建的文件软链接经常用到。
4、删除软链接文件,对硬链接和原文件无影响。
5、删除文件硬链接,对原文件及软链接文件无影响
6、删除原文件,对硬链接读取数据无影响,软链接则失效。会出现红底白字状。
7、同时删除原文件和硬链接,原文件才会被真正删除
8、很多硬件设备中的快照原理,类似于硬链接原理
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|