【问题标题】:sed: can't read book/ : No such file or directorysed: can't read book/ : 没有这样的文件或目录
【发布时间】:2015-08-15 03:04:07
【问题描述】:

我在 Red Hat Enterprise Linux Server 6.6 版(圣地亚哥)上运行了以下一行代码

 grep -rl 'room' book/ | xargs sed -i 's/room/equipment/g'

我收到以下消息

sed: can't read book/
book/del_entry_ajax.php: No such file or directory

其实我可以跑

grep -rl 'room' book/del_entry_ajax.php | xargs sed -i 's/room/equipment/g'

成功然后再次运行第一个命令,我得到了

sed: can't read book/
: No such file or directory

为什么会这样,我该如何解决?

【问题讨论】:

  • 您的文件名称中是否包含“奇数”字符?您的脚本(如果在脚本中)是否有 DOS 行尾?如果您不关心时间戳更改(以及添加的工作,您可以在此处完全避免grep/xargs,只需在所有文件上运行sed。它不会对不更改的文件进行修改匹配(尽管它无论如何都会复制和替换它们)。
  • 写信:grep -rl 'room' book/ | tr \\n \\0 | xargs -0 sed -e 's/room/equipment/g' -i
  • 谢谢。我终于发现有一个名为 `\` 的文件会导致这个奇怪的错误。 (我什至不知道如何在stackoverflow中输入反斜杠作为代码格式)

标签: replace sed grep


【解决方案1】:

当他们给grep 一个查找文件的选项时,GNU 家伙真的搞砸了。有一个非常好的 UNIX 工具可以find 文件,它有一个非常明显的名称 - find。试试这个:

find book -type f -print0 | xargs -0 sed -i 's/room/equipment/g'

【讨论】:

  • 那么像find ... -exec sed -i ...一样直接使用-exec呢?
  • 当然,find 是 OP 正在寻找的,但我认为 grep -Hnr project_folder 非常有用。之后使用vi file +line_number 跳转到某一行非常方便。
  • 我个人总是避免使用-exec,因为它使琐碎的工作变得稍微简单一些,但是当工作变得更有趣时需要完全重写或过于复杂。
  • @hek2mgl 我会做find project_folder | xargs grep -Hn 这还不错。
  • @EdMorton 你指的是Eric Raymond's 17 UNIX rules? (在这种情况下,我猜是 Rule of Composition?)
猜你喜欢
  • 2018-08-14
  • 1970-01-01
  • 2017-03-07
  • 2014-05-08
  • 2017-08-27
  • 1970-01-01
  • 2021-06-24
  • 2015-02-20
相关资源
最近更新 更多