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

我的桌面上有一个名为“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 & 12/' | sh ls File-* | sed 's/(File-[^-])-(.+)/mv & 12/' | 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 & 12/' | sh ls File-* | sed '' 's/(File-[^-])-(.+)/mv & 12/' | sh

    但是,这种错误与No such file or directory

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

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

    ...注意我必须避开正斜线~/Desktop/Images/但这仍然不起作用。

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

    我对如何让这个工作起作用感到有点不知所措。

    我不想诉诸写一个bash / zsh脚本或Ruby脚本。

    任何帮助,你可以给我将不胜感激。


    以下内容适用于您:

    ls File-* | sed 's/(.*)-(.*)/mv & 12/' | sh
    

    你尝试过什么

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

    非常接近。 他说:

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

    反而会工作。


    如果您使用的是zsh ,则不需要使用sed :有一个名为zmv的zsh模块,它可以非常简单地实现:

    $ 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-AB.gif匹配,并保存AB以便稍后参考。 然后,我们将刚刚匹配的文件移动到一个新的文件名中,省略两个字母之间的连字符并使用引用插入字母: File-${1}${2}.gif

    它是一个相当强大的小模块,只要你给它两个正则表达式:一个匹配要重命名的文件,另一个匹配重命名的文件名。

    链接地址: http://www.djcxy.com/p/78053.html

    上一篇: How to rename files using Zsh shell and `sed` command on Mac OSX

    下一篇: R string *.txt' even when top dir doesn't have a .txt file