fenglei7093

博客园 首页 新随笔 联系 订阅 管理

一、文件查找

1、which/whereis/whatis

which 只能查询命令
[root@qfedu.com ~]#which rpm

whereis 
可以查询命令和配置⽂件的位置
[root@qfedu.com ~]#whereis rpm
[root@qfedu.com ~]#whereis passwd

whatis
[root@qfedu.com ~]#whatis rpm 和下⾯命令⼀样的效果,查询rpm命令都在哪章man有解释
[root@qfedu.com ~]#man -f rpm

2、locate

维护着⼀个查询数据库

安装:
[root@localhost ~]# yum install -y mlocate

[root@qfedu.com ~]#vim /etc/updatedb.conf
1)⽂件系统类型
2)⽬录
如果被更改之后,需要更新数据库
[root@qfedu.com ~]#updatedb ⼿动更新数据库
[root@qfedu.com ~]#locate 被查找的关键字
[root@qfedu.com ~]#locate *.txt
*是通配符

3、find
-exec -atime -mtime -ctime -size -name

[root@qfedu.com ~]#find 路径 条件 跟条件相关的操作符 [-exec|-ok 动作]
路径
 默认不写路径时查找的是当前路径
 例:/etc   ./     /      /var/ftp
 
条件:

 名称 ⼤⼩ 时间 ⽂件类型 ⽤户 组 权限 ...

常用条件选项:

-a     : 必须满足两个条件才能显示(满足全部条件)
-o     : 只要满足一个条件就能实现(或者,只要...就能显示)

-name  : ⽂件名称 按名称查找
-iname : ⽂件名称 按名称查找(不区分⼤⼩写)
-type  : 根据文件类型进行搜索
-perm  : 按照文件权限来查找文件
-user  : 按照文件属主来查找文件。
-group : 按照文件所属的组来查找文件。


 # find / -name a.txt
 # find / -name a.t??
 # find / -name a.tx?
 # find / -name '*a.txt'
 # find / -iname '*a.txt'

1.搜索所有以 a 开头和以 .txt 结尾的文件名
[root@localhost ~]# find ./ -iname "a*.txt"
或者
[root@localhost ~]# find ./ -name 'a*' -a -name '*.txt'

查找 /home/ 下所有以.txt或.pdf结尾的文件
[root@localhost ~]# find /home/ -name '*.txt' -o -name '*.pdf'


?表示单个字符
*表示所有字符
⼀般情况下{}不能⽤
{1..100}
{abc,abd,efg}
通配符:
 * ? [] {} 
 * 表示所有字符
 ? 表示任意单个字符
 [] 表示其中任意⼀个单个字符 
 例:
 [abc]
 [a-z]
 [a-Z]
 [a-zA-Z]
 [!a-z] !取反 
 [0-9]

 a到Z的匹配顺序是aAbBcC... 
 [root@server python]# ls
 a.txt E.txt j.txt N.txt s.txt W.txt
 A.txt f.txt J.txt o.txt S.txt x.txt
 b.txt F.txt k.txt O.txt t.txt X.txt
 B.txt g.txt K.txt p.txt T.txt y.txt
 c.txt G.txt l.txt P.txt u.txt Y.txt
 C.txt h.txt L.txt q.txt U.txt z.txt
 d.txt H.txt m.txt Q.txt v.txt Z.txt
 D.txt i.txt M.txt r.txt V.txt
 e.txt I.txt n.txt R.txt w.txt
 
[root@localhost ~]# find ./ -name "[a-Z][A-Z][a-z].txt"
./aBc.txt
[root@localhost ~]# find ./ -name "[a-Z][A-Z][a-Z].txt"
./AAA.txt
./aBc.txt
[root@localhost ~]# find ./ -name "[a-Z][a-z][a-Z].txt"
./top.txt
./AaE.txt
[root@localhost ~]# find ./ -name "[a-Z][A-Z][a-Z].txt"
./AAA.txt
./aBc.txt

[root@localhost ~]# find ./ -name "[a-Z][A-Z][!a-z].txt"
./AAA.txt
[root@localhost ~]# find ./ -name "[a-Z][!A-Z][!a-z].txt"
./AaE.txt
./Aa1.txt
 

2.按⼤⼩查找
-size
查找等于50M
[root@qfedu.com ~]#find / -size 50M
查找大于50M
[root@qfedu.com ~]#find / -size +50M
查找小于50M
[root@qfedu.com ~]#find / -size -50M

查找⼤于10M⼩于20M
[root@qfedu.com ~]#find / -size +10M -a -size -20M 
-a可以换成-and

