linux之xargs使用技巧

图片alt

Unix命令都带有参数,有些命令可以接受”标准输入(stdin)”作为参数。而管道命令(|)的作用,是将左侧命令的标准输出转换为标准输入,提供给右侧命令作为参数使用。虽然,在 Unix 系统中大多数命令都不接受标准输入作为参数,只能直接在命令行输入参数,这导致无法用管道命令传递参数。比如,我们日常使用的 echo 命令就不接受管道传参。而 xargs 命令的作用,就是将标准输入转为命令行参数。

xargs基本用法

  1. # grep命令接受管道传参
  2. > cat /etc/passwd | grep root
  3. # echo命令不接受管道传参
  4. > echo "hello rumenz" | echo
  5. # 将标准输入转为命令行参数
  6. > echo "hello rumenz" | xargs echo
  7. hello rumenz

需要注意的是 xargs 后面的默认跟的是 echo 命令,所以它可以单独使用。

-d指定分隔符,默认使用空格分割

  1. # 空格作为分隔符
  2. $ echo "one two three" | xargs mkdir
  3. # 指定制表符\t作为分隔符
  4. $ echo -e "a\tb\tc" | xargs -d "\t" echo
  5. a b c

-p 打印出要执行的命令并询问用户是否要执行

  1. > echo 'one two three' | xargs -p touch
  2. touch one tow three ?...y

-0 表示用 null 当作分隔符

find命令有一个特别的参数-print0,用来指定输出的文件列表以null作为分隔符

  1. > find /path -type f -print0 | xargs -0 rm

指定多少行作为一个命令行参数

  1. > xargs -L 1 find -name
  2. "*.txt"
  3. ./1.txt
  4. ./rumenz.txt
  5. ./2.txt
  6. ./3.txt

-n指定每次将多少项作为命令行参数

  1. > echo {0..9} | xargs -n 2 echo

指定每一项命令行参数的替代字符串

  1. # 将命令行参数传给多个命令
  2. > cat foo.txt
  3. one
  4. two
  5. three
  6. > cat foo.txt | xargs -I {} sh -c 'echo {}; mkdir {}'
  7. one
  8. two
  9. three
  10. > ls
  11. one two three

将多行输入转换成单行输入

  1. > cat rumenz.txt
  2. 1 2 3 4
  3. 5 6
  4. 7 8 9
  5. > cat rumenz.txt | xargs
  6. 1 2 3 4 5 6 7 8 9

将单行文本转换成多行

  1. > cat rumenz.txt
  2. 1 2 3 4 5 6 7 8 9
  3. > cat rumenz.txt | xargs -n 3
  4. 1 2 3
  5. 4 5 6
  6. 7 8 9

指定分隔符进行行转换

  1. > echo "rumenz:123:rumenz:456:rumenz:789" | xargs -d : -n 2
  2. rumenz 123
  3. rumenz 456
  4. rumenz 789

xargs和find结合

  1. > find . -type f -name "*.txt" -print | xargs rm -f

批量下载文件

  1. > cat rumenz.txt | xargs wget -c

返回笔记列表
入门小站