【问题标题】:shell, pipe a list of arguments one by one to command [duplicate]shell,将参数列表一个一个地传递给命令[重复]
【发布时间】:2017-01-27 09:52:14
【问题描述】:

我有一个列表参数需要一个一个地传递给另一个命令,因为该命令一次只接受一个参数,我可以使用任何 shell 管道吗?提前谢谢你。

例如,

$ ls -al | awk '{print $9}'

该命令将返回一个文件夹名称列表,然后我需要将这些名称作为参数发送给另一个命令,该命令仅接受每次执行的命令。

【问题讨论】:

标签: shell awk pipe command-line-arguments


【解决方案1】:

我建议使用find:

find . -mindepth 1 -maxdepth 1 -type d -exec your_command {} \;

这将为当前目录中除... 之外的任何文件夹调用your_command

【讨论】:

  • 这只会选择目录,这似乎是 OP 要求的。
  • 不,这似乎是对 OP 未完成的命令的诅咒。他说:... the command will return a list of folder names。这让我觉得your_command 可能只接受文件夹。
【解决方案2】:

我不明白 ls -al | awk ... 的类比。包含此代码示例有什么意义?

如果您有一个以空格分隔的参数列表,则默认情况下,使用 xargs 之类的实用程序命令会将每个参数一个接一个地提供给命令。您可以更改此默认行为,但您似乎不需要这样做。你可以使用xargs如下...

ls -al | awk '{print $9}' | xargs cat

...到catls -al命令输出的每个文件的内容。这有帮助吗?

应该注意ls 是一个瓷器命令而不是管道命令。换句话说,最好不要依赖ls 的输出作为命令管道。但是,像 find 这样的实用程序是一个管道命令,最好用作管道的一部分。

【讨论】:

  • 您可能希望/需要将-L 1 添加到您的xargs 命令,具体取决于您的第一个命令的输出格式。
  • 当然,cat .[!.]* * 效果更好。特别是,Awk 将处理任何包含空格的文件名,而普通通配符扩展不会。
  • xargs -L 1 cat,给我正确的输出,因为列表是行分隔的。非常感谢
  • 有趣的是,我以前从未听说过“瓷器”和“管道”命令。但至少在网上找到了一些信息。 :)
猜你喜欢
  • 1970-01-01
  • 2014-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
相关资源
最近更新 更多