Rename files by reordering pattern in bash

2019-02-20 01:42发布

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

标签: bash rename
2条回答
叛逆
2楼-- · 2019-02-20 02:44

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.

查看更多
爱情/是我丢掉的垃圾
3楼-- · 2019-02-20 02:44

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.

查看更多
登录 后发表回答