【问题标题】:sed hanging with no results but rename workssed 挂起但没有结果但重命名有效
【发布时间】:2017-01-25 04:02:15
【问题描述】:

find /$HOME/Desktop -name "*.dpx" -exec sed -i "" 's/Exile1/ExileR1/' {} \;

只是挂起没有结果。我不清楚可能是什么问题。

布欧特,

find /$HOME/Desktop -name "*.dpx" -exec rename 's/Exile1/ExileR1/' {} \;

工作正常。

为什么????

我在 MacOSX 上。

【问题讨论】:

  • Sed 似乎认为您的命令是 /s/Exi... 而不是 s/Exil... - 您是否复制粘贴了正确的命令?
  • 啊,解决了。 s/Exil... 只是挂起,没有任何反应......
  • 这两个命令尝试做不同的事情。 Sed 查看文件的 content 并更改 contentrename 查看文件的 name 并更改 name。你想要哪一个? (见mklement0's answer。)
  • 致那些想知道-i ""-i 的人。 -i "" 确实是 BSD sed 所必需的,它是 macOS 上使用的实现(您可以阅读更多关于它的信息 here)。

标签: macos sed rename


【解决方案1】:

鉴于您将失败的sed 命令与rename 进行对比,看起来您正在尝试重命名文件,而sed 命令将执行字符串替换在您传递的文件的内容中-i 选项然后将修改后的输入写回输入文件(松散地说)。

sed 不能直接重命名文件,但您可以将其用作辅助 命令来构造一个新文件名,然后传递给mv

find "$HOME/Desktop" -name "*.dpx" -print0 | 
 while IFS= read -d '' -r file; do
   echo mv "$file"' "$(sed 's/Exile1/ExileR1/' <<<"$file")"
 done

删除 echo 以执行实际重命名。

【讨论】:

  • 谢谢@mklement0 我注意到运行 sed 命令确实改变了我文件的校验和。 DPX 是图像文件,所以我不清楚 sed 会做什么来更改校验和......它不会改变文件的十六进制,只是文本内容(如果存在),对吧?
  • 是的,your sed 命令会更改文件的内容,即使没有发生实际替换。至少,BSD sed 将在您的内容后面附加一个 \n。但听起来您只是想重命名文件,而不是更改它们的内容,对吧?
  • 我只是想重命名,多亏了您的建议,我才通过重命名做到了这一点。一旦我看到校验和发生了变化,我就是不明白 sed 在我的命令中实际做了什么。如果内容只是一个图像,那么 \n 被添加到十六进制? @mklement0
  • BSD sed 总是在其输出中添加一个尾随 \n,即使输入没有,所以它从根本上不适合编辑 binary 文件 - GNU sed 没有这个问题。
【解决方案2】:

我没有任何 .dpx 文件,但尝试添加 -e 以阐明搜索脚本。像这样……

find /$HOME/Desktop -name "*.dpx" -exec sed -i "" -e 's/Exile1/ExileR1/' {} \;

【讨论】:

  • 请不要发布这样的快速提示作为答案 - 请改用评论。在这里使用-e 没有区别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-22
  • 1970-01-01
  • 2015-10-09
  • 2016-10-06
  • 2019-04-20
  • 2021-08-14
相关资源
最近更新 更多