16.2 复杂命令
高级用户需要掌握的命令
find
-exec COMMAND ;
对find匹配的每个文件执行COMMAND。命令序列以半角分号(;)终止(其中分号需要进行转义以确保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手册有着完整详尽的选项列表)。
find命令的
-exec选项请不要与shell内建命令exec混淆。
样例 16-3. Badname, 消除当前目录中包含错误字符和空格的文件名。
样例 16-4. 通过inode编号删除一个文件
不使用-exec选项的find命令同样有效。
您可以查看使用find命令的样例 16-30,样例 3-4和样例 11-10。它的man手册提供了关于这个复杂且强大的命令的更多细节。
xargs
这是将参数传递给命令的过滤器,同时也是一个用于组装命令本身的工具。它将数据流分解成足够小的块,以供过滤器和命令进行处理。可以将它视为backquotes的强大替代品。在由于参数数量过多而导致的命令替换失败的情况下,切换使用xargs通常有效。[1]通常,xargs从标准输入(stdin)或者管道(pipe)中读取数据,但它也可以从文件输出中读取。
xargs的默认命令是echo。这意味着通过管道输入到xargs可能会去除换行符和其他空格字符。
ls | xargs -p -l gzipgzips当前目录下的所有文件,在每次操作前均提示一下。
请注意xargs命令按顺序处理传递给它的参数,一次一个。
样例 16-5. Logfile: 使用xargs来监视系统日志
与find相同,大括号对用作替换文本的占位符。
样例 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+1和y=((y+1))等效。这是一个算数扩展的例子。
z=`expr substr $string $position $length`
从$position开始,提取$length长度的子字符串。
样例 16-9. 使用 expr
: (null) 运算符可以替代match。举个例子,b=`expr $a : [0-9]`完全等价于上述列举的b=`expr match $a [0-9]`。
上面的脚本解释了expr是如何使用转义括号 -- ( ... ) -- 分组运算符与正则表达式解析一起使用来匹配字符串。以下是另一个 “现实生活”中的案例。
Perl,sed,和awk具有更为优秀的字符串解析功能。脚本中简短的sed或者awk"子例程(subroutine)"(参见章节 36.2)相比expr是更优的替代方案。
有关在字符串操作中使用expr的更多信息请参见章节 10.1。
注记
最后更新于