Linux下查找文件的命令有两个;locate 和 find
首先说下locate,locate这个命令是对其生成的数据库进行遍历(生成数据库的命令:updatedb),这一特性决定了用locate查找文件速度很快,但是locate命令只能对文件进行模糊匹配,在精确度上来说差了点,简单介绍下它的两个选项:
#locate
-i //查找文件的时候不区分大小写 比如:locate –i passwd
-n //只显示查找结果的前N行 比如:locate -n 5 passwd
下面重点说下find,find在不指定查找目录的情况下是对整个系统进行遍历查找
使用格式 : find [指定查找目录] [查找规则] [查找完后执行的action]
[指定查找目录]例如:
这里要注意的是目录之间要用空格分开
[查找规则]
(1)根据文件名查找
//根据文件名查找(精确查找)
# -iname //根据文件名查找,但是不区分大小写
这里另外介绍下文件名通配的知识
*表示 通配任意的字符
?表示 通配任意的单个字符 [ ] 表示 通配括号里面的任意一个字符
(2),根据文件所属用户和组来查找文件 # -user //根据属主来查找文件 # -group //根据属组来查找文件
(3),根据uid 和 gid来查找用户 #find /tmp -uid 500 //查找uid是500 的文件 #find /tmp -gid 1000 // 查找gid是1000的文件
(4),-a and -o and –not的使用 # -a 连接两个不同的条件(两个条件必须同时满足)
# -o 连接两个不同的条件(两个条件满足其一即可) # -not 对条件取反的
(5),根据文件时间戳的相关属性来查找文件 我们可以使用stat命令来查看一个文件的时间信息 如下:
#-atime #-mtime #-ctime #-amin #-mmin #-cmin
所以这里atime,mtime,ctime就是分别对应的“最近一次访问时间”“最近一次内容修改时间”“最近一次属性修改时间”,这里的atime的单位指的是“天”,amin的单位是分钟
#find /tmp –atime +5 //表示查找在五天内没有访问过的文件
#find /tmp -atime -5 //表示查找在五天内访问过的文件
(6),根据文件类型来查找文件 -type f // 普通文件 d //目录文件 l //链接文件 b //块设备文件 c //字符设备文件 p //管道文件 s //socket文件
(7),根据大小来查找文件 -size #find /tmp -size 2M //查找在/tmp 目录下等于2M的文件 #find /tmp -size +2M //查找在/tmp 目录下大于2M的文件 #find /tmp -size -2M //查找在/tmp 目录下小于2M的文件。find / -size +50M -exec ls -lh {} \;文件大于+50M,-50小于
(8),根据文件权限查找文件 -perm #find /tmp -perm 755 //查找在/tmp目录下权限是755的文件 #find /tmp -perm +222 //表示只要有一类用户(属主,属组,其他)的匹配写权限就行 #find /tmp -perm -222 //表示必须所有类别用户都满足有写权限
(9),-nouser and -nogroup #find / -nogroup –a –nouser //在整个系统中查找既没有属主又没有属组的文件(这样的文件通常是很危险的,作为系统工程师的我们应该及时清除掉) [查找完执行的action]
# -print //默认情况下的动作 # -ls //查找到后用ls 显示出来 # -ok [commend] //查找后执行命令的时候询问用户是否要执行
# -exec [commend] //查找后执行命令的时候不询问用户,直接执行
这里要注意{}的使用:替代查找到的文件 #find /tmp -atime +30 –exec rm –rf {} \;
#删除查找到的超过30天没有访问过文件 我们也可以使用xargs来对查找到的文件进一步操作
Linux xargs 命令
xargs(英文全拼: eXtended ARGuments)是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。
xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。
xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。
xargs 默认的命令是 echo,这意味着通过管道传递给 xargs 的输入将会包含换行和空白,不过通过 xargs 的处理,换行和空白将被空格取代。
xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令。
之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了 xargs 命令,例如:
find /sbin -perm +700 |ls -l #这个命令是错误的 find /sbin -perm +700 |xargs ls -l #这样才是正确的
xargs 一般是和管道一起使用。
命令格式:
somecommand |xargs -item command
参数:
- -a file 从文件中读入作为 stdin
- -e flag ,注意有的时候可能会是-E,flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止。
- -p 当每次执行一个argument的时候询问一次用户。
- -n num 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的。
- -t 表示先打印命令,然后再执行。
- -i 或者是-I,这得看linux支持了,将xargs的每项名称,一般是一行一行赋值给 {},可以用 {} 代替。
- -r no-run-if-empty 当xargs的输入为空的时候则停止xargs,不用再去执行了。
- -s num 命令行的最大字符数,指的是 xargs 后面那个命令的最大命令行字符数。
- -L num 从标准输入一次读取 num 行送给 command 命令。
- -l 同 -L。
- -d delim 分隔符,默认的xargs分隔符是回车,argument的分隔符是空格,这里修改的是xargs的分隔符。
- -x exit的意思,主要是配合-s使用。。
- -P 修改最大的进程数,默认是1,为0时候为as many as it can ,这个例子我没有想到,应该平时都用不到的吧。
实例
xargs 用作替换工具,读取输入数据重新格式化后输出。
定义一个测试文件,内有多行文本数据:
# cat test.txt a b c d e f g h i j k l m n o p q r s t u v w x y z
多行输入单行输出:
# cat test.txt | xargs a b c d e f g h i j k l m n o p q r s t u v w x y z
-n 选项多行输出:
# cat test.txt | xargs -n3 a b c d e f g h i j k l m n o p q r s t u v w x y z
-d 选项可以自定义一个定界符:
# echo "nameXnameXnameXname" | xargs -dX name name name name
结合 -n 选项使用:
# echo "nameXnameXnameXname" | xargs -dX -n2 name name name name
读取 stdin,将格式化后的参数传递给命令
假设一个命令为 sk.sh 和一个保存参数的文件 arg.txt:
#!/bin/bash #sk.sh命令内容,打印出所有参数。 echo $*
arg.txt文件内容:
# cat arg.txt aaa bbb ccc
xargs 的一个选项 -I,使用 -I 指定一个替换字符串 {},这个字符串在 xargs 扩展时会被替换掉,当 -I 与 xargs 结合使用,每一个参数命令都会被执行一次:
# cat arg.txt | xargs -I {} ./sk.sh -p {} -l -p aaa -l -p bbb -l -p ccc -l
复制所有图片文件到 /data/images 目录下:
ls *.jpg | xargs -n1 -I {} cp {} /data/images
xargs 结合 find 使用
用 rm 删除太多的文件时候,可能得到一个错误信息:/bin/rm Argument list too long. 用 xargs 去避免这个问题:
find . -type f -name "*.log" -print0 | xargs -0 rm -f
xargs -0 将 \0 作为定界符。
统计一个源代码目录中所有 php 文件的行数:
find . -type f -name "*.php" -print0 | xargs -0 wc -l
查找所有的 jpg 文件,并且压缩它们:
find . -type f -name "*.jpg" -print | xargs tar -czvf images.tar.gz
xargs 其他应用
假如你有一个文件包含了很多你希望下载的 URL,你能够使用 xargs下载所有链接:
# cat url-list.txt | xargs wget -c
Linux uniq 命令
Linux uniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用。
uniq 可检查文本文件中重复出现的行列。
语法
uniq [-cdu][-f<栏位>][-s<字符位置>][-w<字符位置>][--help][--version][输入文件][输出文件]
参数:
- –c或–count 在每列旁边显示该行重复出现的次数。
- -d或–repeated 仅显示重复出现的行列。
- -f<栏位>或–skip-fields=<栏位> 忽略比较指定的栏位。
- -s<字符位置>或–skip-chars=<字符位置> 忽略比较指定的字符。
- -u或–unique 仅显示出一次的行列。
- -w<字符位置>或–check-chars=<字符位置> 指定要比较的字符。
- –help 显示帮助。
- –version 显示版本信息。
- [输入文件] 指定已排序好的文本文件。如果不指定此项,则从标准读取数据;
- [输出文件] 指定输出的文件。如果不指定此选项,则将内容显示到标准输出设备(显示终端)。
实例
文件testfile中第 2、3、5、6、7、9行为相同的行,使用 uniq 命令删除重复的行,可使用以下命令:
uniq testfile
testfile中的原有内容为:
$ cat testfile #原有内容 test 30 test 30 test 30 Hello 95 Hello 95 Hello 95 Hello 95 Linux 85 Linux 85
使用uniq 命令删除重复的行后,有如下输出结果:
$ uniq testfile #删除重复行后的内容 test 30 Hello 95 Linux 85
检查文件并删除文件中重复出现的行,并在行首显示该行重复出现的次数。使用如下命令:
uniq -c testfile
结果输出如下:
$ uniq -c testfile #删除重复行后的内容 3 test 30 #前面的数字的意义为该行共出现了3次 4 Hello 95 #前面的数字的意义为该行共出现了4次 2 Linux 85 #前面的数字的意义为该行共出现了2次
当重复的行并不相邻时,uniq 命令是不起作用的,即若文件内容为以下时,uniq 命令不起作用:
$ cat testfile1 # 原有内容 test 30 Hello 95 Linux 85 test 30 Hello 95 Linux 85 test 30 Hello 95 Linux 85
这时我们就可以使用 sort:
$ sort testfile1 | uniq Hello 95 Linux 85 test 30
统计各行在文件中出现的次数:
$ sort testfile1 | uniq -c 3 Hello 95 3 Linux 85 3 test 30
在文件中找出重复的行:
$ sort testfile1 | uniq -d Hello 95 Linux 85 test 30
Linux sort 命令
Linux sort 命令用于将文本文件内容加以排序。
sort 可针对文本文件的内容,以行为单位来排序。
语法
sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+<起始栏位>-<结束栏位>][--help][--verison][文件][-k field1[,field2]]
参数说明:
- -b 忽略每行前面开始出的空格字符。
- -c 检查文件是否已经按照顺序排序。
- -d 排序时,处理英文字母、数字及空格字符外,忽略其他的字符。
- -f 排序时,将小写字母视为大写字母。
- -i 排序时,除了040至176之间的ASCII字符外,忽略其他的字符。
- -m 将几个排序好的文件进行合并。
- -M 将前面3个字母依照月份的缩写进行排序。
- -n 依照数值的大小排序。
- -u 意味着是唯一的(unique),输出的结果是去完重了的。
- -o<输出文件> 将排序后的结果存入指定的文件。
- -r 以相反的顺序来排序。
- -t<分隔字符> 指定排序时所用的栏位分隔字符。
- +<起始栏位>-<结束栏位> 以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。
- –help 显示帮助。
- –version 显示版本信息。
- [-k field1[,field2]] 按指定的列进行排序。
实例
在使用 sort 命令以默认的式对文件的行进行排序,使用的命令如下:
sort testfile
sort 命令将以默认的方式将文本文件的第一列以 ASCII 码的次序排列,并将结果输出到标准输出。
使用 cat 命令显示 testfile 文件可知其原有的排序如下:
$ cat testfile # testfile文件原有排序 test 30 Hello 95 Linux 85
使用 sort 命令重排后的结果如下:
$ sort testfile # 重排结果 Hello 95 Linux 85 test 30
使用 -k 参数设置对第二列的值进行重排,结果如下:
$ sort testfile -k 2 test 30 Linux 85 Hello 95
Linux中tail与head命令用法详解
tail命令也是一个非常常用的文件查看类的命令,今天就为大家介绍下Linux tail命令的用法。
更多Linux命令详情请看:Linux命令速查手册
Linux tail命令主要用来从指定点开始将文件写到标准输出。很多人喜欢使用tail –f 来监控日志文件。
一、Linux tail命令格式
Linux tail命令 格式如下所示
tail [OPTION]… [FILE]…
Linux tail命令 参数如下所示
-f 循环读取
-q 不显示处理信息
-v 显示详细的处理信息
-c<数目> 显示的字节数
-n<行数> 显示行数
–pid=PID 与-f合用,表示在进程ID,PID死掉之后结束.
-q, –quiet, –silent 从不输出给出文件名的首部
-s, –sleep-interval=S 与-f合用,表示在每次反复的间隔休眠S秒
二、Linux tail命令使用示例
1)查看文件最后几行内容
1
2
3
4
5
6
7
|
$ tail -5 linuxdaxue.com-access_log 180.175.51.163 - - [14 /Jun/2016 :11:45:09 +0800] "GET http://www.linuxdaxue.com/wp-content/uploads/2016/05/Shell-printf_thumb.jpg&h=64&w=100&q=90&zc=0&ct=1 HTTP/1.1" 200 2611 180.175.51.163 - - [14 /Jun/2016 :11:45:09 +0800] "GET http://www.linuxdaxue.com/wp-content/uploads/2016/05/Shell_thumb-2.jpg&h=64&w=100&q=90&zc=0&ct=1 HTTP/1.1" 200 2572 180.175.51.163 - - [14 /Jun/2016 :11:45:09 +0800] "GET http://www.linuxdaxue.com/wp-content/uploads/2016/05/Shell_thumb-3.jpg&h=64&w=100&q=90&zc=0&ct=1 HTTP/1.1" 200 2580 180.175.51.163 - - [14 /Jun/2016 :11:45:09 +0800] "GET http://www.linuxdaxue.com/wp-content/uploads/2016/05/Shell_thumb-1.jpg&h=64&w=100&q=90&zc=0&ct=1 HTTP/1.1" 200 2646 180.175.51.163 - - [14 /Jun/2016 :11:45:09 +0800] "GET http://www.linuxdaxue.com/wp-content/uploads/2016/06/Shell_thumb-1.jpg&h=64&w=100&q=90&zc=0&ct=1 HTTP/1.1" 200 2850 $ |
2)从第10行开始显示文件
1
|
tail -n +10 linuxdaxue.com-access_log |
3)循环监视日志文件 tail -f /var/log/kern.log #循环读取显示系统内核log
1
2
3
|
$ tail -f linuxdaxue.com-access_log 180.175.51.163 - - [14 /Jun/2016 :11:45:09 +0800] "GET http://www.linuxdaxue.com/wp-content/uploads/2016/05/Shell_thumb-1.jpg&h=64&w=100&q=90&zc=0&ct=1 HTTP/1.1" 200 2646 180.175.51.163 - - [14 /Jun/2016 :11:45:09 +0800] "GET http://www.linuxdaxue.com/wp-content/uploads/2016/06/Shell_thumb-1.jpg&h=64&w=100&q=90&zc=0&ct=1 HTTP/1.1" 200 2850 |
用法:head [选项]… [文件]…
将每个指定文件的前 10 行输出到标准输出。
如果指定了多于一个文件,在每块输出之前附加文件名称作为头部。
如果没有指定文件,或者文件为”-“,则从标准输入读取。
必选参数对长短选项同时适用。
-c, –bytes=[-]K 显示每个文件的前 K 字节内容;
如果数字前附加“-”字符,则除了每个文件的
最后 K 字节数据外显示其余全部内容
-n, –lines=[-]K 显示每个文件的前 K 行内容而非前 10 行内容;
如果数字前附加“-”字符,则除了每个文件的
最后 K 行数据外显示其余全部内容
-q, –quiet, –silent 不显示包含给定文件名的文件头
-v, –verbose 总是显示包含给定文件名的文件头
-z, –zero-terminated 以 NUL 字符而非换行符作为行尾分隔符
–help 显示此帮助信息并退出
–version 显示版本信息并退出
所给定的数字 K 后面可以附加乘数后缀:
b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024,
GB 1000*1000*1000, G 1024*1024*1024, 对于 T, P, E, Z, Y 同样适用。
也可以使用二进制前缀,如:KiB=K,MiB=M 等等。
如果想查看文件的前几行信息,用到了head命令,head -n 行数表示显示前面的几行信息
Linux head 命令
head 命令可用于查看文件的开头部分的内容,有一个常用的参数 -n 用于显示行数,默认为 10,即显示 10 行的内容。
命令格式:
head [参数] [文件]
参数:
- -q 隐藏文件名
- -v 显示文件名
- -c<数目> 显示的字节数。
- -n<行数> 显示的行数。
实例
要显示 runoob_notes.log 文件的开头 10 行,请输入以下命令:
head runoob_notes.log
显示 notes.log 文件的开头 5 行,请输入以下命令:
head -n 5 runoob_notes.log
显示文件前 20 个字节:
head -c 20 runoob_notes.log