【问题标题】:I need to know what exactly this will do: (grep & xargs)我需要知道这到底会做什么:(grep & xargs)
【发布时间】:2013-01-01 10:52:57
【问题描述】:

下面是一行:

find /localdir/ | grep '[0-9']$ | xargs -i% cp % /tftpboot

我特别想知道 grep 究竟在这里寻找什么。
谁能帮我翻译一下?

我也对 xargs cmd 的外观感兴趣...

提前致谢。

【问题讨论】:

  • 你为什么不自己调查(搜索)?
  • 欢迎来到 Stack Overflow。请通过发布您的代码中的一些properly formatted 输出和所有相关错误消息来改进您的问题。此外,请确保包含一些您正在测试的样本。
  • 您是否复制/粘贴了该声明? bc grep 看起来不对。看起来其中一个单引号不合适。我想它应该是grep '[0-9]$',这将使 Eevee 在下面的答案正确。
  • 是的 - 我认为你是对的 - 我会调整它并检查结果 - 单引号的位置让我感到困惑 - 并导致我在这里问这个问题......谢谢反馈

标签: bash grep xargs


【解决方案1】:

[0-9] 表示从09 的任何字符。 $ 表示一行的结尾。所以你的grep 会找到任何以数字结尾的行(即文件名),xargs 会将它们分别复制到/tftpboot

当然,如果这些文件名中的任何一个包含空格,您会感到惊讶。您可以完全在 zsh 的 shell 中执行此操作(我认为在最新版本的 bash 中):

cp /localdir/**/*[0-9] /tftpboot

附录:如果你问的是有趣的引用,那工作,虽然它不是很人性化。

关键是你可以在shell中让带引号的字符串和不带引号的字符串紧挨着,它们会变成一个字符串; echo "fo"ob'ar' 将产生foobar

引用第一部分是因为[ 对于 bash 来说是特殊的。 ] 也很特殊,但由于 bash 从未见过特殊的(未引用的)[,因此它只留下了 ]$ 通常会替换一个变量,但后面什么都没有,所以 bash 也不管它。

实际传递给 grep 的字符串仍然是 [0-9]$

【讨论】:

  • +1 用于解释为什么它在引用错误的情况下仍然有效。我从没想过它会像写的那样工作。
猜你喜欢
  • 2014-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-23
  • 2012-02-08
  • 1970-01-01
相关资源
最近更新 更多