2013-09-27 36 views
1

我有所谓的“图像”我的桌面上的文件夹,该文件夹内有3张图片...如何在Mac OSX重命名使用岩组外壳和`sed`命令文件

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\/但是这仍然没有工作。

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

差错以类似的方式我有点茫然与我怎么能得到这个工作。

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

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

回答

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 

反而会工作。

+0

谢谢!看起来你提到的第一个选项适用于我,但它确实在输出中产生了一个错误(即使它正确地重命名了这些文件)? 错误是'preexec:4:command not found:^ A^B'你知道这意味着什么吗?注意,你说的最后一个例子是我几乎有的,没有奏效。 但我明白为什么第一个版本能够工作(我认为),我们使用'echo'和'$()'组合插入其他命令。我不是100%确定'$()'通常用于什么? 你能否给你的答案增加额外的解释来帮助我(和其他人)更好地理解:) – Integralist

+0

'$()'是过程替换。我想因为我们不管怎样管道到'sh',这不是必需的。见上面的编辑。 – devnull

+0

这很有道理。谢谢! – Integralist

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

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