简体   繁体   中英

Rename multiple files with bash for loop, mv, and sed

My goal is to rename a folder of files of the form 'img_MM-DD-YY_XX.jpg' to the form 'newyears_YYYY-MM-DD_XXX.jpg' by iterating through each filename and using sed to perform substitutions based on character positions. Unfortunately I cannot seem to get the position-based swaps to work.

eg s/.\\{4\\}[0-9][0-9]/.\\{10\\}[0-9][0-9]/ attempts to replace MM with YY

Here is my attempt (neglecting for now the _XX part):

for filename in images/*
do
newname=$(echo $filename | sed 's/.\{4\}[0-9][0-9]/.\{10\}[0-9][0-9]/;
            s/.\{7\}[0-9][0-9]/.\{4\}[0-9][0-9]/;
            s/.\{10\}[0-9][0-9]/.\{7\}[0-9][0-9]/;
            s/img_/newyears_20/')
mv $filename $newname
done

Any ideas how I can fix this?

$ echo 'img_11-22-14_XX.jpg' | sed -r 's/[^_]*_([0-9]{2})-([0-9]{2})-([0-9]{2})/newyears_20\3-\1-\2/'
newyears_2014-11-22_XX.jpg

The above looks for anything up to and including the first underline followed by a 6-digit date. It replaces the initial part with newyears_ and reformats the date from mm-dd-yy to 20yy-mm-dd.

The two-digit mm, dd, or yy values are matched with ([0-9]{2}) . The parentheses indicate that sed should capture the value for later use. The output side of the substitution is _20\\3-\\1-\\2 . This restores the underline and adds a 20 to the front of the year. The year was the third captured value so it is denoted \\3 . Likewise, the month was the first captured value so it is denoted \\1 and the day the second so it is \\2 .

To eliminate some blackslashes, I used the -r option to invoke extended regular expressions. If you are on a Mac or other non-GNU system, use sed -E in place of sed -r . Otherwise, use:

sed  's/[^_]*_\([0-9]\{2\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)/newyears_20\3-\1-\2/'

This is simple to do with awk

echo "img_MM-DD-YY_XX.jpg"  | awk -F"[_-]" '{print "newyears_20"$4"-"$2"-"$3"_0"$5}'
newyears_20YY-MM-DD_0XX.jpg

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM