【问题标题】:Rename files by reordering pattern in bash通过在 bash 中重新排序模式来重命名文件
【发布时间】:2017-07-28 00:01:13
【问题描述】:

我有一个格式为 pdf 的文件:

Author-YYYY-rest_of_text_seperated_by_underscores.pdf
John-2010-some_file.pdf
Smith-2009-some_other_file.pdf

我需要重命名文件,以便将年份放在第一位,例如

YYYY-Author-rest_of_text_seperated_by_underscores.pdf
2010-John-some_file.pdf
2009-Smith-some_other_file.pdf

这意味着将 'YYYY-' 元素移到开头。

我没有 unix 'Rename',必须依赖 sed、awk 等。我很乐意就地重命名。

我一直在尝试调整这个答案,但运气不佳。 Using sed to mass rename files

【问题讨论】:

  • 请不要使用实际上不在问题本身中心的工具来标记问题。 awksed 在答案中可能有用,但它们并不是您真正要问的。

标签: bash rename


【解决方案1】:

有关使用 bash 进行字符串操作的一般建议,请参阅 BashFAQ #100。这里涉及的技术之一是parameter expansion,它在下面被大量使用:

pat=-[0-9][0-9][0-9][0-9]-
for f in *$pat*; do  # expansion not quoted here to expand the glob
  prefix=${f%%$pat*} # strip first instance of the pattern and everything after -> prefix
  suffix=${f#*$pat}  # strip first instance and everything before -> suffix 
  year=${f#"$prefix"}; year=${year%"$suffix"} # find the matched year itself
  mv -- "$f" "${year}-${prefix}-${suffix}"    # ...and move.
done

顺便说一句,BashFAQ #30 讨论了许多重命名机制,其中一种使用 sed 来运行任意转换。

【讨论】:

  • 接受了这个答案,因为它在第一次通过并在 cmets 中进行解释:)
【解决方案2】:

使用 BASH 正则表达式:

re='^([^-]+-)([0-9]{4}-)(.*)$'

for f in *.pdf; do
    [[ $f =~ $re ]] &&
    echo mv "$f" "${BASH_REMATCH[2]}${BASH_REMATCH[1]}${BASH_REMATCH[3]}"
done

如果您对输出感到满意,请在 mv 之前删除 echo 命令。

【讨论】:

  • 收到错误“预期条件二元运算符”
  • 我已经在 BASH 中对其进行了测试,并且没有任何错误。确保你也在使用bash
  • @BenP,嗯——这应该工作。你的shebang是什么?如果您使用 /bin/sh 而不是 bash 运行脚本,则预计会导致失败。
猜你喜欢
  • 2013-06-15
  • 2013-11-20
  • 2014-07-07
  • 2014-05-27
  • 1970-01-01
  • 2020-02-18
  • 2012-12-31
  • 2021-09-20
  • 2021-12-27
相关资源
最近更新 更多