【问题标题】:OS X file renameOS X 文件重命名
【发布时间】:2016-10-26 22:22:54
【问题描述】:

我有以下名称模式的 PDF:

ABC12345V1_6789_V0-1_xyz.pdf
ABC12345V4_6789_V3-7_xyz.pdf

重要的部分是 V#V#-#。无论第一个 V 之后的数字是多少,第二个 V 之后的数字总是少一个。我想创建一个服务,将上述模式重命名为:

ABC12345V1_6789_V1_xyz.pdf
ABC12345V4_6789_V4_xyz.pdf

基本上 V#-# 部分需要与文件名中的第一个 V# 相同。文件名中可能还有其他字母 Vs。

我发现mac os x terminal batch rename 很有用,但我需要将新值分配给要替换的字符串。

【问题讨论】:

  • 您是否安装了GNU coreutils
  • 不,我还没有。搜索以前的问题,我在想也许Homebrew 可以解决这个问题?
  • brew install rename ... 和 rename --help 看起来很有希望。鉴于 brew info 的知识,“this”是 Perl 驱动的文件重命名脚本 [...] 从 plasmasturm.org/code/rename 瓶装。 HTH

标签: bash macos file shell file-rename


【解决方案1】:

您可以使用简单的正则表达式来完成此操作:

r=$"V([0-9])_([0-9]*)_V";

for f in *.pdf; do
    if [[ $f =~ $r ]]; then
        mv "$f" "${f/_*_/_${BASH_REMATCH[2]}_V${BASH_REMATCH[1]}_}";
    fi
done

结果:

ABC12345V1_6789_V0-1_xyz.pdf ABC12345V1_6789_V1_xyz.pdf
ABC12345V4_6789_V3-7_xyz.pdf ABC12345V4_6789_V4_xyz.pdf

【讨论】:

  • i18n 字符串$"..."的任何原因?
  • @andlrc:这只是一种习惯;它应该在有或没有$ 的情况下工作; shellcheck.net 上的一切都很好 :)
  • 这在末尾有一个额外的 V,它会阻止运行 r=$"V([0-9])_([0-9]*)_V";,一旦它被删除它就可以正常工作
【解决方案2】:

这个脚本在没有 GNU coreutils 的 OS X 上运行良好。

#!/bin/bash

for f in *.pdf
do
    _fs=$(echo "$f" |grep -o "V[0-9]_")
    newfile=$(echo "$f" | awk -F"V[0-9][^_]*_" -v fs=$_fs '{print $1fs$2fs$3}')
    mv -v "$f" "$newfile"
done

只需将上面的内容复制到rename.shchmod u+x rename.sh,它就会重命名当前目录下的所有文件。

$ echo $BASH_VERSION
3.2.57(1)-release

$ grep --version
grep (BSD grep) 2.5.1-FreeBSD

$ awk --version
awk version 20070501

【讨论】:

  • 几乎没问题,但 V#_ 放在文件名的末尾:ABC12345V1_6789_V0-1_xyz.pdf ABC12345V1_6789_V0-1_xyz.pdfV1_
猜你喜欢
  • 2015-12-03
  • 2018-10-19
  • 1970-01-01
  • 2010-12-12
  • 2011-11-05
  • 1970-01-01
  • 2013-12-17
  • 2015-09-13
  • 2012-05-26
相关资源
最近更新 更多