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;
}
输出结果
我们发现/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;
}
编译运行
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;
}
编译输出:
xargs的一些常用的选项
-d选项
默认情况下xargs将其标准输入中的内容以空白(包括空格、Tab、回车换行等)分割成多个之后当作命令行参数传递给其后面的命令,并运行之,我们可以使用 -d 命令指定分隔符。
默认情况下以空白分割,那么AAA@BBB@CCC这个字符串中没有空白。
-E eofstr
使用eofstr作为逻辑文件结尾字符串。如果未指定-E,则不确定逻辑文件结尾字符串是字符(’_’),还是禁用文件结尾字符串功能。
当eofstr为空字符串时,应禁用逻辑文件结尾字符串功能,并且应按字面意义使用字符。
下面的命令将带括号的命令的输出(减去字符)组合到一行上,然后将其附加到文件日志中。假定“ $ 0 $ *”的扩展名不包含任何或字符。
(logname; date; printf “’%s’\n” “$0 $*”) | xargs -E “” >>log
在以下命令中,询问用户要归档当前目录中的哪些文件(不包括点文件)。这些文件被归档到arch中;
ls | xargs -E “” -p -L 1 ar -r arch
-L 选项
使用xargs提供的-L命令行选项来完成查找,来看看个例子。
xargs -L 1 find -name
“*.txt”
-L命令行选项需要许多其它把作为非空行应作为输入在同一时间被传递到该命令的最大数量。因此,在我们的例子中,该值将为1,因为我们希望一次传递一条输入线作为输入来查找。
总结
xargs实用程序应构造一个命令行,该命令行由实用程序和指定的参数操作数组成,后跟从标准输入中按顺序读取的,与选项指定的长度和数量限制相符的参数。xargs命令还以命令行选项的形式提供了许多其他功能,更多使用可以参考man xargs