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

n3ipq98p  于 11个月前  发布在  Shell
关注(0)|答案(3)|浏览(110)

我有一个文件夹在我的桌面上称为“图像”,在该文件夹是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,我们然后用move命令替换匹配的文件名,并有效地告诉它将原始文件重命名为由我们捕获的两段数据组成的文件。
  • 然后我们将该命令通过管道传输到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会出错,因为它不知道使用什么文件扩展名,但是输入一个空String可以消除这个错误(顺便说一句:我的理解是,你还需要使用-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脚本。
如果你能给我任何给予帮助,我将不胜感激。

mnowg1ta

mnowg1ta1#

如果你正在使用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
这是一个非常强大的小模块,只要您可以给予两个正则表达式:一个用于匹配要重命名的文件,第二个用于匹配重命名的文件名。

iovurdzv

iovurdzv2#

以下方法应该对你有用:

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


反而会奏效

2skhul33

2skhul333#

另一种方法是使用mv,例如:

mv <current-filename> <new-filename>

字符串

相关问题