查找小于10M或者大于20M的文件名
[root@qfedu.com ~]#find / -size -10M -o -size +20M 
-o可以换成-or

查找大于10M的文件
[root@qfedu.com ~]# find ./ ! -size -10M

[root@qfedu.com ~]# find / -size -50M -a -name "*wing*"
[root@qfedu.com ~]# find / ! \( -size -50M -a -name "*wing*" \)
!取反
\( \)
\ 转义字符 把有意义的变的没意义 把没意义的变的有意义


附加:⽤dd命令做测试数据
[root@qfedu.com ~]#dd if=/dev/zero of=/tmp/aa.txt bs=5M count=2

3.按⽂件类型查找

-type

f	普通文件   -
d	目录文件   d
b	块设备     b    
c	字符设备   c
l	链接文件   l
s	套接字文件 s
p	管道文件   p



[root@qfedu.com ~]# find / -type c -exec ls -l {} \;
[root@qfedu.com ~]# find /tmp/ -name aa.txt -exec rm -i {} \;
[root@qfedu.com ~]# find /tmp/ -name aa.txt -ok rm {} \;
< rm ... /tmp/aa.txt > ? y
-exec 对之前查找出来的⽂件做进⼀步操作
-ok 和-exec⼀样,只不过多了提示



4.按权限查找:
-perm
[root@qfedu.com ~]# find ./ -perm 644 -exec ls -l {} \;    
[root@qfedu.com ~]# find ./ -perm 644  -ls
./dd.txt

5.按⽤户和组查找
-user
-group
[root@qfedu.com ~]# find ./ -user wing
./bb.txt
[root@qfedu.com ~]# find ./ -group user3
./cc.txt


6.按时间
访问时间(-atime/天,-amin/分钟):用户最近一次访问时间。
修改时间(-mtime/天,-mmin/分钟):文件最后一次修改时间
变化时间(-ctime/天,-cmin/分钟):文件最后一次修改时间。文件数据元(例如权限等)

time表示单位是天
min 表示分钟

stat:命令查看
[root@qfedu.com ~]# stat ⽂件

查找两分钟内访问过的⽂件
[root@qfedu.com ~]# find /tmp -amin -2
/tmp/a.txt
查找两天钟前访问过的⽂件
[root@qfedu.com ~]# find /tmp -atime +2
查找⼀个⽂件的硬链接:
[root@qfedu.com ~]# ln a.txt heihei
[root@qfedu.com ~]# ll -i
439360 -rw-r--r-- 2 root root 12 Nov 29 22:22 a.txt
439360 -rw-r--r-- 2 root root 12 Nov 29 22:22 heihei
[root@qfedu.com ~]# find . -samefile a.txt
./a.txt
./heihei




7.指定查找的⽬录深度:

-maxdepth levels 向下最大深度限制
-mindepth levels 深度距离当前目录至少多少

向下最大深度限制为3名字叫ifcfg-eth0的文件名
[root@qfedu.com ~]# find / -maxdepth 3 -a -name "ifcfg-eth0"

按正则表达式查找:
[root@qfedu.com ~]# find /etc -regex '.*ifcfg-ens[0-9][0-9]'
-exec -ok

搜索出深度距离当前目录至少2个子目录的所有文件
[root@host-136 ~]# find /usr/local/ -mindepth 2 -type f

防⽌被查找到的⽂件过多,导致内存溢出错误
[root@qfedu.com ~]# find . -name wing.txt | xargs -i cp {} /root/Desktop

4、xargs

    xargs(英文全拼: extended arguments)是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。
    xargs 默认的命令是 echo,这意味着通过管道传递给 xargs 的输入将会包含换行和空白,不过通过 xargs 的处理,换行和空白将被空格取代。
    xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令。

-i 或者是-I,这得看linux支持了,将xargs的每项名称,一般是一行一行赋值给 {},可以用 {} 代替。

1.多行输入变单行输入
[root@localhost ~]# cat l.txt
q w e r t y u
a s d f g h j
n m m m k o l
[root@localhost ~]# cat l.txt | xargs
q w e r t y u a s d f g h j n m m m k o l

2.使用 -n进行多行输出
-n 选项多行输出
[root@localhost ~]# cat l.txt | xargs -n3
q w e
r t y
u a s
d f g
h j n
m m m
k o l

3.使用 -d分割输入
-d 选项可以自定义一个定界符:
[root@localhost ~]# echo 'namexnamexnamexname' | xargs -dx 
name name name name
[root@localhost ~]# echo 'xhijbxjkixnhgxnih' | xargs -dx
 hijb jki nhg nih
