How to remove trailing characters in filenames in Bash?
Solution 1:
This will rename the files. You need the \w* to signify any number of alphanumeric characters.
rename 's/\]\w*//' *
Reference: http://www.troubleshooters.com/codecorn/littperl/perlreg.htm#UsingSimpleWildcards
Solution 2:
In shell, one could do simply:
for x in *]*.avi ; do
mv -i "$x" "${x%]*.avi}.avi"
done
The shell can produce a list of the filenames with just a regular glob, and
${var%pattern}
removes the (shortest) matching pattern from the end of the string in variable var
. Since the final extension is always .avi
, I just removed it with the pattern and added it back. With the quotes, this should work with file names containing spaces too, like Fancy Name for a Show.s01e01]Asdf.avi
Solution 3:
This is all kinds of impractical - the other answers are much faster and shorter - but...
You can use PowerShell! Microsoft open-sourced it recently and made it cross-platform. For downloads and installation instructions for your OS, see the "Get PowerShell" section.
Once you get it installed, you can use this brief script:
Get-ChildItem -File '*]*.avi' | ForEach-Object {
Rename-Item $_ -NewName (($_.Name -Split ']')[0] + '.avi')
}
Basically, it goes through each object in the current directory that is a file matching *]*.avi
, gets the part before the bracket, tacks .avi
back onto it, and assigns that as the new name.
To run it directly from Bash, use this semi-golfed one-liner:
powershell -command $'gci -File \'*]*.avi\'|%{rename-item $_ -NewName (($_.Name -Split \']\')[0]+\'.avi\')}'
Quote escaping courtesy of this Stack Overflow answer.
(Tested in Bash on Ubuntu on Windows. There's probably a much shorter way of doing it with PowerShell, but I wanted to show something that's comprehensible to people who don't know regular expressions.)