4

我的桌面上有一个名为“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 的 GNU 版本,sed但它也以类似的方式出错gsed: can't read s/\(Vim-[^-]\)-\(.+\)/mv & \1\2/: No such file or directory

我对如何让它发挥作用有点不知所措。

我不想求助于编写 bash/zsh 脚本或 Ruby 脚本。

您能给我的任何帮助将不胜感激。

4

2 回答 2

6

如果您正在使用zsh,则不需要使用sed:有一个名为 zsh 的模块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.

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

于 2013-09-29T10:03:35.383 回答
3

以下内容应该适合您:

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

相反会起作用的。

于 2013-09-27T13:41:29.377 回答