16.2 复杂命令

高级用户需要掌握的命令

find

-exec COMMAND ;

find匹配的每个文件执行COMMAND。命令序列以半角分号(;)终止(其中分号需要进行转义arrow-up-right以确保shell从字面上将其传递给find,而不会将其解释为特殊字符)。

bash$ find ~/ -name '*.txt'
 /home/bozo/.kde/share/apps/karm/karmdata.txt
 /home/bozo/misc/irmeyc.txt
 /home/bozo/test-scripts/1.txt

如果COMMAND中包含{},则find将用所选文件的完整路径来替换"{}"。

find ~/ -name 'core*' -exec rm {} \;
# 从用户主目录中删除所有核心转储文件。
find /home/bozo/projects -mtime -1
#                               ^   注意减号标志!
#  列出所有在/home/bozo/projects目录树下且
#  在昨日(当日-1日)修改过的文件。
#
find /home/bozo/projects -mtime 1
#  和上面一样,但是 *恰巧* 在一天前修改过的文件。
#  mtime = 目标文件的最后修改时间
#  ctime = 上次状态更改时间 (通过“chmod”或其他方式)
#  atime = 上次访问时间

DIR=/home/bozo/junk_files
find "$DIR" -type f -atime +5 -exec rm {} \;
#                          ^           ^^
#  大括号是由"find"输出的路径名的占位符。
#
#  删除在"/home/bozo/junk_files"下
#  *至少* 5日内没有访问过(加号 ... +5)的文件。
#
#  "-type filetype", filetype取以下值分别代表
#  f = 常规文件
#  d = 目录
#  l = 符号链接,等
#
#  (‘find’命令man手册和info手册有着完整详尽的选项列表)。

notefind命令的-exec选项请不要与shell内建命令execarrow-up-right混淆。

样例 16-3. Badname, 消除当前目录中包含错误字符和空格arrow-up-right的文件名。

样例 16-4. 通过inode编号删除一个文件

不使用-exec选项的find命令同样有效。

您可以查看使用find命令的样例 16-30arrow-up-right样例 3-4arrow-up-right样例 11-10arrow-up-right。它的man手册arrow-up-right提供了关于这个复杂且强大的命令的更多细节。

xargs

这是将参数传递给命令的过滤器,同时也是一个用于组装命令本身的工具。它将数据流分解成足够小的块,以供过滤器和命令进行处理。可以将它视为backquotesarrow-up-right的强大替代品。在由于参数数量过多而导致的命令替换arrow-up-right失败的情况下,切换使用xargs通常有效。[1]arrow-up-right通常,xargs从标准输入(stdin)或者管道(pipe)中读取数据,但它也可以从文件输出中读取。

xargs的默认命令是echoarrow-up-right。这意味着通过管道输入到xargs可能会去除换行符和其他空格字符。

ls | xargs -p -l gzipgzipsarrow-up-right当前目录下的所有文件,在每次操作前均提示一下。

note请注意xargs命令按顺序处理传递给它的参数,一次一个

circle-info

一个有趣的xargs选项是-n NN,它将传递参数的数量限制为NN

ls | xargs -n 8 echo 该条命令以8列的形式列出在当前目录下的文件。

circle-info

另一个有用的选项是-0,结合find -print0 grep -lZ。这允许处理包含空格或引号的参数。

find / -type f -print0 | xargs -0 grep -liwZ GUI | xargs -0 rm -f

grep -rliwZ GUI / | xargs -0 rm -f*

以上两条命令都起到移除所有包含"GUI"的文件。(感谢 S.C.)

或者:

circle-info

xargs-P选项允许并行(parallel)运行进程。这能够提升多核CPU计算机中的执行速度。

样例 16-5. Logfile: 使用xargs来监视系统日志

find相同arrow-up-right,大括号对用作替换文本的占位符。

样例 16-6. 将当前目录下的文件复制到另一个目录

样例 16-7. 通过进程名杀死进程

样例 16-8. 使用xargs进行词频分析

expr

通用表达式计算器: 根据给定的表达式对参数进行连接和求值 (参数必须用空格分隔)。表达式可以是算术运算、比较运算、字符串运算或逻辑运算。

expr 3 + 5

返回8

expr 5 % 3

返回2

expr 1 / 0

返回错误信息,expr: division by zero

不允许非法算术运算。

expr 5 \* 3

返回15

expr的算术表达式中使用乘法运算符(*)时,必须对其进行转义。

y=`expr $y + 1`

将一个变量递增,与let y=y+1y=((y+1))等效。这是一个算数扩展arrow-up-right的例子。

z=`expr substr $string $position $length`

从$position开始,提取$length长度的子字符串。

样例 16-9. 使用 expr

note: (null)arrow-up-right 运算符可以替代match。举个例子,b=`expr $a : [0-9]`完全等价于上述列举的b=`expr match $a [0-9]`

上面的脚本解释了expr是如何使用转义括号 -- ( ... ) -- 分组运算符与正则表达式arrow-up-right解析一起使用来匹配字符串。以下是另一个 “现实生活”中的案例。

Perlarrow-up-rightsedarrow-up-right,和awkarrow-up-right具有更为优秀的字符串解析功能。脚本中简短的sed或者awk"子例程(subroutine)"(参见章节 36.2arrow-up-right)相比expr是更优的替代方案。

有关在字符串操作中使用expr的更多信息请参见章节 10.1arrow-up-right

注记

[1]arrow-up-right即使不是绝对需要xargs,它也可以加快涉及多个文件的批处理arrow-up-right指令的执行速度。

最后更新于