xargs
本文最后更新于 2338 天前,其中的信息可能已经有所发展或是发生改变。

xargs是一条Unix和类Unix操作系统的常用命令。它的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题。
例如删除某个目录下的文件,可以这么做 find /path -type f -exec rm -f {} \; 如果文件过多,就可能出现 参数列表过长的错误,导致执行失败。
这个时候使用 xargs 就能比较好的解决问题 find /path -type f -print0 | xargs -0 rm。

xargs是通过标准输入或者是管道中的一段字符串来传递命令的参数列表, 中间会有个解析的参数的过程,然后调用相应的命令并执行。

用法:

xargs [-0prtx] [-E eof-str] [-e[eof-str]] [--eof[=eof-str]] [--null]
[-d delimiter] [--delimiter delimiter] [-I replace-str] [-i[replace-
str]] [--replace[=replace-str]] [-l[max-lines]] [-L max-lines]
[--max-lines[=max-lines]] [-n max-args] [--max-args=max-args] [-s max-
chars] [--max-chars=max-chars] [-P max-procs] [--max-procs=max-procs]
[--interactive] [--verbose] [--exit] [--no-run-if-empty]
[--arg-file=file] [--show-limits] [--version] [--help] [command
[initial-arguments]]

参数

      • -0 当sdtin含有特殊字元时候,将其当成一般字符,像空格等
      • -a file 从文件中读入作为sdtin
      • -e flag ,注意有的时候可能会是-E,flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止。
      • -p 当每次执行一个argument的时候询问一次用户。
      • -n num 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的。
      • -t 表示先打印命令,然后再执行。
      • -i 表示指定 {} 来接受参数
      • -I     同-i ,但是还可以指定其它符号接收参数,如:[]
      • -r no-run-if-empty 当xargs的输入为空的时候则停止xargs,不用再去执行了。
      • -s num 命令行的最好字符数,指的是xargs后面那个命令的最大命令行字符数。)
      • -L  num Use at most max-lines nonblank input lines per command line.-s是含有空格的。
      • -l  同-L
      • -d delim 分隔符,默认的xargs分隔符是回车,argument的分隔符是空格,这里修改的是xargs的分隔符
      • -x exit的意思,主要是配合-s使用。
      • -P 修改最大的进程数,默认是1,为0时候为as many as it can

使用实例:

实例1: 查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件

find . -type f -print | xargs file

实例2:在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中

find / -name "core" -print | xargs echo "" >/tmp/core.log

实例3:在当前目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限

find . -perm -7 -print | xargs chmod o-w

实例4:用grep命令在所有的普通文件中搜索hostname这个词

find . -type f -print | xargs grep "hostname"

如果不加xargs就是直接搜索包含hostname这个词的文件而不是包含这个内容的文件

实例6:批量重命名

ls | xargs -t -i mv {} {}.bak

实例7:find后执行xargs提示xargs: argument line too long解决方法:

find . -type f -atime +0 -print0 | xargs -0 -l1 -t rm -f

实例8:使用-i参数默认的前面输出用{}代替,-I参数可以指定其他代替字符,如例子中的[]

find . -name "file" | xargs -I [] cp [] ..

实例9:xargs的-p参数的使用

find . -name "*.log" | xargs -p -i mv {} ..

实例10:对于文件名有空格、换行符、特殊字符的,xargs 能很好的处理。

find /a -type f –print0 | xargs -0 rm
  • -0==–null:输入项,是以null字符结尾的,而不是以白空格(whitespace)结尾的
  • 且引号和反斜杠,都不是特殊字符 –> 每个输入的字符,都视为普通字符
  • 禁止掉文件结束符 –> 被视为别的参数
  • 当输入项可能包含白空格,引号,反斜杠等情况时,才适合用此参数
  • 使用find命令加上-print0时,所产生的输出,正好适合和此-0参数 -> 往往是用find带-print0时,加上此xargs -0,两者搭配使用

实例11:读取输入数据,重新格式化后输出

假设我们有一个文本文件,内容如下:

cat data.txt
a b c d e f g h
i j k l m n o p q
r s t u v w x y z

data.txt中的文件是换行显示的。

多行输入变成单行输出

cat data.txt |xargs
a b c d e f g h i j k l m n o p q r s t u v w x y z

-n 控制多行输出

cat data.txt |xargs -n4
a b c d
e f g h
i j k l
m n o p
q r s t
u v w x
y z

-d 指定分隔符

echo 'testAtestAtestAtest'|xargs -dA
test test test test

-d-n 一起使用

echo 'testAtestAtestAtest'|xargs -dA -n2
test test
test test

实例12:计算当前目录下文本文件中的行

file * | grep ASCII | cut -d":" -f1  | xargs wc -l
暂无评论

发送评论 编辑评论


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