Home » Questions » Computers [ Ask a new question ]

How to batch rename files copied from OSX to Windows with ':' in filenames?

How to batch rename files copied from OSX to Windows with ':' in filenames?

This is really puzzling. I have lots of videos that were stored using Mac OS, and now I have to edit them on Windows XP. I copied files using HFSExplorer. Editing software refuses to open the files with their current names, and so far I have not found a way to batch rename all the files.

Asked by: Guest | Views: 178
Total answers/comments: 5
bert [Entry]

"Updated:

We're under the assumption that ""clip-2009-10-01 21;26;00.mov"" is not the actual filename; one possibility is that the actual filename is ""clip-2009-10-01 21:26:00.mov"". However, we can't verify that under Windows.

We may not need to.

Failsafe Method:

Boot to a Linux LiveCD. Ubuntu 9.04 has good NTFS support, and Linux handles a lot more wonky-characters-in-filenames than Windows. The perl rename script may be included as the system's rename command.

This-Might-Actually-Work Batch Method (New Script!)

The DOS command DIR/X shows short filenames, if they exist on your system.

$ cmd
c:\test> dir /x
Volume in drive E is NUVOL
Volume Serial Number is 80D3-A96D

Directory of e:\tor\test

10/04/2009 05:15 AM <DIR> .
10/04/2009 05:15 AM <DIR> ..
10/04/2009 05:11 AM 0 CLIP-2~1.MOV clip-2009-10-01 21;26;00.mov
1 File(s) 0 bytes
2 Dir(s) 5,201,670,144 bytes free

If they do exist, the REN command will move them to a new name; the new name can be a new (valid) long filename.

c:\test> ren CLIP-2~1.MOV ""clip-2009-10-01_21-26-00.mov""

That's how to fix one.

To batch process all of them, you need to 1) grab a listing of all the files you want to move; 2) run a short perl script to convert your listing into a batch file with the appropriate REN commands; and 3) run the resulting batch script.

c:\test> dir /x > mybrokenfiles.lst
$ cat mybrokenfiles.lst | perl -lne 'next if not /MOV/; s/^.{1,39}//; s/^/ren /; s/ (\d\d);(\d\d);(\d\d)/_$1-$2-$3/; print' > fixmybrokenfiles.bat
c:\test> fixmybrokenfiles.bat

The perl commandline assumes a very particular input format, so if the DOS listing shows long filenames in something other than the ""21;26;00.mov"" format, it probably won't do exactly what you want. If you try it, double-check that the batch script looks right before running it.

If you are comfortable with perl (or sed/awk, python, whatever), you can script this yourself. But if DIR/X doesn't show the short filenames, your system has them disabled, and this solution won't help.

Original answer: not useful with what we know now, but if you copy this sort of file off of OSX again, you can use this BEFORE the copy as a preventative step.

I use the commandline a lot on both Windows and Linux systems. There's a handy perl script floating around the internet that allows batch file renames using standard perl regex's (google for rename.pl to find it).

Under Cygwin on windows, use this in the directory your files are located in to rename them:

$ ls
clip-2009-10-01 21;26;00.mov

$ rename.pl 'tr/ ;/_-/;' *
$ ls
clip-2009-10-01_21-26-00.mov

Pretty sure my version came from the Perl Cookbook:

#!/usr/bin/perl -w
# rename - Larry's filename fixer
$op = shift or die ""Usage: rename expr [files]\n"";
chomp(@ARGV = <STDIN>) unless @ARGV;
for (@ARGV) {
$was = $_;
eval $op;
die $@ if $@;
rename($was,$_) unless $was eq $_;
}"
bert [Entry]

"Lupas Rename is a FREEWARE program developed to rename a big number of files.
It works on Win95, Win98, WinME, WinNT, Win2K and WinXP.
It is a simple .EXE file and doesn't need any other external libraries.

Here are some of the features :

Rename files and folders
Rename files in recursive subdirectories
Shell Integration (right click on a folder in the explorer to start LupasRename on these folder)
Instant Preview (Optional)
Undo the last rename operation
Make a Batch file to rename from a DOS Console
Make a Batch file for UNDO operation from a DOS Console
Save and Load your options into an INI File
Filter by any masks: .mp3;.mp2 or ???a*.txt...
Replace a substring by other with Matchcase Optional
Replace a substring by other with Matchcase Optional in Extension"
bert [Entry]

Similar to a couiple of the other solutions, Bulk Rename Utility is a utility that'll do the job. I find it very useful and easy to use for my bulk file re-naming needs.
Similar to a couiple of the other solutions, Bulk Rename Utility is a utility that'll do the job. I find it very useful and easy to use for my bulk file re-naming needs.
bert [Entry]

What are the permissions on the file? Are you sure you have permission to rename them? If not, take ownership of the files and try again.
bert [Entry]

"Interesting problem.

You can write your own custom script. Here is one script that will work. It will REPLACE ALL COLONS, SEMICOLONS, SPACES WITH UNDERSCORE. I will assume the files are in E:/ and the names follow the pattern of clip*.mov. You can change this values in the script to your correct values. You can customize the script even further, if you wish.

# Script Mac2WindowsFileTransfer.txt
# Go to directory where files are stored.
cd ""E:/"" ### CHANGE THIS TO YOUR CORRECT VALUE. ###
# Get a list of clip*.mov files.
var str list ; lf -rng ""clip*.mov"" > $list ### CHANGE THIS TO YOUR CORRECT VALUE. ###
# Go thru files one by one.
while ($list <> """")
do
# Get the next file.
var str file
lex ""1"" $list > $file
# Create the new name.
var str newname
stex -p ""^/^l["" $file > $newname
# REPLACE ALL COLONS, SEMICOLONS, SPACES WITH UNDERSCORE.
while ( { sen -r ""^(\:\; )^"" $newname } > 0 )
sal -r ""^(\:\; )^"" ""_"" $newname
# Rename file.
system rename (""\""""+$file+""\"""") $newname
done

Save the script as C:/Scripts/Mac2WindowsFileTransfer.txt. The script is in biterscripting ( http://www.biterscripting.com ). You can download biterscripting free. Run the by typing the following command in biterscripting.

script ""C:/Scripts/Mac2WindowsFileTransfer.txt""

Patrick"