[root@localhost ~]# echo 'namexnamexnamexname' | xargs -dx -n2
name name
name name
 
 4.结合I选项
 xargs 命令是一个非常好用的 Linux 命令,它可以将管道或标准输入转换成命令行参数,并用这些参数来执行指定的命令。
  但是,在某些情况下,xargs 命令的默认行为可能不符合我们的需求。在这种情况下,可以使用 -I 选项来自定义参数的分隔符。
  当 xargs 命令遇到 {} 符号时,它会将其替换为输入中的值,然后执行指定的命令。
  
[root@localhost ~]# vi 1.txt
/root/file1
/root/file2
[root@localhost ~]# cat 1.txt
/root/file1
/root/file2
[root@localhost ~]# touch file1 file2
[root@localhost ~]# cat 1.txt | xargs -I {} ls -l {}
-rw-r--r--. 1 root root 0 3月  13 20:53 /root/file1
-rw-r--r--. 1 root root 0 3月  13 20:53 /root/file2

如下面所见,{}符号起到了替代的作用
[root@localhost ~]# cat list.txt  |xargs -I {} cp -rf {} /tmp/
[root@localhost ~]# ls /tmp/file*
/tmp/file1  /tmp/file2

[root@localhost ~]# cat list.txt  |xargs -I {} rm -rvf {}
已删除"/root/file1"
已删除"/root/file2"

二、文件查找实战

1.sort 的工作原理

# sort整理文档排序
# 默认原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出

[root@localhost ~]# cat file.txt 
banana
apple
pear
orange
[root@localhost ~]# sort file.txt 
apple
banana
orange
pear

# sort -u : 在输出行中去除重复行

[root@localhost ~]# cat file.txt 
banana
apple
pear
orange
pear
[root@localhost ~]# sort -u file.txt 
apple
banana
orange
pear

pear由于重复被-u选项无情的删除了


# sort -r : 降序排行

[root@localhost ~]# sort -r file.txt 
pear
pear
orange
banana
apple
[root@localhost ~]# sort -r -u file.txt 
pear
orange
banana
apple

# sort -o :强制以数值来排序
你有没有遇到过10比2小的情况。我反正遇到过。出现这种情况是由于排序程序将这些数字按字符来排序了,排序程序会先比较1和2,显然1小,所以就将10放在2前面喽。这也是sort的一贯作风。
我们如果想改变这种现状,就要使用-n选项,来告诉sort,“要以数值来排序”!
[root@localhost ~]# sort file.txt 
1
10
11
12
2
3
4
5
6
7
8
9
[root@localhost ~]# sort -n file.txt 
1
2
3
4
5
6
7
8
9
10
11
12

# sort -k : 指定列数
[root@localhost ~]# cat facebook.txt 
nana:30:5.5
apple:10:2.5
pear:90:2.3
orange:20:3.4
[root@localhost ~]# sort -n -k2 -t : facebook.txt 
apple:10:2.5
orange:20:3.4
nana:30:5.5
pear:90:2.3
[root@localhost ~]# sort -n -k3 -t : facebook.txt 
pear:90:2.3
apple:10:2.5
orange:20:3.4
nana:30:5.5

2.cut的工作原理

cut是一个选取命令,就是将一段数据经过分析,取出我们想要的

语法格式:
cut  [-bn] [file] 或 cut [-c] [file]  或  cut [-df] [file]


主要参数:
-b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
-c :以字符为单位进行分割。
-d :自定义分隔符,默认为制表符。
-f :与-d一起使用,指定显示哪个区域。
-n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的<br />范围之内,该字符将被写出;否则,该字符将被排除。

一般定位剪切内容只需要接受三个定位:
第一:字节(bytes)-------用选项-b

第二:字符(characters)--用选项-c

第三:域(fields)--------用选项-f

# 以字节定位
[root@localhost ~]# who
root     :0           2024-04-07 16:31 (:0)
root     pts/0        2024-04-07 18:56 (10.7.189.149)
[root@localhost ~]# who | cut -b 4
t
t
[root@localhost ~]# who | cut -b 4,23-26
t2024
t2024

cut命令如果使用了-b选项,那么执行此命令时,cut会先把-b后面所有的定位进行从小到大排序,然后再提取。这样的顺序是不会颠倒的:
[root@localhost /]# who | cut -b 4,23-26
t2024
t2024

cut命令也能够输出整行
[root@localhost /]# who | cut -b -4
root
root
[root@localhost /]# who | cut -b 4-
t     :0           2024-04-07 16:31 (:0)
t     pts/0        2024-04-08 11:07 (10.7.189.149)

