【问题标题】:What's the Mac OS X way to execute this command执行此命令的 Mac OS X 方式是什么
【发布时间】:2018-06-29 23:33:23
【问题描述】:

我正在尝试执行这个命令:

find ./ -type f -readable -writable -exec sed -i "s/A/B/g" {} \;

我收到了这个错误:

find: -readable: unknown primary or operator

我正在尝试广泛查找和替换名称为“A”到“B”的任何内容,这将适用于文件名和文件内的文本。

在 Mac 终端上执行此操作的最佳方式是什么?

【问题讨论】:

  • 当您在终端时,使用man find 阅读该命令的手册页。祝你好运。

标签: macos ubuntu sed terminal


【解决方案1】:

find 的 BSD 版本没有 -readable-writable 原色,但您可以使用 test 命令伪造它们:

find ./ -type f -exec test -r {} -a -w {} \; -exec sed -i "" "s/A/B/g" {} \;

这里可能存在一个问题,test 的语法可能与三个以上的参数有歧义,因此像这样的复合测试表达式可能会被错误解析。我认为以./ 开头的路径不会有问题,但如果您担心,可以使用两个单独的测试:

find ./ -type f -exec test -r {} \; -exec -w {} \; -exec sed -i "" "s/A/B/g" {} \;

另外,请注意,我在-i 之后向sed 添加了一个空参数。这是另一个 BSD-vs-GNU 的事情。 sed 的 BSD 版本需要 -i 选项的参数(用于备份的扩展名),因此为了避免进行备份,您必须明确提供空白。另一方面,GNU 版本会被sed -i .bak 混淆,因为它需要将-i 的参数直接附加到它(sed -i.bak)。哇哦。

【讨论】:

  • 我试过了,我得到“sed:RE错误:非法字节序列”
  • @GabrielBalza 我认为这意味着它正在尝试对非文本文件进行操作,并遇到无效的 UTF-8 文件内容(或您当前语言环境所说的任何内容)。您可以添加-exec echo {} \; before -exec sed 部分,使其在编辑之前打印文件名,并查看哪个造成了问题。
猜你喜欢
  • 2015-05-23
  • 2011-12-11
  • 1970-01-01
  • 2013-12-02
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多