Rename files by reordering pattern in bash

左心房为你撑大大i 提交于 2019-12-19 04:25:54

问题


I have a pdf files in the format:

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

I need to rename the files so that the year is first e.g.

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

So that would mean moving the 'YYYY-' element to the start.

I do not have unix 'Rename' and must rely on sed, awk etc.I happy to rename inplace.

I have been trying to adapt this answer not having much luck. Using sed to mass rename files


回答1:


See BashFAQ #100 for general advice on string manipulation with bash. One of the techniques this goes into is parameter expansion, which is heavily used in the below:

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

By the way, BashFAQ #30 discusses lots of rename mechanisms, among them one using sed to run arbitrary transforms.




回答2:


Using BASH regex:

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

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

When you're happy with the output remove echo command before mv.



来源:https://stackoverflow.com/questions/42654052/rename-files-by-reordering-pattern-in-bash

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!