find
-exec COMMAND \;
在每一个find匹配到的文件执行COMMAND命令. 命令序列以;结束(“;”是转移以保证shell传递到find命令中的字符不会被解释为其他的特殊字符).
bash$ find ~/ -name '*.txt'
/home/liudezhi/.kde/share/apps/karm/karmdata.txt
/home/liudezhi/misc/irmeyc.txt
/home/liudezhi/test-scripts/1.txt
如果COMMAND中包含{},那么find命令将会用所有匹配文件的路径名来替换”{}”.
find ~/ -name 'core*' -exec rm {} \;
# 从用户的home目录中删除所有的 core dump文件.
xargs
这是给命令传递参数的一个过滤器, 也是组合多个命令的一个工具.它把一个数据流分割为一些足够小的块, 以方便过滤器和命令进行处理.由此这个命令也是后置引用的一个强有力的替换. 当在一般情况下使用过多参数的命令替换都会产生失败的现象, 这时候使用xargs命令来替换, 一般都能成功.一般的, xargs从 stdin 或者管道中读取数据, 但是它也能够从文件的输出中读取数据.
xargs的默认命令是echo. 这意味着通过管道传递给xargs的输入将会包含换行和空白, 不过通过xargs的处理, 换行和空白将被空格取代.
bash$ ls -l
total 0
-rw-rw-r-- 1 liudezhi liudezhi 0 Aug 18 18:11 file1
-rw-rw-r-- 1 liudezhi liudezhi 0 Aug 18 18:11 file2
bash$ ls -l | xargs
total 0 -rw-rw-r-- 1 liudezhi liudezhi 0 Aug 18 18:11 file1 -rw-rw-r-- 1 liudezhi liudezhi 0 Aug 18 18:11 file2
bash$ find ~/mail -type f | xargs grep "Linux"
./misc:User-Agent: slrn/0.9.8.1 (Linux)
...
ls | xargs -p -l gzip 使用gzips压缩当前目录下的每个文件, 每次压缩一个, 并且在每次压缩前都提示用户.
*一个有趣的xargs选项是-n NN, NN用来限制每次传递进来的参数的个数.
*一个有用的选项是 -0 , 使用find -print0grep -lZ这两种组合方式. 这允许处理包含空白或引号的参数.
find / -type f -print0 | xargs -O grep -liwz GUI | xargs -O rm -f
grep -rliwz GUI / | xargs -O rm -f
上面两行都可以用来删除任何包含”GUI”的文件.
expr
通用求值表达式: 通过给定的操作(参数必须以空格分开)连接参数, 并对参数求值. 可以使算术操作, 比较操作, 字符串操作或者是逻辑操作.
expr 3 + 5 # return 8
expr 5 % 3 # return 2
expr 1 / 0 # return expr: 除以零.(不允许非法的算术操作.)
expr 5 \* 3 # return 15(*在算术表达式expr中使用乘法操作时, 乘法符号必须被转义.)
expr `expr 5 * 3` # expr:syntax error.
y=`expr $y + 1` # 增加变量的值, 与 lety=y+1 和 y=$(($y+1)) 的效果相同.
z=`expr substr $string $position $length` # 在位置$position上提取$length长度的子串.
: 操作可以替换match命令. 比如,b=`expr $a : [0-9]*`与b=`expr match $a [0-9]*`完全等价.
Perl, sed, 和awk是更强大的字符串分析工具. 在脚本中加入一段比较短的sed或者awk”子程序”, 比使用expr更有吸引力.