Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rename Files Mac Command Line

Tags:

regex

file

macos

I have a bunch of files in a directory that were produced with rather unfortunate names. I want to change two of the characters in the name. For example I have:

>ch:sdsn-sdfs.txt

and I want to remove the ">" and change the ":" to a "_".

Resulting in

ch_sdsn-sdfs.txt

I tried to just say mv \\>ch\:* ch_* but that didn't work.
Is there a simple solution to this?

like image 539
Stephopolis Avatar asked Dec 02 '22 20:12

Stephopolis


2 Answers

For command line script to rename, this stackoverflow question has good answers.

For Mac, In GUI, Finder comes with bulk rename capabilities. If source list of files has some pattern to find & replace, it comes very handy.

Select all the files that need to be replaced, right click and select rename enter image description here

On rename, enter find and replace string enter image description here

Other options in rename, to sequence the file names: enter image description here

To prefix or suffix text: enter image description here

like image 114
Sairam Krish Avatar answered Dec 15 '22 21:12

Sairam Krish


First, I should say that the easiest way to do this is to use the prename or rename commands.

Homebrew package rename, MacPorts package renameutils :

rename s/0000/000/ F0000*

That's a lot more understandable than the equivalent sed command.

But as for understanding the sed command, the sed manpage is helpful. If you run man sed and search for & (using the / command to search), you'll find it's a special character in s/foo/bar/ replacements.

  s/regexp/replacement/
         Attempt  to match regexp against the pattern space.  If success‐
         ful,  replace  that  portion  matched  with  replacement.    The
         replacement may contain the special character & to refer to that
         portion of the pattern space  which  matched,  and  the  special
         escapes  \1  through  \9  to refer to the corresponding matching
         sub-expressions in the regexp.

Therefore, \(.\) matches the first character, which can be referenced by \1. Then . matches the next character, which is always 0. Then \(.*\) matches the rest of the filename, which can be referenced by \2.

The replacement string puts it all together using & (the original filename) and \1\2 which is every part of the filename except the 2nd character, which was a 0.

This is a pretty cryptic way to do this, IMHO. If for some reason the rename command was not available and you wanted to use sed to do the rename (or perhaps you were doing something too complex for rename?), being more explicit in your regex would make it much more readable. Perhaps something like:

ls F00001-0708-*|sed 's/F0000\(.*\)/mv & F000\1/' | sh

Being able to see what's actually changing in the s/search/replacement/ makes it much more readable. Also it won't keep sucking characters out of your filename if you accidentally run it twice or something.

like image 40
Thomas Ayoub Avatar answered Dec 15 '22 19:12

Thomas Ayoub