【问题标题】:How to pipe grep into a program that uses a directory with only read permissions如何将 grep 通过管道传输到使用仅具有读取权限的目录的程序中
【发布时间】:2018-02-01 03:25:22
【问题描述】:

我有一个远程目录,除了读取文件之外我没有任何权限。

通常我会运行自定义的服务器范围脚本 dostuff,例如:

dostuff /path/to/images/*img

但是,这个目录意外地有两组不同的文件(每组文件数量相同),名称非常相似:

13-08_1_0XXX.img
13-08_1_0XXX_16YYYY.img

其中 Xs 从 1 到 900 递增,而 Ys 有一些任意数字。

例如,我可以使用正则表达式为第一组选择文件名:

find . | grep -E -w -o ".{12}.img"

所以我尝试了

find /path/to/images/ | grep -E -w -o ".{12}.img" | dostuff

但这不起作用。由于我无法移动文件或将它们复制到其他地方,我认为唯一的解决方案是弄清楚如何将它们作为两组单独的图像通过管道传输到脚本中。任何建议将不胜感激!

【问题讨论】:

  • 您的问题与移动文件或仅具有读取权限的目录有什么关系?您的正则表达式 ".{12}.img" 将匹配两组文件顺便说一句 - 您必须将其锚定 '^.{12}\.img$' 以获得不同的结果。
  • 嗨@EdMorton。我试图暗示这样一个事实,即如果我有文件权限,这将是微不足道的,试图阻止人们说“只是将这个正则表达式导入 mv”之类的事情。另外,你说得对,它同时匹配,但我使用了 -w 标志,试图只保留那些匹配整个“单词”的标志。

标签: linux shell grep find pipe


【解决方案1】:

假设您有GNU findutils,以下应该可以工作:

$ find /path/to/imagedir -regextype posix-extended \
  -regex '.*/13-08_1_0([1-9][0-9][0-8]|900)(.img|_16[0-9]+{4}.img)' -exec dosomestuff {} \;

find 中的-regextype posix-extended -regex 选项提供grep -E 类型功能。

{} 是找到的匹配模式。

-exec dosomestuff {} 会 _do_some_stuff_ 到匹配的 {}

【讨论】:

    【解决方案2】:

    您可以将find...|grep... 命令放在反引号中,并将其作为 dostuff 的参数。更好的是管道到find ... | grep ... | xargs dostuffxargs 将使用(stdin 流)文件名作为参数列表调用 dostuff。如果文件列表超过最大 bash 命令行长度 (32KB),xargs 会将其分解为对 dostuff 的多次调用。

    【讨论】:

    • 所以我尝试了:find /path/to/images/ | grep -E -w -o ".{12}.img" | xargs doit 和 'doit find /path/to/images/ | grep -E -w -o ".{12}.img"` (用反引号括起来,我不知道如何将其显示为代码并在 SO 的降价中转义),不幸的是两者都不起作用。我在那里做错了吗?
    • 不要使用doit $(find...),因为它会破坏文件名和/或大量文件和/或通配符等中的给定空格,请改为使用find ... | xargs doit。说“都不起作用”绝对不会给我们提供任何可以用来帮助您调试故障的信息。告诉我们它以什么方式失败 - 错误输出、无输出、错误消息、核心转储等。说“没有用”就像把你的车带到机械师那里,只是说“它不起作用”然后走开期待她解决这个问题。
    • @EdMorton 好点。我应该包括他们。 Mischa 建议的两种方法都能正确启动脚本,但会吐出:ls: cannot access 13-08_1_0794.img: No such file or directory,即使它确实存在。
    • 等等……什么? find /path 会发出像 /path/.../13-08_1_0794.img 这样的路径名,所以 doit 一定做了一些意想不到的事情。也许我们可以看到它是如何到达ls 的?
    猜你喜欢
    • 2020-01-12
    • 1970-01-01
    • 2017-06-04
    • 2011-08-09
    • 1970-01-01
    • 2014-08-07
    • 2023-03-08
    • 2010-11-01
    • 2012-06-11
    相关资源
    最近更新 更多