make 命令_Linux下不能忽视的xargs命令

本文详细介绍了Linux中的xargs命令,它常与find、grep等命令结合使用,将标准输入转换为命令行参数。通过示例展示了如何删除特定文件、创建目录以及搜索包含特定字符串的文件。xargs的选项如-d用于指定分隔符,-L用于指定每次传递的输入行数。掌握xargs能更高效地进行文件管理和操作。
摘要由CSDN通过智能技术生成

Linux xargs命令在实际开发中很有用,用于从标准输入构建和执行命令行Linux命令。按字符切割,字节位置切割。当与find和grep等其他命令结合使用时,传递参数的一个过滤器。下面我们来了解xargs用法。

如何使用xargs

命令格式:

somecommand |xargs -item  command

真正执行的命令,紧跟在xargs后面,接受xargs传来的参数。xargs的作用在于,大多数命令(比如rm、mkdir、ls)与管道一起使用时,都需要xargs将标准输入转为命令行参数。

要通过名称查找单个文件,请将-name选项与find一起传递给您要查找的文件名。

#include 
#include 
#include 

#define  DELETE_FILE "find /tmp/test/ -name \"*txt\" |xargs rm -f"

/* 创建shell执行指令 */
int make_shell_command(const char* command){
    FILE *fp = NULL;

    if(command == NULL)
    {
        printf("make_shell_command param error\n");
        return -1;
    }

    if((fp = popen(command,"r")) == NULL)
    {
        printf("popen error:%s",strerror(errno));
        return -1;
    }

    pclose(fp);
    return 1;
}

int main(int argc, char *argv[]){

    if(make_shell_command(DELETE_FILE) 0)
    {
        printf("delete file failed");
        return -1;
    }

    printf("done \n");

    return 0;
}

输出结果

068c2fac8971ed25015b7f1ac74a02ed.png

我们发现/tmp/test目录下文件被删除了。find并xargs可以一起使用以匹配某些属性的文件。在以下示例中,在/tmp/test文件夹中找到了txt文件,然后将其通过管道传输到xargs命令,该rm命令在每个文件上运行该命令并将其删除。

我们来看看另一个例子,将标准输入通过管道传递给xargs,并mkdir为每个参数运行命令,从而创建文件夹。

#include 
#include 
#include 
#include 
#include 

#define  CREATE_DIRECTORY "echo \"/tmp/aaa/ /tmp/bbb/ /tmp/ccc/ \" |xargs mkdir"

using namespace std;

int main(int argc, char *argv[]){
    ostringstream  cmd;
    cmd <
    string cmdStr = cmd.str();
    system(cmdStr.c_str());

    printf("done \n");
    return 0;
}

编译运行

0c00eec19a8c5a6a32919a54a3cb7e41.png

xargs后面的命令默认是echo。xargs等价于 xargs echo  ,大多数时候,xargs命令都是跟管道一起使用的。

find 、xargs、 grep命令结合使用

find命令找出所有.log文件以后,对每个文件搜索一次是否包含字符串error。

#include 
#include 
#include 

#define  FIND_TXT_FILE "/home/minger/"

int main(int argc, char *argv[]){

    char szRmCmd[128]={0};
    snprintf(szRmCmd,sizeof(szRmCmd),"find %s -name \"*.txt\" | xargs grep \"error\"",FIND_TXT_FILE);
    system(szRmCmd);

    printf("done \n");

    return 0;
}

编译输出:61f2e8f7eba017d0cae61ef9a820ba64.png

xargs的一些常用的选项

-d选项

默认情况下xargs将其标准输入中的内容以空白(包括空格、Tab、回车换行等)分割成多个之后当作命令行参数传递给其后面的命令,并运行之,我们可以使用 -d 命令指定分隔符。

21a74b1a698034b442702ea59ed759fc.png

默认情况下以空白分割,那么AAA@BBB@CCC这个字符串中没有空白。

-E  eofstr

使用eofstr作为逻辑文件结尾字符串。如果未指定-E,则不确定逻辑文件结尾字符串是字符(’_’),还是禁用文件结尾字符串功能。

当eofstr为空字符串时,应禁用逻辑文件结尾字符串功能,并且应按字面意义使用字符。

下面的命令将带括号的命令的输出(减去字符)组合到一行上,然后将其附加到文件日志中。假定“ $ 0 $ *”的扩展名不包含任何或字符。

(logname; date; printf “’%s’\n” “$0 $*”) | xargs -E “” >>log

658818e24b1d99d2a1baf99a5369b080.png

在以下命令中,询问用户要归档当前目录中的哪些文件(不包括点文件)。这些文件被归档到arch中;

ls | xargs -E “” -p -L 1 ar -r arch

204471e3bb08dcc540527fb626322b78.png

-L 选项

使用xargs提供的-L命令行选项来完成查找,来看看个例子。

xargs -L 1 find -name
“*.txt”

aac14f9a99e73c7f4bb1db2a7da18b86.png

-L命令行选项需要许多其它把作为非空行应作为输入在同一时间被传递到该命令的最大数量。因此,在我们的例子中,该值将为1,因为我们希望一次传递一条输入线作为输入来查找。

总结

xargs实用程序应构造一个命令行,该命令行由实用程序和指定的参数操作数组成,后跟从标准输入中按顺序读取的,与选项指定的长度和数量限制相符的参数。xargs命令还以命令行选项的形式提供了许多其他功能,更多使用可以参考man xargs

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值