OSX下xargs分隔符问题

许多文档指定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

这个问题可以用以下方式解决,虽然空格非常常见但是空字符不常见,所以我们用空字符做分隔可以解决大部分问题你,所以上面的问题可以这样解决:

  1. -print0:告诉find命令,在输出文件名之后,跟上NULL字符,而不是换行符;
  2. -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

发表评论