I've got a bunch of untagged audio files in directories, and they all follow this naming pattern: artist - album with spaces - 2-digit track number title with spaces. The problem is that I'm using a space instead of a dash for the final separator, which is leading to mistakes in how I process them. Can anyone help me figure out a way to differentiate the space after the two-digit track number from other spaces in the filename? I've made some attempts with a bash script, but I'm unsure how to handle this correctly without running into errors.
5 Answers
Using a while loop with null as the separator could simplify things. You could run something like this: `while IFS= read -r -d '' FILE_NAME; do ...done < <(find /path/to/directory -type f -name "*.mp3" -print0)`. This method allows you to manipulate the strings with bash's internal tools without relying on external commands, making your process more efficient. Just remember, inconsistent naming can throw a wrench in things, so testing is key!
You might want to try using a regex pattern to split the filename elements directly into an array. For example, you could use a pattern like `^(.*) - (.*) - ([0-9][0-9]) (.*).mp3$`. This method is way cleaner than messing around with multiple `sed` calls. You'll just have to decide how to handle files that don't fit this pattern or have unusual strings in the artist or album names. But once you set it up, it should work better than your current method!
If you ever consider using Perl, it could make handling these types of problems a lot easier. It allows you to process filenames with much more flexibility, especially when you have non-standard patterns to deal with. But if you're sticking with bash, you might want to stick to a single known character as a separator to keep things simpler.
I’ve been brushing up on similar batch renaming tasks and found it really helpful to use tools like ChatGPT for script checking and enhancements. It sure helps with coming up with better code and understanding Bash scripting even as a novice!
Have you checked out the `rename` command? It uses a syntax similar to `sed` for renaming files and you can do something like `rename -n 's/(.*) - (.*) - ([0-9]{2}) (.*)/$1_$2_$3_$4/g' *` to test it. It's super handy and saves you from writing complex loops!
Definitely! It's a great tool that can simplify the whole renaming process without diving into scripting.

I agree, but be careful with that regex. The `(.*)` could end up capturing too much of the string. I'd suggest using `S+` for the artist and album fields, assuming there are no spaces there!