1
0
mirror of https://github.com/jbranchaud/til synced 2026-01-03 07:08:01 +00:00
Files
til/unix/rename-a-bunch-of-files-by-constructing-mv-commands.md

1.9 KiB

Rename A Bunch Of Files By Constructing mv Commands

I downloaded a bunch of bank statements as PDFs. On the upside they all were consistently named. On the downside they used an unhelpful date format. With a date format that puts year before month before day, the files easily sort alphanumerically. However, these filenames used a date format that put month before day before year.

Here is a subset of the files

$ ls *.pdf
'012524 Statement.pdf'
'012725 Statement.pdf'
'022624 Statement.pdf'
'022625 Statement.pdf'
'032524 Statement.pdf'
'032525 Statement.pdf'

Notice they are named with MMDDYY Statement.pdf. I would instead like for them to be named as YYYY-MM-DD-statement.pdf.

I can generate a series of mv statements that then get piped to sh which evaluates them. But first, let's do a dry run of a sed statement that rearranges the date parts.

$ ls *.pdf | sed 's/\(..\)\(..\)\(..\) Statement\.pdf/mv "&" "20\3-\1-\2-statement.pdf"/'
mv "012524 Statement.pdf" "2024-01-25-statement.pdf"
mv "012725 Statement.pdf" "2025-01-27-statement.pdf"
mv "022624 Statement.pdf" "2024-02-26-statement.pdf"
mv "022625 Statement.pdf" "2025-02-26-statement.pdf"
mv "032524 Statement.pdf" "2024-03-25-statement.pdf"
mv "032525 Statement.pdf" "2025-03-25-statement.pdf"

The way this works is that all the pdf files in the current directly get listed out. That gets piped to a sed statement that matches on capture groups against the first three pairs of characters (the date parts) in the filenames. It matches on the rest of the filename ( Statement.pdf). This is then replaced by a mv , the full match of the original filename (&), and then the new filename made up of the rearranged date parts.

I can then pipe it to sh to run those mv commands.

$ ls *.pdf |
  sed 's/\(..\)\(..\)\(..\) Statement\.pdf/mv "&" "20\3-\1-\2-statement.pdf"/' |
  sh