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选项

其他命令命令选项及表达式可参见下图。

img

###常用范例:
例一:打印当前目录下的文件目录列表 ,可以使用如下命令:

find  .  -print

img

例二:打印当前目录下所有以.txt结尾的文件名 ,可以使用如下命令(截图只显示部分):

find  .  -name “*.txt” -print

-iname选项跟-name选项作用一样,不同在于-iname会忽略字母大小写。

img

例三:打印当前目录下所有以.txt或.pdf结尾的文件名 ,可以使用如下命令(截图只显示部分):

find  .  \(-name “*.pdf” -or -name “*.txt”\)

img

例四:打印当前目录下所有以.txt结尾的文件名 ,可以使用如下命令:

find  .  ! -name “*.txt”

img

##find命令(二)

下面将介绍如何根据文件类型、权限、所有者及操作符来查找匹配文件。

根据文件类型来查找文件,使用-type选项,常见find文件类型见下表。

img

根据文件权限查找文件,使用-perm选项。所有者使用-user选项。

另外,find命令可以通过逻辑操作符来创建更复杂的逻辑关系,例如find命令(一)中的例三就使用了操作符-or。find命令的逻辑操作符见下表。

img

###常用范例:
例一:打印当前目录下所有以.txt结尾的符号链接 ,可以使用如下命令:

find  .  -type l -name “*.txt” -print

img

例二:打印当前目录下所有权限为777的php文件(web服务器上的php文件一般需要执行权限),可以使用如下命令:

find . -type f -name “*.php” -perm 777

img

例三:打印当前目录下root用户拥有的所有文件,可以使用如下命令:

find  .  -type f -user root

img

例四:打印当前目录下权限不是777和664的所有文件,可以使用如下命令:

find  .  -type f  \( ! -perm 777  -and  ! -perm 644 \)

img

##find命令(三)

下面将介绍如何使用find命令的-exec选项来实现对查找到的文件执行指定的动作命令。

###常用范例:
例一:找到当前目录下所有php文件,并显示其详细信息,可以使用如下命令:

find . -name “*.php” -exec ls -l {} \;

img

-exec是find命令对找到的文件执行的动作,这个动作就是对找到的文件执行命令,上面的命令就是ls -l {}。在这里说明一下{}和\;,{}其实它就是一个占位符,在find命令的执行过程中会不断地替换成当前找到的文件,相当于”ls -l 找到的文件”。而\;是-exec的命令结束标记,因为规定-exec后面的命令必须以;结束,但;在shell中有特殊含义,必须要转义,所以写成\;。

例二:在实验楼环境中有很多自己编写的c语言代码文件,现在想要把所有c语言代码文件下载下来,如果一个一个的下载很麻烦,我们可以先查找到所有的c语言代码文件,然后将这些文件内容写入到一个文件中,下载该文件,可以使用如下命令:

find . -name “*.c” -exec cat {} \; > all.c

img

例三:默认下,-exec后面只能使用单个命令,如果想要多个命令,可以将多个命令写入脚本文件中,然后在-exec中使用这个脚本,可以使用如下命令:

find . -name “*.c” -exec ./command.sh {} \;

脚本内容:

#! /bin/bash
ls -l $1       # $1表示第一个参数
cat $1

img

##xargs命令

我们可以用管道将一个命令的stdout(标准输出)重定向到另一个命令的stdin(标准输入)。但有些命令只能以命令行参数的形式接收数据,而无法通过stdin接收数据流。在这种情况下,无法通过管道将数据重定向给这些命令。

这时xargs就可以发挥它的作用了,xargs命令可以从标准输入接收输入,并把输入转换为一个特定的参数列表。

###命令格式:
command | xargs [选项] [command]

xargs命令应该紧跟在管道操作符之后,因为它以标准输入作为主要的源数据流。

###常用参数:

  • -n 指定每行最大的参数数量
  • -d 指定分隔符

###常用范例:
例一:将多行输入转换为单行输出,可以使用如下命令:

cat a.txt | xargs

img

例二:将单行输入转换为多行输出,可以使用如下命令:

echo “1 2 3 4 5 6 7” | xargs -n 3

img

例三:将单行输入转换为多行输出,指定分隔符为i,可以使用如下命令:

cat b.txt | xargs -d i -n 3

img

例四:查找当前目录下所有c代码文件,统计总行数,可以使用如下命令:

find . -type f -name “*.c” | xargs wc -l

img

Comments

2016-06-29