# 以字符为单位
[rocrocket@rocrocket programming]$ cat cut_ch.txt
星期一
星期二
星期三
星期四
[rocrocket@rocrocket programming]$ cut -b 3 cut_ch.txt
�
�
�
�
[rocrocket@rocrocket programming]$ cut -c 3 cut_ch.txt
一
二
三
四

# 以域为单位
[root@localhost /]# cat /etc/passwd | head -5 
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@localhost /]# cat /etc/passwd | head -5 | cut -d: -f 1
root
bin
daemon
adm
lp
[root@localhost /]# cat /etc/passwd | head -5 | cut -d: -f 1,3-5
root:0:0:root
bin:1:1:bin
daemon:2:2:daemon
adm:3:4:adm
lp:4:7:lp

三、文件打包及压缩

文件压缩:gzip, bzip2, xz ,zip	
	
# gzip: *.gz

压缩:
   mkdir /test/
   touch /test/{1..5}.txt
[root@localhost ~]# gzip /test/1.txt 
[root@localhost ~]# ls /test/
1.txt.gz  2.txt  3.txt
[root@localhost ~]# 
[root@localhost ~]# file /test/1.txt.gz 
/test/1.txt.gz: gzip compressed data, was "1.txt", from Unix, last modified: Thu Feb  9 21:37:47 2017

解压缩:  

[root@localhost ~]# gzip -d /test/1.txt.gz 
[root@localhost ~]# ls /test/
1.txt  2.txt  3.txt
[root@localhost ~]# 
[root@localhost ~]# gzip /test/1.txt 
[root@localhost ~]# ls /test/
1.txt.gz  2.txt  3.txt
[root@localhost ~]# 
[root@localhost ~]# gunzip /test/1.txt.gz 
[root@localhost ~]# ls /test/
1.txt  2.txt  3.txt

	
	
# bzip2:  *.bz2 
	
压缩:
[root@localhost ~]# yum install -y bzip2
[root@localhost ~]# bzip2 /test/2.txt 
[root@localhost ~]# ls /test/
1.txt  2.txt.bz2  3.txt
[root@localhost ~]# file /test/2.txt.bz2 
/test/2.txt.bz2: bzip2 compressed data, block size = 900k
[root@localhost ~]# 


解压缩:


[root@localhost ~]# bzip2 -d /test/2.txt.bz2 
[root@localhost ~]# ls /test/
1.txt  2.txt  3.txt
[root@localhost ~]# 
[root@localhost ~]# bzip2 /test/2.txt 
[root@localhost ~]# ls /test/
1.txt  2.txt.bz2  3.txt
[root@localhost ~]# 
[root@localhost ~]# bunzip2 /test/2.txt.bz2 
[root@localhost ~]# ls /test/
1.txt  2.txt  3.txt
[root@localhost ~]# 
 	
	
# xz:	*.xz 

压缩

[root@localhost ~]# xz /test/3.txt 
[root@localhost ~]# ls /test/
1.txt  2.txt  3.txt.xz
[root@localhost ~]# file /test/3.txt.xz 
/test/3.txt.xz: XZ compressed data
[root@localhost ~]# 


解压缩 
	
[root@localhost ~]# xz -d /test/3.txt.xz 
[root@localhost ~]# ls /test/
1.txt  2.txt  3.txt

[root@localhost ~]# unxz 3.txt.xz 	
[root@localhost ~]# ls /test/
1.txt  2.txt  3.txt
	

区别通过不同压缩方式的文件大小:

[root@localhost test]# dd if=/dev/zero of=/test/aa.txt bs=1G count=2
记录了2+0 的读入
记录了2+0 的写出
2147483648字节(2.1 GB)已复制,13.2365 秒,162 MB/秒
[root@localhost test]# ls
1.txt  2.txt  3.txt  4.txt  5.txt  aa.txt
[root@localhost test]# du -h aa.txt 
2.0G	aa.txt
[root@localhost test]# gzip aa.txt 
[root@localhost test]# du -h aa.txt.gz 
2.0M	aa.txt.gz
[root@localhost test]# gunzip aa.txt.gz 
[root@localhost test]# du -h aa.txt 
2.0G	aa.txt
[root@localhost test]# bzip2 aa.txt 
[root@localhost test]# du -h aa.txt.bz2 
4.0K	aa.txt.bz2
[root@localhost test]# bunzip2 aa.txt.bz2 
[root@localhost test]# du -h aa.txt 
2.0G	aa.txt
[root@localhost test]# xz aa.txt 
[root@localhost test]# du -h aa.txt.xz 
308K	aa.txt.xz
[root@localhost test]# unxz aa.txt.xz 
[root@localhost test]# du -h aa.txt 
4.0K	aa.txt      ------文件已损坏

