许多文档指定xargs使用-d表示分隔符,但是输入下面命令会报错:
➜ echo "nameXnameXnameXname" | xargs -dX -n2
xargs: illegal option -- d
usage: xargs [-0opt] [-E eofstr] [-I replstr [-R replacements]] [-J replstr]
[-L number] [-n number [-x]] [-P maxprocs] [-s size]
[utility [argument ...]]
原因是OSX下面的xargs不支持这个参数,他只默认支持空格和tab,如果你的参数中不幸存在空格就会导致xargs参数分隔错误。比如下面这个场景:
touch 'hello 01.css' 'hello 02.css'
# 命令
find . -name '*.css' | xargs -t ls -al
#输出
ls -al ./hello 01.css ./hello 02.css # 展开后的命令
ls: cannot access ./hello: No such file or directory
ls: cannot access 01.css: No such file or directory
ls: cannot access ./hello: No such file or directory
ls: cannot access 02.css: No such file or directory
这个问题可以用以下方式解决,虽然空格非常常见但是空字符不常见,所以我们用空字符做分隔可以解决大部分问题你,所以上面的问题可以这样解决:
-print0
:告诉find
命令,在输出文件名之后,跟上NULL
字符,而不是换行符;-0
:告诉xargs
,以NULL
作为参数分隔符;
find . -name '*.css' -print0 | xargs -0 -t ls -al
那么像上面例子,你非得用X作分隔符该怎么办呢?
我们可以在中间加一层awk,把X换成NULL字符。
echo "nameXnameXnameXname" | awk '{gsub("X", "\0", $0);print $0}'|xargs -0 -n2