在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理。通常情况下,xargs从管道或者stdin中读取数据,但是它也能够从文件的输出中读取数据。xargs的默认命令是echo,这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代。 xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令,下面是一些如何有效使用xargs 的实用例子。 find ~ -name ‘*.log' -print0 | xargs -0 rm -f 2. 获得/etc/ 下所有*.conf 结尾的文件列表,有几种不同的方法能得到相同的结果,下面的例子仅仅是示范怎么实用xargs ,在这个例子中实用 xargs将find 命令的输出传递给ls -l # find /etc -name "*.conf" | xargs ls –l 3. 假如你有一个文件包含了很多你希望下载的URL, 你能够使用xargs 下载所有链接 # cat url-list.txt | xargs wget –c 4. 查找所有的jpg 文件,并且压缩它 # find / -name *.jpg -type f -print | xargs tar -cvzf images.tar.gz 5. 拷贝所有的图片文件到一个外部的硬盘驱动 # ls *.jpg | xargs -n1 -i cp {} /external-hard-drive/directory EXAMPLES find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f find /tmp -depth -name core -type f -delete cut -d: -f1 < /etc/passwd | sort | xargs echo xargs sh -c 'emacs "$@" < /dev/tty' emacs 例如,下面的命令: 复制代码 代码如下: rm `find /path -type f` 如果path目录下文件过多就会因为“参数列表过长”而报错无法执行。但改用xargs以后,问题即获解决。 复制代码 代码如下: find /path -type f -print0 | xargs -0 rm 本例中xargs将find产生的长串文件列表拆散成多个子串,然后对每个子串调用rm。-print0表示输出以null分隔(-print使用换行);-0表示输入以null分隔。这样要比如下使用find命令效率高的多。 复制代码 代码如下: find /path -type f -exec rm '{}' \; xargs命令应该紧跟在管道操作符之后,它以标准输入作为主要的源数据流,并使用stdin并通过提供命令行参数来执行其他命令,例如: 复制代码 代码如下: command | xargs 实例应用1,将多行输入转换为单行输出: 复制代码 代码如下: amosli@amosli-pc:~/learn$ cat example.txt 1 2 3 4 5 6 7 8 amosli@amosli-pc:~/learn$ cat example.txt | xargs 1 2 3 4 5 6 7 8 实例应用2,将单行输入转换为多行输出: 复制代码 代码如下: amosli@amosli-pc:~/learn$ cat example.txt | xargs -n 2 1 2 3 4 5 6 7 8 空格是默认的定界符,-n 表示每行显示几个参数 还可以使用-d参数来分隔参数,如下: 复制代码 代码如下: amosli@amosli-pc:~/learn$ echo "splitXhiXamosliXsplit" | xargs -d "X" -n 1 split hi amosli split 实例应用3,读取stdin,将格式化参数传递给命令 复制代码 代码如下: #定义一个echo命令每次在输出参数后都加上# amosli@amosli-pc:~/learn$ cat cecho.sh echo $*'#' #需求1:输出多个参数 #需求2:一次性提供所有的命令参数 #针对需求1、2,使用xargs代替,先用vi建一个新文件args.txt,如下: 需求3,如何将参数嵌入到固定的命令行中?如下所示: 复制代码 代码如下: amosli@amosli-pc:~/learn$ sh cecho.sh -p args1 -1 -p args1 -1# amosli@amosli-pc:~/learn$ sh cecho.sh -p args2 -1 -p args2 -1# amosli@amosli-pc:~/learn$ sh cecho.sh -p args3 -1 -p args3 -1# 使用xargs的解决方案: 复制代码 代码如下: amosli@amosli-pc:~/learn$ cat args.txt | xargs -I {} sh cecho.sh -p {} -1 -p arg1 -1# -p arg2 -1# -p arg3 -1# #-I {}批定了替换字符串,字符串{}会被从stdin读取到的参数所替换,使用-I时,能循环按要求替换相应的参数 实例应用4,结合find使用xargs 前面已经举过例子,这里要注意的是文件名称定界符要以字符null来分隔输出,如下所示,否则可能会误删文件 复制代码 代码如下: amosli@amosli-pc:~/learn$ find . -type f -name "*test*.txt" -print0 | xargs -0 rm -f 其他: 复制代码 代码如下: cat file | ( while read arg; do cat $arg; done ) cat file | xargs -I {} cat {} |
请发表评论