如何在Mac OSX上使用Zsh shell和`sed`命令重命名文件

时间:2013-09-27 13:31:39

标签: macos shell sed zsh

我的桌面上有一个名为“Images”的文件夹,该文件夹中有3个图像...

File-A-B.gif
File-C-D.gif
File-E-F.gif

...我想在命令行上重命名文件,以便删除第二个连字符/破折号。所以结果就是这样命名的文件......

File-AB.gif
File-CD.gif
File-EF.gif

...我正在使用相互传递的命令组合,但没有太多运气让他们工作。

最初我有ls File-* | sed 's/\(File-[^-]\)-\(.+\)/mv & \1\2/' | sh

此命令的细分是......

  • 列出所有以File-
  • 开头的文件
  • 将结果传递到sed
  • 我们将使用sed来捕获名称的不同部分
  • 查看第一个文件,我们会捕获File-AB.gif
  • sed然后我们用移动命令替换匹配的文件名,并有效地告诉它将原始文件重命名为由我们捕获的两个数据组成的文件
  • 然后我们将该命令传递给sh

我收到的初始错误是权限错误。我不确定为什么我对文件进行“读写”访问。

要解决此问题,我chmod 777每个文件。

然后导致新的错误cannot execute binary file

要解决该错误,我看到了这篇文章:http://blog.mpdaugherty.com/2010/05/27/difference-with-sed-in-place-editing-on-mac-os-x-vs-linux/建议添加一对额外的单引号。其工作原因(显然)是因为sed会出错,因为它不知道要使用哪个文件扩展名,但是放一个空字符串会中断该错误(在旁注上:我的理解是你还需要使用-i标志 - 我没有使用它 - 但这样做会导致不同的错误,所以我废弃了它并且只使用单引号来避免我得到的二进制文件错误。

现在我有ls File-* | sed '' 's/\(File-[^-]\)-\(.+\)/mv & \1\2/' | sh

No such file or directory会出现此错误?

我试图明确说明文件的位置,例如......

ls File-* | sed '' 's/\(File-[^-]\)-\(.+\)/mv ~\/Desktop\/Images\/& ~/Desktop\/Images\/\1\2/' | sh

...注意我必须逃避正斜杠~\/Desktop\/Images\/,但这仍然不起作用。

我还使用Homebrew安装了sed的GNU版本,但它也以与gsed: can't read s/\(Vim-[^-]\)-\(.+\)/mv & \1\2/: No such file or directory

类似的方式出错

我有点不知所措,我怎么能让它发挥作用。

我不想诉诸于编写bash / zsh脚本或Ruby脚本。

非常感谢您给予我的任何帮助。

2 个答案:

答案 0 :(得分:1)

以下内容对您有用:

ls File-* | sed 's/\(.*\)-\(.*\)/mv & \1\2/' | sh

你尝试了什么

ls File-* | sed '' 's/\(File-[^-]\)-\(.+\)/mv & \1\2/' | sh

非常接近。话说:

ls File-* | sed '' 's/\(File-[^-]*\)-\(.*\)/mv & \1\2/' | sh

相反会有效。

答案 1 :(得分:1)

如果您使用的是zsh,则无需使用sed:只有zsh module called zmv才能实现这一目标:

$ ls -F -G
File-A-B.gif  File-C-D.gif  File-E-F.gif

$ zmv -n 'File-(*)-(*).gif' 'File-${1}${2}.gif'
mv -- File-A-B.gif File-AB.gif
mv -- File-C-D.gif File-CD.gif
mv -- File-E-F.gif File-EF.gif

注意:忽略-n以使其实际运行。

它通过匹配括号内的东西来工作。在这种情况下:File-(*)-(*).gif将匹配File-A-B.gif并同时保存AB,以便我们稍后再引用它们。然后,我们将刚刚匹配的文件移动到新文件名,省略两个字母之间的连字符并使用引用插入字母:File-${1}${2}.gif

这是一个非常强大的小模块,前提是你可以给它两个正则表达式:一个匹配要重命名的文件,第二个匹配重命名的文件名。