通过在 bash 中重新排序模式来重命名文件

Ben*_*enP 2 bash rename

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

Author-YYYY-rest_of_text_seperated_by_underscores.pdf
John-2010-some_file.pdf
Smith-2009-some_other_file.pdf
Run Code Online (Sandbox Code Playgroud)

我需要重命名文件,以便年份是第一个,例如

YYYY-Author-rest_of_text_seperated_by_underscores.pdf
2010-John-some_file.pdf
2009-Smith-some_other_file.pdf
Run Code Online (Sandbox Code Playgroud)

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

我没有unix“重命名”,必须依赖sed、awk等。我很高兴就地重命名。

我一直在尝试调整这个答案,但运气不佳。使用 sed 批量重命名文件

Cha*_*ffy 5

有关使用 bash 进行字符串操作的一般建议,请参阅BashFAQ #100。其中一项技术是参数扩展,它在下面大量使用:

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
Run Code Online (Sandbox Code Playgroud)

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