Hi, y'all. Running Linux Mint and I have the puzzle presented above.

From what I gather, I'm using rename (1p) which makes mention of Perl and in the man page it says it will also run as file-rename. I'm not sure if this is the right rename utility for the common argument

s/old_pattern/new_pattern/

but any time I try to run anything (including -n), I just get an angle bracket > and have to ctrl-c out.

I'd also need some details on how the wildcards work, which seems to be lacking in the documentation.

Edit: Instructions unclear. I have a bunch of episodes that are very wordy. I'm moving them onto DVD and truncated on my player the directory will look like:

Star Trek The Next Gene....
Star Trek The Next Gene....
Star Trek The Next Gene....
Star Trek The Next Gene....
Star Trek The Next Gene....

so I want to take (sample episode)

Star Trek The Next Generation Season 1 Episode 1 - Encounter at Far Point

and

  • Replace 'Star Trek The Next Generation Season ' with 'S0'

  • Replace 'Episode ' with 'E0' or 'E' depending on digits

  • Keep episode title as is.

So it looks like

S01E01 - Encounter at Farpoint.mkv

you are viewing a single comment's thread
view the rest of the comments
[–] 1 point 4 months ago* (last edited 4 months ago)

This is the kinda small script I use Claude for. So yeh, it's LLM generated. Downvote away.
But I am terrible at writing bash scripts!

#!/usr/bin/env bash
# rename-episodes.sh — run inside the folder, or pass a directory as $1

shopt -s nullglob
cd "${1:-.}" || exit 1

for f in *.mkv; do
    # Match: ... Season N ... Episode N - Title.mkv
    if [[ $f =~ Season\ ([0-9]+)\ Episode\ ([0-9]+)\ -\ (.+)\.mkv$ ]]; then
        season="${BASH_REMATCH[1]}"
        episode="${BASH_REMATCH[2]}"
        title="${BASH_REMATCH[3]}"

        # Zero-pad to two digits
        new=$(printf "S%02dE%02d - %s.mkv" "$season" "$episode" "$title")

        if [[ "$f" != "$new" ]]; then
            echo "mv: $f  ->  $new"
            # uncomment the next line to actually move the file
            # mv -n -- "$f" "$new"
        fi
    else
        echo "skip (no match): $f"
    fi
done

I've commented out the mv command so you can test/fiddle/play around with it without clobbering your files.

Some notes from Claude:

Two practical notes:
If your files aren't all .mkv, change the glob (*.mkv) and the regex anchor accordingly, or loop over *.{mkv,mp4,avi}.
This assumes the literal words "Season" and "Episode" appear. If your real filenames vary (e.g. "S1", "1x01", "Ep 1"), the regex needs adjusting


Edit: I just realised that specifically file-rename is mentioned, and looks like you are getting appropriate help in other threads.

  • source