[–] 3 points 5 months ago* (last edited 5 months ago)

No idea lol

I just wanted a rename utility and Arch didn't have the GUI one I used on Mint so I gradually pieced some of this stuff together. If there's one source online that lays it all out I haven't found it yet!

If you'd like me to explain the one here I'll do my best ;)

Edit: nvm, I edited the original comment to explain everything

  • source
  • parent
  • context
  • [–] 2 points 5 months ago* (last edited 5 months ago)

    If the naming of each series is that consistent, you could just use parameters in bash and build the new title out of it and then do the rename, in a loop. It would be a very short shell script.

    eta: using printf to format the new title variable will let it handle the number formatting clearnly, like 01 for 1

    eta: something like this

    for f in *"Season "*; do s_ep="${f#*Season }"; s="${s_ep%% Episode*}"; ep_t="${s_ep#*Episode }"; ep="${ep_t%% - *}"; t="${ep_t#* - }"; printf -v new "S%02dE%02d - %s" "$s" "$ep" "$t"; mv "$f" "$new"; done 
    
  • source
  • parent
  • context
  • [–] 7 points 5 months ago* (last edited 5 months ago) (3 children)

    Tested this with perl-rename and it seems to work fine:

    perl-rename -n 's/.* (\d{1,2}).* (\d{1,2})/sprintf "S%02dE%02d",$1,$2/e' *

    -n does a test-run and shows you the results, remove it to do the actual rename

    's/ text to find / text to replace it with / modifier' is the format used

    . represents any single character

    '*' matches the previous character 1 or more times

    '.* ' matches any series of characters before a space

    () encloses something you want to keep

    \ is the escape character

    d represents any number

    {1,2} means the number will be 1 or 2 digits

    In the sprintf, %02d is to format each number with 2 digits.

    $1 and $2 pass the first and second values enclosed in parentheses from the first argument into the 2 d's in the "S%02dE%02d" of the second argument.

    This link has a better explanation of the /e modifier than I could give you xD

    https://www.geeksforgeeks.org/perl/perl-e-modifier-in-regular-expression/ ___

  • source
  • find command with an exec. Basically, find can list files matching a pattern and then run a command for each of them. The exec will probably be a bit gnarly, though, so if you want something a little more palatable, you want a script that grabs the names of the files into a variable, then takes each entry via a for loop (find command and a bash while read might work), stores it in a variable, changes it based on your pattern (sed might work here), stores the changed name in another variable and then mv $former-name $new-name

  • source
  • parent
  • context
  • [–] 0 points 5 months ago* (last edited 5 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
  • [–] 5 points 5 months ago (2 children)

    I think you want something like this:

    $ ls
    'Star Trek Next Generation Season 01 Episode 22 - Bob.mkv'
    'Star Trek Next Generation Season 1 Episode 1 - Encounter at Farpoint.mkv'
    $ file-rename 's/.*Season (\d+) Episode (\d+)/sprintf("S%02dE%02d", $1, $2)/ie' *.mkv
    $ ls
    'S01E01 - Encounter at Farpoint.mkv'  'S01E22 - Bob.mkv'
    

    If you are getting an angle bracket, it's probably because you didn't add *.mkv at the end.

  • source
  • [–] [S] 1 point 5 months ago

    I'll look into it. I'm going to be running a media server eventually, so thinking learning the command line arguments would be a good investment.

    In this case, I'm moving these onto DVD and the truncated file names will all look the same on the DVD player, so I need to shorten 24*7 files.

  • source
  • [–] 2 points 5 months ago

    This doesn't answer your question at all, so my apologies up front.

    I'm not at all intending to advertise here, and I'm not at all affiliated with them, but in the past, I've sidestepped having to write scripts by using FileBot. It's always just worked for me.

  • source
  • [–] 2 points 5 months ago (4 children)
    mv “Star Trek Next Generation Season 1 Episode 1 - Encounter at Farpoint.mkv” “S01E01 - Encounter at Far Point.mkv”  
    

    Or am I missing something about what you're trying to do?

  • source
  • [–] 3 points 5 months ago (2 children)

    what’s the outcome you’re trying to achieve? you’ve got a folder full of mkv files and you just want to rename them?

    why not keep it simple and use a for loop with mv and awk to perform the rename?

  • source
  • [–] 1 point 5 months ago (2 children)

    Oh yep! If you're on Linux, sudo apt install git should sort you out if you're on a Debian-ish distro (including Mint or Ubuntu). Fedora it's sudo dnf install git, Arch... uhh... I don't know a ton about Arch's pacman.

  • source
  • parent
  • context
  • view more: ‹ prev next ›