Announcement

Collapse
No announcement yet.

Batch matching and renaming similar filenames via bash?

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • oshunluvr
    replied
    Cool, thanks John. I hoped you'd have a comment

    I agree that looping something potentially destructive is a bad idea. I tested my script on 3 files that I duplicated before I ran it "live" to be sure all was well. I had 40 files in 4 folders that I needed to rename this way and did NOT want to manually do that many.

    I really discovered the power of scripting tasks when I went to work with a postgresql database. The company provided a GUI front end to the database with over 200 identical schemas. But as you might expect, it was onerous to do almost anything because the GUI made you select a field to edit - one at a time.

    By learning some postgresql and using PGAdmin I was eventually able to make tens of thousands of edits within milliseconds. It really became enjoyable to take a task that could have taken weeks to complete and have it done in less than a few hours of script writing. However, I always had in mind the possibility of a typo wreaking havoc - and it did on many occasions. I was smart enough to make schema backups before hitting the "run" button!

    I'm not near as well versed in Bash as I'd like but each task that I can automate leaves me with some new knowledge that I can take forward.

    Thanks again for your input. It's much appreciated.

    Leave a comment:


  • jlittle
    replied
    My advice with bulk renaming tasks is to generate a list of mv commands, perhaps even thousands of them. One makes mistakes when generating the list, whereas making a mistake with mv in a loop can easily, silently, trash lots of files, in whatever scripting language one uses. After generating the list, one checks it, then checks again. After the checks, one just sources the list.

    I'm usually giving this advice too late; the last such time was only a few months ago.

    At least, using bash, one can initially code the loop using echo mv instead of mv.

    In generating the list, I usually use my text editor, starting with ls > changes.txt. Some block commands and a search and replace might take seconds.

    Instead of
    Code:
    X=`echo $L | cut -c 1-23`
    one can use ${L:0:23}, no need for an intermediate variable, and orders of magnitude faster.

    Leave a comment:


  • oshunluvr
    commented on 's reply
    YES! Snapshots are a real thing! LOL

  • Snowhog
    replied
    Originally posted by oshunluvr View Post
    No error checking or any kind of checking.
    But you have btrfs, so....

    Leave a comment:


  • oshunluvr
    replied
    OK, this works but it's REAL ugly:

    #!/bin/bash
    for L in *.mp4; do
    X=`echo $L | cut -c 1-23`
    mv ../dir2/"$X".mp4 ../dir2/"$L"
    done

    The script goes in the directory holding the names and "dir2" is the directory to rename. No error checking or any kind of checking.

    Leave a comment:


  • Batch matching and renaming similar filenames via bash?

    I have several folders with 10 files in it. Their names are specific to their content.
    I have another set of folders with files of the same content but at a higher resolution (video files) and similar names - same at the beginning but with additional characters at the end.
    I want to rename the second set of file to the same names as the first set of files but don.t want to manually copy and paste a bizillion times.

    So something like this:

    folderA/
    file 1xxx
    file 2xxx
    file 3xxx

    folderB/
    file 1
    file 2
    file 3

    Becomes this:
    folderB/
    file 1xxx
    file 2xxx
    file 3xxx

    and so on. So the "file 1" part remains the same but "xxx" is matched to to the correct file and added on to the name.

    I'm pretty sure I can do it in bash, but wondering if someone (<clearing throat> JLittle ) knows a short cut or special trick I don't know.

    More specifically, the first 23 characters of the two file sets' names are the same. The "xxx" part on the first set is of varying length and there are spaces in both sets of file names.

    The full file names look like:
    "Series name - s01e01 - Episode Name.mp4"

    and the target files look like:
    "Series name - s01e01 - .mp4"

    So I want to match the first 23 characters, then rename the file to the full name.

    I could totally do this easily in postgresql but my bash-foo is not so strong...
    Last edited by oshunluvr; Jan 20, 2024, 02:10 PM.
Working...
X