Linux操作命令(五)
Linux操作命令(五)
该节主要讲解find,xargs 命令。
这里对linux常用的命令进行整理,以便日后查看。
–来自实验楼。
##find命令(一)
find命令主要作用是沿着文件层次结构向下遍历,匹配符合条件的文件,并执行相应的操作。Linux下find命令提供了相当多的查找条件,功能很强大,对应的学习难度也比较大。
###命令格式:
find [选项] [搜索路径] [表达式]
默认路径是当前目录,默认表达式为-print。
表达式可能由下列成份组成:操作符、选项、测试表达式以及动作。
###常用参数:
- -print find命令将匹配的文件输出到标准输出
- -exec find命令对匹配的文件执行该参数所给出的shell命令
- -name 按照文件名查找文件
- -type 查找某一类型的文件
- -prune 使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略
- -user 按照文件属主来查找文件
- -group 按照文件所属的组来查找文件
- -mtime -n +n 按照文件的更改时间来查找文件,-n表示文件更改时间距现在小于n 天,+n表示文件更改时间距现在大于n天,find命令还有-atime和 -ctime选项
其他命令命令选项及表达式可参见下图。
###常用范例:
例一:打印当前目录下的文件目录列表 ,可以使用如下命令:
find . -print
例二:打印当前目录下所有以.txt结尾的文件名 ,可以使用如下命令(截图只显示部分):
find . -name “*.txt” -print
-iname选项跟-name选项作用一样,不同在于-iname会忽略字母大小写。
例三:打印当前目录下所有以.txt或.pdf结尾的文件名 ,可以使用如下命令(截图只显示部分):
find . \(-name “*.pdf” -or -name “*.txt”\)
例四:打印当前目录下所有不以.txt结尾的文件名 ,可以使用如下命令:
find . ! -name “*.txt”
##find命令(二)
下面将介绍如何根据文件类型、权限、所有者及操作符来查找匹配文件。
根据文件类型来查找文件,使用-type选项,常见find文件类型见下表。
根据文件权限查找文件,使用-perm选项。所有者使用-user选项。
另外,find命令可以通过逻辑操作符来创建更复杂的逻辑关系,例如find命令(一)中的例三就使用了操作符-or。find命令的逻辑操作符见下表。
###常用范例:
例一:打印当前目录下所有以.txt结尾的符号链接 ,可以使用如下命令:
find . -type l -name “*.txt” -print
例二:打印当前目录下所有权限为777的php文件(web服务器上的php文件一般需要执行权限),可以使用如下命令:
find . -type f -name “*.php” -perm 777
例三:打印当前目录下root用户拥有的所有文件,可以使用如下命令:
find . -type f -user root
例四:打印当前目录下权限不是777和664的所有文件,可以使用如下命令:
find . -type f \( ! -perm 777 -and ! -perm 644 \)
##find命令(三)
下面将介绍如何使用find命令的-exec选项来实现对查找到的文件执行指定的动作命令。
###常用范例:
例一:找到当前目录下所有php文件,并显示其详细信息,可以使用如下命令:
find . -name “*.php” -exec ls -l {} \;
-exec是find命令对找到的文件执行的动作,这个动作就是对找到的文件执行命令,上面的命令就是ls -l {}。在这里说明一下{}和\;,{}其实它就是一个占位符,在find命令的执行过程中会不断地替换成当前找到的文件,相当于”ls -l 找到的文件”。而\;是-exec的命令结束标记,因为规定-exec后面的命令必须以;结束,但;在shell中有特殊含义,必须要转义,所以写成\;。
例二:在实验楼环境中有很多自己编写的c语言代码文件,现在想要把所有c语言代码文件下载下来,如果一个一个的下载很麻烦,我们可以先查找到所有的c语言代码文件,然后将这些文件内容写入到一个文件中,下载该文件,可以使用如下命令:
find . -name “*.c” -exec cat {} \; > all.c
例三:默认下,-exec后面只能使用单个命令,如果想要多个命令,可以将多个命令写入脚本文件中,然后在-exec中使用这个脚本,可以使用如下命令:
find . -name “*.c” -exec ./command.sh {} \;
脚本内容:
#! /bin/bash
ls -l $1 # $1表示第一个参数
cat $1
##xargs命令
我们可以用管道将一个命令的stdout(标准输出)重定向到另一个命令的stdin(标准输入)。但有些命令只能以命令行参数的形式接收数据,而无法通过stdin接收数据流。在这种情况下,无法通过管道将数据重定向给这些命令。
这时xargs就可以发挥它的作用了,xargs命令可以从标准输入接收输入,并把输入转换为一个特定的参数列表。
###命令格式:
command | xargs [选项] [command]
xargs命令应该紧跟在管道操作符之后,因为它以标准输入作为主要的源数据流。
###常用参数:
- -n 指定每行最大的参数数量
- -d 指定分隔符
###常用范例:
例一:将多行输入转换为单行输出,可以使用如下命令:
cat a.txt | xargs
例二:将单行输入转换为多行输出,可以使用如下命令:
echo “1 2 3 4 5 6 7” | xargs -n 3
例三:将单行输入转换为多行输出,指定分隔符为i,可以使用如下命令:
cat b.txt | xargs -d i -n 3
例四:查找当前目录下所有c代码文件,统计总行数,可以使用如下命令:
find . -type f -name “*.c” | xargs wc -l