zoukankan      html  css  js  c++  java
  • 【转】exec xargs的区别 另附eval命令介绍

    -exec:  对符合条件的文件执行所给的Linux 命令,执行exec后面的shell脚本。脚本中,{}表示命令的参数即为所找到的文件,以;表示comman命令的结束。是转义符,因为分号在命令中还有它用途,所以就用一个来限定表示这是一个分号而不是表示其它意思。
     
    -ok: 和-exec的作用相同,格式也一样,只不过以一种更为安全的模式来执行该参数所给出的shell脚本。对于被执行脚本的对象,系统都会给出提示,让用户来确定是否执行。
     
    xargs 要结合管道来完成
    格式:find [option] express |xargs command
     
    我们看看exec和xargs都是如何传参数的。首先看看exec: 
    0$ ls 
    index.skin1 skin1 
    0$ find -type f -exec echo file {} ; 
    file ./skin1 
    file ./index.skin1 
    
    很明显,exec是对每个找到的文件执行一次命令,除非这单个的文件名超过了几k,否则不会出现命令行超长出错的问题。 
     
    我们再看看xargs: 
    0$ ls 
    index.skin1 skin1 
    0$ find -type f | xargs echo
    ./skin1 ./index.skin1 
    
    0$ find . -name XXX | xargs cp -R --target-directory=/tmp
    0$ find . -name XXX -exec cp -R {} /tmp ;
    

    这里大家看到,xargs是把所有找到的文件名一股脑的转给命令。当文件很多时,这些文件名组合成的命令行参数很容易超长,导致命令出错。同时,这也是 find | xargs 这种组合在处理有空格字符的文件名时之所以出错的原因:这时执行的命令已经不知道这些空格那些是分割符、那些是文件名中所包含的!而用exec则不会有这两个问题。下面是一个演示: 

    0$ mkdir TEST 
    0$ cd TEST 
    /home/xyb/TEST 
    0$ touch "file a" 
    0$ touch "file b" 
    0$ ls 
    file a file b 
    0$ find -type f | xargs rm 
    rm: 无法删除‘./file’: 没有那个文件或目录 
    rm: 无法删除‘a’: 没有那个文件或目录 
    rm: 无法删除‘./file’: 没有那个文件或目录 
    rm: 无法删除‘b’: 没有那个文件或目录 
    0$ ls 
    file a file b 
    0$ find -type f -exec rm {} ; 
    0$ ls 
    0$ 
    
    从这里可以看出exec的缺点是每处理一个文件/目录,都要启动一次命令,效率不好; 格式麻烦,必须用 {} 做文件的代位符,必须用 ; 作为命令的结束符,书写不便。而xargs不能操作文件名有空格的文件。所以如果要使用的命令支持一次处理多个文件,并且也知道这些文件里没有带空格的、 文件数目也不大,那么使用 xargs比较方便; 否则,就要用 exec了。
     
    另:

    eval 
        命令格式:eval args
        命令eval的功能是將参数(args)读入 C shell 中,然后在加以执行。例如:

    0$ set vcom = 'ls -l ; date'
    0$ $vcom
    ; not found
     date not found

    vcom 是 'ls -l ; date'。当我们来执行“$vocm”,会出现错误信息“; not found”及“date not found”。原因是 C shell 在语法解析中无法理解特殊符号所造成的。符号“;”和命令 date 被理解成是命令 ls -l 后的“文件名称”。所以才会有“not found”。命令eval 便是用来解决这种情況:

    0$ eval $vcom
    total 1
    -r--r--r-- 1 akira 1296 Oct 12 07:29 search.c
    Tue Oct 18 12:13:53 CST 1994

    其实在作法上使用命令 eval 便相当于以下的用法:

    0$ echo $vcom | csh
    total 1
    r--r--r-- 1 akira 1296 Oct 12 07:29 search.c
    Tue Oct 18 12:13:54 CST 1994

    如果你是在 C shell 下,你也可使用以下的方式:

    /bin/csh << EOF
    $vcom
    EOF
    

    另外在使用命令 eval 上也有技巧,看一互換的技巧:

    0$ set a = '$b'
    0$ set b = 'swapping'
    0$ echo $a
    $b
    0$ eval echo $a
    swapping
  • 相关阅读:
    《Machine Learning in Action》—— 白话贝叶斯,“恰瓜群众”应该恰好瓜还是恰坏瓜
    《Machine Learning in Action》—— 女同学问Taoye,KNN应该怎么玩才能通关
    《Machine Learning in Action》—— Taoye给你讲讲决策树到底是支什么“鬼”
    深度学习炼丹术 —— Taoye不讲码德,又水文了,居然写感知器这么简单的内容
    《Machine Learning in Action》—— 浅谈线性回归的那些事
    《Machine Learning in Action》—— 懂的都懂,不懂的也能懂。非线性支持向量机
    《Machine Learning in Action》—— hao朋友,快来玩啊,决策树呦
    《Machine Learning in Action》—— 剖析支持向量机,优化SMO
    《Machine Learning in Action》—— 剖析支持向量机,单手狂撕线性SVM
    JVM 字节码指令
  • 原文地址:https://www.cnblogs.com/sunada2005/p/3615790.html
Copyright © 2011-2022 走看看