可以更改xargs的默认分隔符吗?

时间:2013-10-06 01:39:50

标签: command-line whitespace xargs

我想要以下行为,而不必使用选项明确指定它:

xargs -d '\n'

与大多数命令不同,您不能只使用别名,因为管道无法识别别名(作为旁注,为什么这样设计?)。我也尝试创建自己的~/bin/xargs脚本,但我认为这并不像在脚本中读取“$ @”那样简单。

默认情况下如何使分隔符成为换行符的任何建议?当我在路径中有空格时(我使用find ... -print0 | xargs -0有其他不需要的效果),我不想得到一堆错误。

更新

我的shell脚本尝试是这样的:

/usr/local/bin/xargs -d '\n' "$@"

3 个答案:

答案 0 :(得分:6)

我在命令行上测试了xargs -d '\n' -n1 echo,它按宣传的方式工作;将输入分成单行并回显它。

在变量赋值期间,有关shell转义的假设可能会被您所咬。例如,如果您的shell脚本与此类似:

  

CMD =“xargs -d'\ n'-n1 echo”
  cat inputfile | $ CMD

然后发生错误,因为整个CMD字符串周围的双引号保留了单引号和分隔符中的反斜杠。

如果您将xargs命令括在引号内,则可以将其更改为以下内容(无单引号)

  

CMD =“xargs -d \ n -n1 echo”
  cat inputfile | $ CMD

它可能会根据您的需要发挥作用。

在CentOS 6.4上测试,xargs版本4.4.2

答案 1 :(得分:1)

我的~/bin中有PATH并保留了一个简短的脚本,我的系统上的所有shell都可以访问我最喜欢的默认值(在不同的时间我使用Dash,Bash和Fish)。这很小:

!/usr/bin/env sh
exec xargs -rd\\n "$@"

该脚本名为x,以避免与期望标准xargs默认值的脚本冲突。如果您尝试替换我自己不推荐的xargs,请确保您的~/bin在您的路径中显示的位置高于系统xargswhich -a xargs告诉我系统中xargs唯一存在/usr/bin/xargs因此我知道我的主目录/home/stephen/bin必须出现在它之前:

$ echo "$PATH"
/home/stephen/bin:...:/usr/bin:...

无论哪种方式,作为所有程序都可以访问的脚本,这意味着您可以执行find|x grepsh -c 'x ...'之类的操作。

如果你使用Bash并且喜欢别名,你也可以使用:

alias x=xargs -rd\\n\ # \n delim, don't run on empty in, + alias expansion

请注意别名扩展的尾随空格。这可以让你链接别名。例如,如果除上述别名之外我有一个名为g的grep别名,则以下内容可行:

# extended regex, skip binaries, devices, sockets, & dirs, colored, & line
# -buffered. use a non-canonical alias instead of GREP_OPTIONS which may wreck
# assuming scripts
alias g='grep -EID skip -d skip --color=auto --line-buffered'

$ find|x g foo

x / xargs脚本方法无法有效地完成此操作。

由于我在shell之间切换并且主要使用一台PC,因此我需要将少量别名作为~/bin中的单独脚本和帮助脚本中的shell不可知别名~/.sh_aliases保留,其源自~/.shrc~/.bashrc~/.config/fish/config.fish因为它们都支持类似Bash的别名语法。如果我经常在多台PC上工作,我可能会尝试将它们合并到~/.bashrc中。

答案 2 :(得分:1)

如果您的xargs版本不支持设置其他分隔符(例如2011 FreeBSD服务器上的分隔符...),则可以使用tr将分隔符变成{{ 1}}可以使用。如果您的输入包含xargs认为是定界符(例如空格)的字符,或者您可以简单地将定界符转换为xargs / NULL,则可能需要在前后使用一些翻译。将0x0参数传递给-0

这里是一个使用xargs在$ PATH中查找可能是可能使用的shell的文件的示例(我在这里的原因,然后我想出了另一个答案):
xargs