# xz在压缩文件上肯定损坏文件,慎用之







tar -------- 打包文件 	
	
创建打包文件(*.tar)	

# tar cf <tar_file> <src_file>
	
	c:创建新的文档文件 (create)
	f:指定打包文件名称 (file)

格式:
    tar cf <选择打包去哪的目录以及文件名> <选择要打包的目录>

	
示例:将/etc目录下所有文件打包存放到 /tmp目录,名称为etc.tar 	
	
[root@localhost ~]# tar cf /tmp/etc.tar /etc/
	

注   v:显示 tar 命令执行的详细信息(Verbose)
     tar cvf <tar_file> <src_file>

解包文件:

# tar xf <tar_file> [-C <dir>]	
  tar xf <选择打包去哪的目录以及文件名> <选择要打包的目录>

	x:解包
	-C <dir>:指定解包路径(大写,没有-C的话默认当前目录)
	
[root@localhost ~]# tar xf /tmp/etc.tar 

[root@localhost ~]# tar xf /tmp/etc.tar -C /up/

	
	
调用gzip压缩/解压缩 

压缩打包:	*.tar.gz

# tar czf <tar_file> <src_file>

	z:调用gzip 
	
[root@localhost ~]# tar czf /tmp/etc.tar.gz /etc/

解压缩: 

# tar xzf <tar_file> [-C <dir>]

[root@localhost ~]# tar zxf /tmp/etc.tar.gz -C /up/



调用bzip2压缩/解压缩

压缩打包: 	*.tar.bz2 

# tar cjf <tar_file> <src_file>

	j: 调用bzip2 
	
[root@localhost ~]# tar cjf /tmp/etc.tar.bz2 /etc/
	
解压缩:

# tar xjf <tar_file> [-C <dir>]

[root@localhost ~]# tar xjf /tmp/etc.tar.bz2 -C /up/
	
	
	
调用xz压缩/解压缩 

压缩打包: 	*.tar.xz 

# tar cJf <tar_file> <src_file>

	J: 调用xz 
	
解压缩: 

# tar xJf <tar_file> [-C <dir>]
	
	
	
解压缩.zip

# unzip <file>	

四、归档压缩实战

1、使⽤常⽤打包压缩命令对指定⽂件和⽬录进⾏打包压缩操作
2、将海量⼩⽂件快速复制⾄远程主机
特例:
数据库数据⽬录特别⼤ ⼏⼗个G 如果rm删除会把io⽤满,⽤truncate ⼀点⼀点的删:truncate -s 10M
/path/*

练习题:

1.在/home目录下查找以.txt结尾的文件名
find /home -name "*.txt"

2.在/home目录下查找以.txt结尾的文件名,但忽略大小写
fund /home -iname "*.txt"

3.查找 /home/ 下所有以.txt或.pdf结尾的文件
find /home -name "*.txt" -o -name "*.pdf"

4.查找 /home/ 下所有以a开头和以.txt结尾的文件
find /home -name "*.txt"  -a -name "a.*"

5.搜索最近七天内被访问过的所有文件
find / -atime -7 

6.搜索超过七天内(7天外)被访问过的所有文件
find / -atime +7

7.搜索大于10KB的文件
find / -size +10K

8.搜索小于10KB的文件
find / -size -10K

9.搜索等于10KB的文件
find / -size 10k

10.搜索大于10G的日志文件,并删除
find / -size +10G | xargs -I {} rm -rf {}

11.找出指定目录下权限不是644的txt文件
find / -name "*.txt"  -a ! -perm 644 
12.找出/home目录用户frank拥有的所有文件
find /home -user frank

13.找出/home目录用户组frank拥有的所有文件
find /home -group frank

14.截取出磁盘剩余容量并打印
[root@localhost ~]# df -Th | grep "5.4" | awk -F"G" '{print $2}'

15.截取出内存剩余容量并打印
free -m | grep "M" | awk -F" " '{print $4}'

16.截取出ip地址并打印
ip a | grep "dy" | awk -F" " '{print $2}'


17.截取出系统的平均负载数值并打印
uptime | awk -F" " '{print $8$9$10}'

五、Linux中三种引号的区别

单引号

单引号内不允许任何变量、元字符、通配符、转义符被 shell 解析,均被原样输出。

双引号

保护特殊元字符和通配符不被 shell 解析,但是允许变量和命令的解析,以及转义符的解析。

反引号

反引号的功能是命令替换,在反引号(``) 中的内容通常是命令行,程序会优先执行反引号中的内容,并使用运行结果替换掉反引号处的内容。
posted on 2024-08-01 20:10  海石三  阅读(23)  评论(0编辑  收藏  举报