首先了解基本命令:
Linux 经常需要进行文件查找。其中查找的命令主要有find和grep。两个命令是有区的
(1)find命令是根据文件的属性进行查找,如文件名,文件大小,所有者,所属组,是否为空,访问时间,修改时间等。
(2)grep是根据文件的内容进行查找,会对文件的每一行按照给定的模式(patter)进行匹配查找。
一、find 命令:
find path -option [ -print ] [ -exec -ok command ] {} \;
部分参数说明:
-exec:对找到的文件执行exec这个参数所指定的shell命令,相应的形式为:-exec command {} \; 将查到的文件进行command操作,”{}”就代替查到的文件。
-ok : 系统会让用户确定是否执行例子:
#将目前目录及其子目录下所有最近 20 天内更新过的文件列出
find . -ctime -20
#查找/var/log目录中更改时间在7日以前的普通文件,并在删除之前询问它们:
find /var/log -type f -mtime +7 -ok rm {} \;
# 查找前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件:
find . -type f -perm 644 -exec ls -l {} \;
# 为了查找系统中所有文件长度为0的普通文件,并列出它们的完整路径:
find / -type f -size 0 -exec ls -l {} \;
#查找空文件夹
find -type d -empty
二、 grep 命令:
grep命令用于查找文件里符合条件的字符串
grep 用法略...
三、xargs 命令:
somecommand |xargs -item command
xargs 是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。
xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行;
参数说明:
-a file 从文件中读入作为sdtin
-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 ,这个例子我没有想到,应该平时都用不到的吧。
find . -name "*.txt" | xargs rm -rf {}
find /home/ -iname "*.sh" |xargs -I {} ls -li {}
#-i 表示 find 传递给xargs的结果 由{}来代替
find /root/ -type f -name "*.sh" | xargs -i cp {} /tmp/
#查找所有的jpg 文件,并且压缩它
find / -name *.jpg -type f -print | xargs tar -cvzf images.tar.gz
四、xargs 与 exec区别
-exec
1.参数是一个一个传递的,传递一个参数执行一次,效率低
2.文件名有空格等特殊字符也能处理
-xargs
1.一次将参数传给命令,可以使用-n控制参数个数
2.处理特殊文件名需要采用如下方式:find . -name "*.txt" -print0 |xargs -0 rm {}
find -print0 与 xargs -0 的结合避免文件名有特殊字符如空格,引号等无法处理
五、举例说明:
#搜索文件中含有“resines”字符串
find . -name "*.text" | xargs grep resines
#搜索文件名中含有的resines
find . -name "*.text" | grep resines
#xargs还有指定参数位置的作用。假设我们要将目录下所有的.py文件放到Python目录中去,
#参数-I指定了管道前命令作为参数所应该在管道后面命令的位置。
find . -name '*.py' | xargs -I {} mv {} ./Python