【shell】find -exec 命令
格式如下:
find dir -exec cmd \;
但是通常,后面的cmd命令需要处理find查询到的文件,所以需要把文件名传给cmd。这时,可以使用占位符{}来表示find到的文件名。
那么格式变为了:
find dir -exec cmd {} \;
上面的形式,shell会每一个find到的文件去执行一次cmd命令。如果想让find到的文件一次性执行完cmd命令,那么可以使用"+"号代替“\;”
find dir -exec cmd {} +
例子:
⇒ ls -l
total 32
drwxr-xr-x 5 miracle staff 170 11 23 2017 123
-rw-r--r-- 1 miracle staff 4 11 24 2017 a.txt
[email protected] 1 miracle staff 5 11 23 2017 b.txt
[email protected] 1 miracle staff 5 11 23 2017 c.txt
-rwxrwxrwx 1 miracle staff 106 11 23 2017 t.sh
然后:
⇒ find . -maxdepth 1 -type f -name "*.txt" -exec echo "hello" \;
hello
hello
hello
⇒ find . -maxdepth 1 -type f -name "*.txt" -exec echo {} \;
./a.txt
./b.txt
./c.txt
⇒ find . -maxdepth 1 -type f -name "*.txt" -exec echo {} +
./a.txt ./b.txt ./c.txt
这便是上面三种形式的例子。
另外再解释下-exec 后面的\;和+。
一个-exec只能执行一个命令,而且必须在命令后面加上终结符,终结符有两个,“;”和“+”。
其中“;”表示一个-exec 的 cmd命令结束。而”+“开始已经说过了。
为什么必须有终结符???
因为一个find后面可以有多个-exec cmd,所以必须要有终结符分割他们。
比如:
⇒ find . -maxdepth 1 -type f -name "*.txt" -exec echo {} \; -exec echo {} +
./a.txt
./b.txt
./c.txt
./a.txt ./b.txt ./c.txt
上面的命令就有两个-exec。如果,没有加终结符,第二个命令就无法和第一个相区别了,比如:
⇒ find . -maxdepth 1 -type f -name "*.txt" -exec echo {} -exec echo {} \;
./a.txt -exec echo ./a.txt
./b.txt -exec echo ./b.txt
./c.txt -exec echo ./c.txt
第二个-exec echo {} 成为了第一个echo的输出内容。
所以,每一个-exec 都需要终结符。
第二个问题,为什么要加“\”?
这是因为,“;”是shell的命令分隔符,如果只有“;”,那么这条命令就会被shell截断。
比如:
⇒ find . -maxdepth 1 -type f -name "*.txt" -exec echo {} ;
最终会报:find: -exec: no terminating ";" or "+"
因为shell发现了末尾的“;”,就把前面的当成了一个命令,但是,因为没有终结符,所以无法执行。所以要加一个转义符”\“,让shell知道这个”;“有特殊含义。
上一篇: 《晨间日记的奇迹》读书笔记
下一篇: 2010年《杨卫华谈微博架构》视频摘抄
推荐阅读
-
EXEC的使用与sp_executesql命令的区别
-
yii - curl命令行请求并不慢,但php curl_exec很慢,怎么回事?
-
php模拟ping命令(php exec函数的使用方法)_PHP
-
linux exec 和 shell_exec函数_PHP教程
-
python中执行shell命令的几个方法小结
-
保留shell命令的执行历史
-
PHP中exec函数和shell_exec函数的区别,execshell_exec_PHP教程
-
php exec()某个shell结果失误,原因是php中的 grep只能处理文本流,二进制流不行
-
shell脚本批量复制及执行命令的示例详解
-
Shell脚本中实现切换用户并执行命令操作