Linux操作命令(五)
一、实验介绍
1.1 实验内容
本次实验将介绍 Linux 命令中 find 和 xargs 命令的用法。
1.2 实验知识点
- find 命令
- xargs 命令
1.3 实验环境
课程使用的实验环境为 Ubuntu Linux 14.04 64 位版本。实验中会用到程序:
- Xfce终端
二、实验步骤
2.1 find 命令(一)
find 命令主要作用是沿着文件层次结构向下遍历,匹配符合条件的文件,并执行相应的操作。Linux 下 find 命令提供了相当多的查找条件,功能很强大,对应的学习难度也比较大。
(1)命令格式
find [选项] [搜索路径] [表达式]
默认路径是当前目录,默认表达式为-print。
表达式可能由下列成份组成:操作符、选项、测试表达式以及动作。
(2)常用参数
参数 | 描述 |
---|---|
find 命令将匹配的文件输出到标准输出 | |
-exec | find 命令对匹配的文件执行该参数所给出的 shell 命令 |
-name | 按照文件名查找文件 |
-type | 查找某一类型的文件 |
-prune | 使用这一选项可以使 find 命令不在当前指定的目录中查找,如果同 时使用-depth 选项,那么-prune 将被 find 命令忽略 |
-user | 按照文件属主来查找文件 |
-group | 按照文件所属的组来查找文件 |
-mtime -n +n | 按照文件的更改时间来查找文件,-n 表示文件更改时间距现在小于 n天,+n 表示文件更改时间距现在大于 n 天,find 命令还有-atime 和 -ctime 选项 |
其他命令命令选项及表达式可参见下图。
(3)常用范例
例一:打印当前目录下的文件目录列表 ,可以使用如下命令:
find . -print
例二:打印当前目录下所有以.txt 结尾的文件名 ,可以使用如下命令(截图只显示部分):
find . -name "*.txt" -print
-iname 选项跟-name 选项作用一样,不同在于-iname 会忽略字母大小写。
例三:打印当前目录下所有以.txt 或.pdf 结尾的文件名 ,可以使用如下命令(截图只显示部分):
find . \( -name "*.pdf" -or -name "*.txt" \)
例四:打印当前目录下所有不以.txt 结尾的文件名 ,可以使用如下命令:
find . ! -name "*.txt"
2.2 find 命令(二)
下面将介绍如何根据文件类型、权限、所有者及操作符来查找匹配文件。
根据文件类型来查找文件,使用-type 选项,常见 find 文件类型见下表。
根据文件权限查找文件,使用-perm 选项。所有者使用-user 选项。
另外,find 命令可以通过逻辑操作符来创建更复杂的逻辑关系,例如 find 命令(一)中的例三就使用了操作符-or。find 命令的逻辑操作符见下表。
(1)常用范例
例一:打印当前目录下所有以.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 \)
2.3 find 命令(三)
下面将介绍如何使用 find 命令的-exec 选项来实现对查找到的文件执行指定的动作命令。
(1)常用范例
例一:找到当前目录下所有 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 命令可以从标准输入接收输入,并把输入转换为一个特定的参数列表。
(1)命令格式
command | xargs [选项] [command]
xargs 命令应该紧跟在管道操作符之后,因为它以标准输入作为主要的源数据流。
(2)常用参数
参数 | 描述 |
---|---|
-n | 指定每行最大的参数数量 |
-d | 指定分隔符 |
(3)常用范例
例一:将多行输入转换为单行输出,可以使用如下命令:
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
三、参考链接
本课程部分内容参考博文每天一个Linux命令,感谢作者peida提供的优质教程。