vim与程序员
所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在。
但是目前我们使用比较多的是 vim 编辑器。
vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计。
什么是vim
Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。
简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方。 vim 则可以说是程序开发者的一项很好用的工具。
vi/vim 的使用
基本上 vi/vim 共分为三种模式,分别是命令模式(Command mode),输入模式(Insert mode)和底线命令模式(Last line mode)。 这三种模式的作用分别是:
vim工作模式
命令模式:进入 vim 默认的模式
编辑模式:按 i 进入的 a i o 也可以进入
底行模式: 按下:(冒号)之后进入到的模式
vim基础用法
- vi oldboy.txt #打开文件
- 打开后无法直接编辑,需要按 i 进入编辑模式
- 修改这个文件内容吧
- 修改完后,按 esc 退出编辑模式:wq
- 保存退出 #注意":"必须是英文符号
- :wq 保存并退出
- :q! 强制退出不保存
- :wq! 强制保存退出
命令模式
用户刚刚启动 vi/vim,便进入了命令模式。
此状态下敲击键盘动作会被Vim识别为命令,而非输入字符。比如我们此时按下i,并不会输入一个字符,i被当作了一个命令
移动光标
- w(e) 移动光标到下一个单词
- b 移动到光标上一个单词
-
- 数字0 移动到本行开头
- $ 移动光标到本行结尾
-
- H 移动光标到屏幕首行
- M 移动到光标到屏幕的中间一行
- L 移动光标到屏幕的尾行
- gg 移动光标到文档的首行
- G 移动光标到文档尾行
-
- ctrl + f 下一页
- ctrl + b 上一页
-
- `. 移动光标到上一次的修改行
查找
- /chaoge 在整篇文档中搜索chaoge字符串,向下查找
- ?chaoge 在整篇文档中搜索chaoge字符串,向上查找
-
- * 查找整个文档,匹配光标所在的所有单词,按下n查找下一处,N上一处
- # 查找整个文档,匹配光标所在的所有单词,按下n查找下一处,N上一处
-
- gd 找到光标所在单词匹配的单词,并停留在非注释的第一个匹配上
-
- % 找到括号的另一半!!
复制、删除、粘贴
- yy 拷贝光标所在行
- dd 删除光标所在行
- D 删除当前光标到行尾的内容
- dG 删除当前行到文档尾部的内容
- p 粘贴yy所复制的内容
- x 向后删除字符
- X 先前删除字符
- u 撤销上一步的操作
- . 重复前一个执行过的动作
数字与命令
- 3yy 拷贝光标所在的3行
- 5dd 删除光标所在5行
快捷操作
- 删除光标所在位置到行尾的内容并进入编辑模式 C(大写字母)
- 在命令模式下按下字母i,即可进入输入模式,可以编写代码啦。。。
- 在当前行下面插入一行并进入编辑模式 o(小写字母)
- 在当前行上面插入一行并进入编辑模式 O(大写字母)
- 快速到达行尾并进入编辑模式 A
- 快速保存并退出 ZZ
批量快捷操作
- 批量删除:
- 进入批量编辑模式(可视块)
- ctrl+v
- 选择 上下左右
- 删除 d
-
- 批量增加:进入批量编辑模式(可视块)ctrl+v
- 选择区域
- 输入大写的 I 进入编辑模式 编辑
- 按下ESC键
-
- 批量去掉注释
- 1. 进入命令行模式,按ctrl + v进入 visual block模式,按字母l横向选中列的个数,例如 // 需要选中2列
- 2. 按字母j,或者k选中注释符号
- 3. 按d键就可全部取消注释
vim批量缩进
- :set tabstop=4 设定tab宽度为4个字符
- :set shiftwidth=4 设定自动缩进为4个字符
- :set expandtab 用space替代tab的输入
- :set noexpandtab 不用space替代tab的输入
-
- 1.命令模式,按下v,进入可视模式
- 2.光标移动选择行,输入 > 大于号,缩进,输入< 缩进
-
- 输入行号缩进:
- 1.显示行号
- :set nu #显示
- :set nonu #关闭
-
- 2.行号缩进
- :10,20 > #10到20行,缩进一次
底线命令模式
在命令模式下输入冒号(英文的:),就进入了底线命令模式,在底线命令模式下可以输入单个或多个字符的命令,常用命令有:
- :q! 强制退出
- :wq! 强制写入退出
- :set nu 显示行号
- :数字 调到数字那行
- :set nonu 取消显示行号
-
- 随时按下esc可以退出底线命令模式
vim执行流程与常见故障解析
swp文件
重定向符号
符号 | 解释 |
---|---|
重定向的意思是,”将数据传到其他地方“ | |
< 或者<< | 标准输入stdin,代码为0 |
>或>> | 标准输出stdout,代码为1 |
2>或2>> | 标准错误输出stderr,代码为2 |
特殊符号
符号 | 解释 | ||||
---|---|---|---|---|---|
* | 匹配任意个字符 | ||||
? | 匹配一个字符 | ||||
\ | 管道符 | ||||
& | 后台进程符 | ||||
&& | 逻辑与符号,命令1 && 命令2 ,当命令1执行成功继续执行命令2 | ||||
\ | \ | 逻辑或符号,命令1 \ | \ | 命令2,当命令1执行失败才会执行命令2 | |
# | 注释符 | ||||
" " | 双引号表示字符串,能够识别,``反引号,$符,\ 转义符 | ||||
' ' | 单引号表示普通字符串,无特殊含义 | ||||
$ | 变量符 如 $name | ||||
\ | 转义字符 |
cat命令
cat命令用于查看纯文本文件(常用于内容较少的), 可以理解为是猫
,瞄一眼文件内容
其单词是concatenate
,指的是可以连接多个文件且打印到屏幕,或是重定向到文件中
cat功能
功能 | 说明 |
---|---|
查看文件内容 | cat file.txt |
多个文件合并 | cat file.txt file2.txt > file3.tx |
非交互式编辑或追加内容 | cat >> file.txt << EOF 欢迎来到路飞学城 EOF |
清空文件内容 | cat /dev/null > file.txt 【/dev/null是linux系统的黑洞文件】 |
参数
- 用法:cat [选项] [文件]...
- 将[文件]或标准输入组合输出到标准输出。
-
- 清空文件内容,慎用
- > 文件名
-
-
- -A, --show-all 等价于 -vET
- -b, --number-nonblank 对非空输出行编号
- -e 等价于 -vE
- -E, --show-ends 在每行结束处显示 $
- -n, --number 对输出的所有行编号
- -s, --squeeze-blank 不输出多行空行
- -t 与 -vT 等价
- -T, --show-tabs 将跳格字符显示为 ^I
- -u (被忽略)
- -v, --show-nonprinting 使用 ^ 和 M- 引用,除了 LFD 和 TAB 之外
- --help 显示此帮助信息并退出
- --version 输出版本信息并退出
-
- 如果[文件]缺省,或者[文件]为 - ,则读取标准输入。
案例
- #查看文件,显示行号
- cat -n xxx.py
-
- #猫,查看文件
- cat xxx.py
-
- #在每一行的结尾加上$符
- [root@master tmp]# cat -E 1.txt
-
- #追加文字到文件
- cat >>/tmp/oldboy.txt << EOF
- 唧唧复唧唧
- 木兰开飞机
- 开的什么机
- 波音747
- EOF
-
- [root@luffycity tmp]# cat -b file.txt #输出非空行的编号
- 1 欢迎来到路飞学城
- 2 学生还有五分钟到达战场
-
-
- 3 全军出击
- [root@luffycity tmp]#
- [root@luffycity tmp]#
- [root@luffycity tmp]#
- [root@luffycity tmp]# cat -n file.txt #输出所有行的编号
- 1 欢迎来到路飞学城
- 2 学生还有五分钟到达战场
- 3
- 4
- 5 全军出击
-
-
-
- [root@luffycity tmp]# cat -E file.txt #显示出每行的结束符,$符号
- 欢迎来到路飞学城$
- 学生还有五分钟到达战场$
- $
- $
- 全军出击$
- [root@luffycity tmp]# cat -s file.txt # -s参数把多个空行,换成一个,可以让文件更精炼阅读
- 欢迎来到路飞学城
- 学生还有五分钟到达战场
-
- 全军出击
-
-
-
- [root@luffycity tmp]# cat > alex.txt #cat写入内容,用ctrl+c 结束,一般不用
- 我是金角老妖怪alex
- ^C
tac命令
与cat命令作用相反,反向读取文件内容
- [root@luffycity tmp]# cat alex.txt
- 我是金角老妖怪alex
- 我是老妖怪alex
- [root@luffycity tmp]#
- [root@luffycity tmp]# tac alex.txt
- 我是老妖怪alex
- 我是金角老妖怪alex
管道符
- Linux提供的管道符“|”讲两条命令隔开,管道符左边命令的输出会作为管道符右边命令的输入。
- 常见用法:
- #检查python程序是否启动
- ps -ef|grep "python"
-
- #找到/tmp目录下所有txt文件
- ls /tmp|grep '.txt'
-
- #检查nginx的端口是否存活
- netstat -tunlp |grep nginx
more命令
More是一个过滤器, 用于分页显示 (一次一屏) 文本,以当前屏幕窗口尺寸为准
- 语法
- more 参数 文件
-
- -num 指定屏幕显示大小为num行
- +num 从num行开始显示
-
- 交互式more的命令:
- 空格 向下滚动一屏
- Enter 向下显示一行
- = 显示当前行号
- q 退出
案例
- #显示5行内容
- [root@luffycity tmp]# more -5 alex.txt
- root:x:0:0:root:/root:/bin/bash
- root:x:0:0:root:/root:/bin/bash
- root:x:0:0:root:/root:/bin/bash
- root:x:0:0:root:/root:/bin/bash
- root:x:0:0:root:/root:/bin/bash
- --More--(0%)
-
- #从6行开始输出内容到屏幕
- more +6 alex.txt
-
-
- #将显示结果分页输出,需控制窗口大小
- [root@luffycity tmp]# netstat -tunlp |more -3
less命令
less命令是more的反义词
- 语法:
- less 参数 文件
-
- -N 显示每行编号
- -e 到文件结尾自动退出,否则得手动输入q退出
-
- 子命令
-
- 整个的翻页
- b 向前一页
- f 向后一页
-
- 空格 查看下一行,等于 ↓
- y 查看上一行,等于↑
-
- q退出
案例
head命令
用于显示文件内容头部,默认显示开头10行
- 用法:head [选项]... [文件]...
- 将每个指定文件的头10 行显示到标准输出。
- 如果指定了多于一个文件,在每一段输出前会给出文件名作为文件头。
- 如果不指定文件,或者文件为"-",则从标准输入读取数据。
-
- -c, --bytes=[-]K 显示每个文件的前K 字节内容;
- 如果附加"-"参数,则除了每个文件的最后K字节数据外
- 显示剩余全部内容
- -n, --lines=[-]K 显示每个文件的前K 行内容;
- 如果附加"-"参数,则除了每个文件的最后K 行外显示
- 剩余全部内容
- -q, --quiet, --silent 不显示包含给定文件名的文件头
- -v, --verbose 总是显示包含给定文件名的文件头
- --help 显示此帮助信息并退出
- --version 显示版本信息并退出
案例
- [root@luffycity ~]# head -5 /etc/passwd #显示前五行
- 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@luffycity ~]# head -c 6 /etc/passwd #显示文件前6个字节
- root:x[root@luffycity ~]#
-
-
- #显示多个文件
- [root@luffycity tmp]# echo 你就是金角大王吧 > alex.txt
- [root@luffycity tmp]#
- [root@luffycity tmp]#
- [root@luffycity tmp]# echo 你就是银角大王吧 > peiqi.txt
- [root@luffycity tmp]#
- [root@luffycity tmp]#
- [root@luffycity tmp]# head alex.txt peiqi.txt
- ==> alex.txt <==
- 你就是金角大王吧
-
- ==> peiqi.txt <==
- 你就是银角大王吧
tail命令
显示文件内容的末尾,默认输出后10行
- -c 数字 指定显示的字节数
- -n 行数 显示指定的行数
- -f 实时刷新文件变化
- -F 等于 -f --retry 不断打开文件,与-f合用
- --pid=进程号 进程结束后自动退出tail命令
- -s 秒数 检测文件变化的间隔秒数
案例
- #显示文件后10行
- tail alex.txt
-
- #显示文件后5行
- tail -5 alex.txt
-
- #从文件第3行开始显示文件
- tail -n +3 alex.txt
-
- #检测文件变化
- tail -f alex.txt
-
- # -F与-f参数的用法
- [root@luffycity tmp]# tail -f alex.txt # -f文件不存在,直接报错,退出
- tail: cannot open 'alex.txt' for reading: No such file or directory
- tail: no files remaining
-
- [root@luffycity tmp]# tail -F alex.txt # -F 文件不存在报错,等待文件生成
- tail: cannot open 'alex.txt' for reading: No such file or directory
-
- tail: 'alex.txt' has appeared; following end of new file
- qwe
cut命令
cut - 在文件的每一行中提取片断
在每个文件FILE的各行中, 把提取的片断显示在标准输出。
- 语法
-
- cut 参数 文件
-
- -b 以字节为单位分割
- -n 取消分割多字节字符,与-b一起用
- -c 以字符为单位
- -d 自定义分隔符,默认以tab为分隔符
- -f 与-d一起使用,指定显示哪个区域
- N 第 N 个 字节, 字符 或 字段, 从 1 计数 起
- N- 从 第 N 个 字节, 字符 或 字段 直至 行尾
- N-M 从 第 N 到 第 M (并包括 第M) 个 字节, 字符 或 字段
- -M 从 第 1 到 第 M (并包括 第M) 个 字节, 字符 或 字段
案例
以字节作为分隔符 -b参数
- [root@luffycity tmp]# cat alex.txt
- My name is alex and i like da xi gua
-
- #切割出第四个字符
- [root@luffycity tmp]# cut -b 4 alex.txt
- n
-
- [root@luffycity tmp]# cut -b 4-6 alex.txt #输出第4到6的字符
- nam
- [root@luffycity tmp]# cut -b 4,6 alex.txt #输出第4和6的字符
- nm
-
- [root@luffycity tmp]# cut -b -5 alex.txt #输出第一个到第五个的字符
- My na
-
- [root@luffycity tmp]# cut -b 5- alex.txt #输出第五个字符到结尾的字符
- ame is alex and i like da xi gua
以字符作为分隔符 -c 参数,区别在于中英文
- [root@luffycity tmp]# cut -b 3-7 alex.txt #字节切割
- name
- [root@luffycity tmp]#
- [root@luffycity tmp]# cut -c 3-7 alex.txt #字符切割,没有区别,因为1个英文字母是1个字节存储
- name
- [root@luffycity tmp]# cat alex.txt
- My name is alex and i like da xi gua
-
- #注意点如下
- [root@pylinux tmp]# cat peiqi.txt
- 我是小猪佩奇
- i am xiao zhu pei qi
-
- [root@pylinux tmp]# cut -c 6- peiqi.txt #从第六个字符开始切割到结尾
- 奇 #由于当前机器是utf-8编码,一个汉字等于一个字符
- xiao zhu pei qi #英文字符正常
- [root@pylinux tmp]# cut -b 6- peiqi.txt #从第六个字节开始切割到结尾
- �小猪佩奇 #乱码,-b以二进制字节计算
- xiao zhu pei qi
-
- #加上-n参数,取消切割多字节的字符
- [root@pylinux tmp]# cut -nc 6- peiqi.txt
- 奇
- xiao zhu pei qi
- [root@pylinux tmp]# cut -nb 6- peiqi.txt
- 奇
自定义分隔符
- cut -f7 -d : /etc/passwd |head -5 #以冒号切割,显示第七区域信息
-
- [root@pylinux tmp]# cut -f6-7 -d : /etc/passwd |head -5 #以冒号切割,显示第6-7的区域信息
- /root:/bin/bash
- /bin:/sbin/nologin
- /sbin:/sbin/nologin
- /var/adm:/sbin/nologin
- /var/spool/lpd:/sbin/nologin
sort命令
sort命令将输入的文件内容按照规则排序,然后输出结果
- 用法:sort [选项]... [文件]...
- 或:sort [选项]... --files0-from=F
- 串联排序所有指定文件并将结果写到标准输出。
-
- -b, --ignore-leading-blanks 忽略前导的空白区域
- -n, --numeric-sort 根据字符串数值比较
- -r, --reverse 逆序输出排序结果
- -u, --unique 配合-c,严格校验排序;不配合-c,则只输出一次排序结果
- -t, --field-separator=分隔符 使用指定的分隔符代替非空格到空格的转换
- -k, --key=位置1[,位置2] 在位置1 开始一个key,在位置2 终止(默认为行尾)
案例
- #sort 是默认以第一个数据来排序,而且默认是以字符串形式来排序,所以由字母 a 开始升序排序
-
- [root@luffycity tmp]# cat /etc/passwd | sort
-
- [root@luffycity tmp]# sort -n sort.txt #按照数字从大到小排序
-
- [root@luffycity tmp]# sort -nr sort.txt #降序排序
-
- [root@luffycity tmp]# sort -u sort.txt #去重排序
-
- [root@luffycity tmp]# sort -t " " -k 2 sort.txt #指定分隔符,指定序列
- 10.0.0.15 a
- 10.0.0.12 e
- 10.0.0.22 e
- 10.0.0.54 f
- 10.0.0.34 q
- 10.0.0.63 q
- 10.0.0.3 r
- 10.0.0.34 r
- 10.0.0.4 v
- 10.0.0.44 w
- 10.0.0.5 x
-
- [root@luffycity tmp]# cat /etc/passwd| sort -t ":" -k 3 #以分号分割,对第三列排序,以第一位数字排序
-
- #以分号分割,对第一个区域的第2到3个字符排序
- [root@luffycity tmp]# cat /etc/passwd | sort -t ":" -k 1.2,1.3
uniq命令
uniq命令可以输出或者忽略文件中的重复行,常与sort排序结合使用
- 用法:uniq [选项]... [文件]
- 从输入文件或者标准输入中筛选相邻的匹配行并写入到输出文件或标准输出。
-
- 不附加任何选项时匹配行将在首次出现处被合并。
-
- -c, --count 在每行前加上表示相应行目出现次数的前缀编号
- -d, --repeated 只输出重复的行
- -u, --unique 只显示出现过一次的行,注意了,uniq的只出现过一次,是针对-c统计之后的结果
案例
- #测试数据文件
- [root@luffycity tmp]# cat luffy.txt
- 10.0.0.1
- 10.0.0.1
- 10.0.0.51
- 10.0.0.51
- 10.0.0.1
- 10.0.0.1
- 10.0.0.51
- 10.0.0.31
- 10.0.0.21
- 10.0.0.2
- 10.0.0.12
- 10.0.0.2
- 10.0.0.5
- 10.0.0.5
- 10.0.0.5
- 10.0.0.5
-
- [root@luffycity tmp]# uniq luffy.txt #仅仅在首次出现的时候合并,最好是排序后去重
- 10.0.0.1
- 10.0.0.51
- 10.0.0.1
- 10.0.0.51
- 10.0.0.31
- 10.0.0.21
- 10.0.0.2
- 10.0.0.12
- 10.0.0.2
- 10.0.0.5
-
- [root@luffycity tmp]# sort luffy.txt |uniq -c #排序后去重且显示重复次数
- 4 10.0.0.1
- 1 10.0.0.12
- 2 10.0.0.2
- 1 10.0.0.21
- 1 10.0.0.31
- 4 10.0.0.5
- 3 10.0.0.51
-
-
- [root@luffycity tmp]# sort luffy.txt |uniq -c -d #找出重复的行,且计算重复次数
- 4 10.0.0.1
- 2 10.0.0.2
- 4 10.0.0.5
- 3 10.0.0.51
-
-
- [root@luffycity tmp]# sort luffy.txt |uniq -c -u #找到只出现一次的行
- 1 10.0.0.12
- 1 10.0.0.21
- 1 10.0.0.31
wc命令
wc命令用于统计文件的行数、单词、字节数
- -c, --bytes打印字节数
- -m, --chars 打印字符数
- -l, --lines 打印行数
- -L, --max-line-length 打印最长行的长度
- -w, --words 打印单词数
案例
- [root@luffycity tmp]# wc -l luffy.txt #统计文本有多少行,如同cat -n 看到的行数
- 21 luffy.txt
-
- #统计单词数量,以空格区分
- [root@luffycity tmp]# echo "alex peiqi yuchao mjj cunzhang" | wc -w
- 5
-
- [root@luffycity tmp]# echo "alex" |wc -m #统计字符数,由于结尾有个$
- 5
-
- [root@luffycity tmp]# echo "alex" |cat -E #证明结尾有个$
- alex$
-
- [root@luffycity tmp]# wc -L alex.qq #统计最长的行,字符数
- 9 alex.qq
- [root@luffycity tmp]# who|wc -l #当前机器有几个登录客户端
tr命令
tr命令从标准输入中替换、缩减或删除字符,将结果写入到标准输出
- 用法:tr [选项]... SET1 [SET2]
- 从标准输入中替换、缩减和/或删除字符,并将结果写到标准输出。
-
- 字符集1:指定要转换或删除的原字符集。
-
- 当执行转换操作时,必须使用参数“字符集2”指定转换的目标字符集。
-
- 但执行删除操作时,不需要参数“字符集2”;
-
- 字符集2:指定要转换成的目标字符集。
-
- -c或——complerment:取代所有不属于第一字符集的字符;
- -d或——delete:删除所有属于第一字符集的字符;
- -s或--squeeze-repeats:把连续重复的字符以单独一个字符表示;
- -t或--truncate-set1:先删除第一字符集较第二字符集多出的字符。
案例
- #将输入字符由小写换为大写:
- [root@luffycity ~]# echo "My name is alex" | tr 'a-z' 'A-Z'
- MY NAME IS ALEX
-
- #tr删除字符或数字,只要匹配上属于第一个字符串的字符,都被删掉
- [root@luffycity ~]# echo "My name is alex and i am 30 years old." | tr -d "0-9"
- My name is alex and i am years old.
-
- [root@luffycity ~]# echo "My name is alex and i am 33456 years old." | tr -d "1234"
- My name is alex and i am 56 years old.
-
- #删除字符,所有的数字,以及小写字符
- [root@luffycity ~]# echo "My name is alex and i am 33456 years old." | tr -d "0-9","a-z"
- [root@luffycity tmp]# tr "[a-z]" "[A-Z]" < alex.txt #全部换成大写
- I AM LUFFYCITY CTO.
- I AM 30 YEARS OLD.
- I LIKE EAT DA XI GUA .
-
-
- #删除文中出现的换行符、制表符(tab键)
- tr -d "\n\t" < alex.txt
-
- #去重连续的字符,tr是挨个匹配" ia" 每一个字符,包括空格去重
- [root@luffycity tmp]# echo "iiiii am aaaaalex,iiii like hot girl" | tr -s " ia"
- i am alex,i like hot girl
-
- #-c取反结果,将所有除了'a'以外的全部替换为'A'
- [root@luffycity tmp]# echo 'i am alex' | tr -c 'a' 'A'
- AAaAAaAAAA
stat命令
stat命令用于显示文件的状态信息。stat命令的输出信息比ls命令的输出信息要更详细。
语法
stat(选项)(参数)
选项
- -L, --dereference 跟随链接
- -f, --file-system 显示文件系统状态而非文件状态
- -c --format=格式 使用指定输出格式代替默认值,每用一次指定格式换一新行
- --printf=格式 类似 --format,但是会解释反斜杠转义符,不使用换行作
- 输出结尾。如果您仍希望使用换行,可以在格式中
- 加入"\n"
- -t, --terse 使用简洁格式输出
- --help 显示此帮助信息并退出
- --version 显示版本信息并退出
-
- 有效的文件格式序列(不使用 --file-system):
- %a 八进制权限
参数
文件:指定要显示信息的普通文件或者文件系统对应的设备文件名。
- [root@www ~]#stat abc.ph
- 文件:"abc.ph"
- 大小:0 块:0 IO 块:4096 普通空文件
- 设备:801h/2049d Inode:1200314 硬链接:1
- 权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
- 最近访问:2013-05-14 13:24:30.830729223 +0800
- 最近更改:2013-05-14 13:24:30.830729223 +0800
- 最近改动:2013-05-14 13:24:30.830729223 +0800
- 创建时间:-
-
- [root@luffycity tmp]# stat test.txt
- File: 'test.txt'
- Size: 16 Blocks: 8 IO Block: 4096 regular file
- Device: fd00h/64768d Inode: 17540200 Links: 1
- Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
- Context: unconfined_u:object_r:user_tmp_t:s0
- Access: 2019-10-18 14:58:59.465647961 +0800
- Modify: 2019-10-18 14:58:57.799636638 +0800
- Change: 2019-10-18 14:58:57.799636638 +0800
- Birth: -
-
-
-
- #显示文件权限
- [root@pylinux test_find]# stat -c %a alex.txt
- 644
stat的时间戳
- Access: 2019-10-18 14:58:59.465647961 +0800
- Modify: 2019-10-18 14:58:57.799636638 +0800
- Change: 2019-10-18 14:58:57.799636638 +0800
-
- access、最近访问,文件每次被cat之后,时间变化,由于操作系统特性,做了优化,频繁访问,时间不变
- modify,最近更改,更改文件内容,vim等
- change,最近改动,文件元数据改变,如文件名
find命令
find命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。
如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。
并且将查找到的子目录和文件全部进行显示。
语法
- find 查找目录和文件,语法:
-
- find 路径 -命令参数 [输出形式]
-
- 参数说明:
- 路径:告诉find在哪儿去找你要的东西,
参数 | 解释 | |
---|---|---|
pathname | 要查找的路径 | |
options选项 | ||
-maxdepth | <目录层级>:设置最大目录层级; | |
-mindepth | <目录层级>:设置最小目录层级; | |
tests模块 | ||
-atime | 按照文件访问access的时间查找,单位是天 | |
-ctime | 按照文件的改变change状态来查找文件,单位是天 | |
-mtime | 根据文件修改modify时间查找文件【最常用】 | |
-name | 按照文件名字查找,支持* ? [] 通配符 | |
-group | 按照文件的所属组查找 | |
-perm | 按照文件的权限查找 | |
-size n[cwbkMG] | 按照文件的大小 为 n 个由后缀决定的数据块。 其中后缀为: b: 代表 512 位元组的区块(如果用户没有指定后缀,则默认为 b) c: 表示字节数 k: 表示 kilo bytes (1024字节) w: 字 (2字节) M:兆字节(1048576字节) G: 千兆字节 (1073741824字节) | |
-type 查找某一类型的文件 | b - 块设备文件。 d - 目录。 c - 字符设备文件。 p - 管道文件。 l - 符号链接文件。 f - 普通文件。 s - socket文件 | |
-user | 按照文件属主来查找文件。 | |
-path | 配合-prune参数排除指定目录 | |
Actions模块 | ||
-prune | 使find命令不在指定的目录寻找 | |
-delete | 删除找出的文件 | |
-exec 或-ok | 对匹配的文件执行相应shell命令 | |
将匹配的结果标准输出 | ||
OPERATORS | ||
! | 取反 | |
-a -o | 取交集、并集,作用类似&&和\ | \ |
案例
根据名字查找
- [root@luffycity tmp]# ls
- alex.txt
- [root@luffycity tmp]# find . -name "alex.txt" -delete #找出名为alex.txt且删除
- [root@luffycity tmp]# ls #已经找不到
-
- [root@luffycity tmp]# touch python{1..10}.pid
- [root@luffycity tmp]# ls
- python1.pid python10.pid python2.pid python3.pid python4.pid python5.pid python6.pid python7.pid python8.pid python9.pid
- [root@luffycity tmp]#
- [root@luffycity tmp]#
- [root@luffycity tmp]# find . -name "*.pid" #找出所有的pid
- ./python1.pid
- ./python2.pid
- ....
-
- [root@luffycity tmp]# find . -name "[0-9]*.pid" #找到所以以数字开头的pid文件
- ./123a.pid
- ./123b.pid
- .....
UNIX/Linux文件系统每个文件都有三种时间戳:
- 访问时间(-atime/天,-amin/分钟):用户最近一次访问时间(文件修改了,还未被读取过,则不变)。
- 修改时间(-mtime/天,-mmin/分钟):文件最后一次修改时间(数据变动)。
- 变化时间(-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。
- 文件任何数据改变,change变化,无论是元数据变动,或是对文件mv,cp等
- 文件内容被修改时,modify和change更新
- 当change更新后,第一次访问该文件(cat,less等),access time首次会更新,之后则不会
- touch -a :仅更新Access time(同时更新Change为current time)
- touch -m:仅更新Modify time(同时更新Change为current time)
- touch -c:不创建新文件
- touch -t:使用指定的时间更新时间戳(仅更改Access time与Modify time,Change time更新为current time)
find根据修改时间查找文件
- #一天以内,被访问access过的文件
- find . -atime -1
-
- #一天以内,内容变化的文件
- find . -mtime -1
-
- #恰好在7天内被访问过的文件
- [root@pylinux home]# find / -maxdepth 3 -type f -atime 7
时间说明
- -atime -2 搜索在2天内被访问过的文件
- -atime 2 搜索恰好在2天前被访问过的文件
- -atime +2 超过2天内被访问的文件
find反向查找
- [root@pylinux opt]# find . -maxdepth 1 -type d #在opt目录下 查找最大目录深度为1 文件夹类型的数据
-
- [root@pylinux opt]# find . -maxdepth 1 ! -type d # 加上感叹号,后面接条件,代表取除了文件夹以外类型
根据权限查找
[root@pylinux opt]# find . -maxdepth 2 -perm 755 -type f #寻找权限类型是755的文件
按照文件大小查
- [root@pylinux opt]# du -h `find . -maxdepth 2 -size +10M` #找出超过10M大小的文件
- 14M ./Python-3.7.3/python
- 24M ./Python-3.7.3/libpython3.7m.a
- 322M ./s21-centos-vim.tar.gz
查找文件时忽略目录
[root@pylinux s18tngx]# find . -path "./conf.d" -prune -o -name "*.conf" -print
根据用户组匹配
- [root@pylinux home]# find / -maxdepth 3 -group yu #全局搜索深度为3,用户组是yu的文件
- /home/yu
- /home/yu/.bashrc
- /home/yu/.bash_profile
- /home/yu/.bash_history
- /home/yu/.cache
- /home/yu/.bash_logout
- /home/yu/.config
使用-exec或是-ok再次处理
-ok比-exec更安全,存在用户提示确认
- #找出以.txt结尾的文件后执行删除动作且确认
- [root@pylinux opt]# find /opt/luffy_boy -type f -name "*.txt" -ok rm {} \;
-
- 备注
- -exec 跟着shell命令,结尾必须以;分号结束,考虑系统差异,加上转义符\;
- {}作用是替代find查阅到的结果
- {}前后得有空格
- #找到目录中所有的.txt文件,且将查询结果写入到all.txt文件中
- [root@pylinux opt]# find ./mydj2/ -type f -name "*.txt" -exec cat {} \; > all.txt
- #把30天以前的日志,移动到old文件夹中
- find . -type f -mtime +30 -name "*.log" -exec cp {} old \;
xargs命令
xargs 又称管道命令,构造参数等。
是给命令传递参数的一个过滤器,也是组合多个命令的一个工具它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理 。
简单的说就是把其他命令的给它的数据,传递给它后面的命令作为参数
- -d 为输入指定一个定制的分割符,默认分隔符是空格
- -i 用 {} 代替 传递的数据
- -I string 用string来代替传递的数据-n[数字] 设置每次传递几行数据
- -n 选项限制单个命令行的参数个数
- -t 显示执行详情
- -p 交互模式
- -P n 允许的最大线程数量为n
- -s[大小] 设置传递参数的最大字节数(小于131072字节)
- -x 大于 -s 设置的最大长度结束 xargs命令执行
- -0,--null项用null分隔,而不是空白,禁用引号和反斜杠处理
案例
多行输入变单行
- [root@luffycity tmp]# cat mjj.txt
- 1 2 3 4
- 5 6 7 8
- 9 10
- [root@luffycity tmp]# xargs < mjj.txt
- 1 2 3 4 5 6 7 8 9 10
-n参数限制每行输出个数
- [root@luffycity tmp]# xargs -n 3 < mjj.txt #每行最多输出3个
- 1 2 3
- 4 5 6
- 7 8 9
- 10
自定义分隔符-d参数
- [root@luffycity tmp]# echo "alex,alex,alex,alex,alex," |xargs -d ","
- alex alex alex alex alex
-
- #定义分隔符后,限制每行参数个数
- [root@luffycity tmp]# echo "alex,alex,alex,alex,alex," |xargs -d "," -n 2
- alex alex
- alex alex
- alex
-i参数的用法,用{}替换传递的数据
-I 参数用法,用string代替数据
- #找到当前目录所有的.txt文件,然后拷贝到其他目录下
- [root@luffycity tmp]# find . -name "*.txt" |xargs -i cp {} heihei/
-
- [root@luffycity tmp]# find . -name "*.txt" |xargs -I data cp data heihei/
-
- #找到当前目录下所有txt文件,然后删除
- [root@luffycity tmp]# find . -name "*.txt" |xargs -i rm -rf {}
重点
xargs识别字符串的标识是空格或是换行符,因此如果遇见文件名有空格或是换行符,xargs就会识别为两个字符串,就会报错
- -print0在find中表示每一个结果之后加一个NULL字符,而不是换行符(find默认在结果后加上\n,因此结果是换行输出的)
- Xargs -0 表示xargs用NULL作为分隔符
- #修改find的输出结果,-print0可以改结尾为null
- [root@luffycity tmp]# find . -name "*.txt" -print
- ./hello luffycity.txt
- [root@luffycity tmp]# find . -name "*.txt" -print0
- ./hello luffycity.txt[root@luffycity tmp]#
-
-
- #修改xargs,理解默认分隔符是NULL
- find . -name "*.txt" -print0 |xargs -0 rm