shell 中exec和xargs的用法和区别
今天摸鱼
1 2 3 4 5 6 7 8 9 10 11 12 |
# 常用的用法: find . -name "*.txt" -exec rm {} \; find . -name "*.txt" | xargs rm -exec 1.exec中参数是一个一个传递的,传一次参数执行一次rm; 2.文件名有空格等特殊字符可以正常处理。 -xargs 1.一次将参数传给命令,可以使用-n控制参数个数; 2.处理特殊文件名需要特殊处理: find . -name "*.txt" -print0 |xargs --null/-0 rm |
光说不练假把戏:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# 为了显示效果,这里先创建两个特殊文件 [root@tornado tmp] touch \"1\".python [root@tornado tmp] touch \ 2.python # 分别看看exec 和 xargs 执行的结果 [root@tornado tmp] find ./ -name "*.python" -exec echo {} \; ./"1".python ./ 2.python [root@tornado tmp] find ./ -name "*.python" | xargs echo ./1.python ./ 2.python # xargs 的执行结果在一行中看的不明显,加上-n 指定一下每次传入的参数为 1 个,如下 [root@tornado tmp] find ./ -name "*.python" | xargs -n 1 echo # 如果上面的echo 写成了 rm -rf 那么./目录会当场去世 ./1.python ./ 2.python # 可以看到,xargs得出的结果是以上3个,而不是我们想要的'./"1".python' 和 './ 2.python' # 下面特殊处理一下就可以正常处理了 [root@tornado tmp] find ./ -name "*.python" -print0 | xargs -n 1 --null echo ./"1".python ./ 2.python |
xargs几种常用的用法:
1 2 3 4 5 6 |
# 使用-i/-I 替换字符 [root@tornado tmp] find ./ -name "*.python" -print0 | xargs -0 -i cp {} {}.bak # -I可以指定自己喜欢的字符 [root@tornado tmp] find ./ -name "*.python" -print0 | xargs -0 -I [] cp [] [].old # -t 可以先打印执行的命令之后再执行 # -p 会在执行前询问用户是否确认操作 |
摸鱼完成。