Created
January 22, 2015 10:41
-
-
Save cpq/3d58e144a3fc2e47c54a to your computer and use it in GitHub Desktop.
MacOS: restore all files from Trash folder to their original location
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env perl | |
# Copyright (c) 2015 Sergey Lyubka | |
# All rights reserved | |
use Encode; | |
my $dir = "/Users/$ENV{USER}/.Trash"; | |
sub read_file($) { local $/; open FD, $_[0] or die $_[0]; binmode FD; <FD>; } | |
sub u32($$) { unpack('N', substr($_[0], $_[1], 4)) } | |
sub str($$$) { my $s = substr($_[0], $_[1], $_[2]); Encode::from_to($s,'UCS-2BE','utf8'); $s; } | |
sub read_block($$) { | |
my ($p, $o) = @_; | |
my $cnt = u32($p, $o + 8); | |
$o += 12; | |
while ($cnt--) { | |
my $name_len = u32($p, $o) * 2; | |
my $name = str($p, $o + 4, $name_len); | |
my $tag = substr($p, $o + 4 + $name_len, 4); | |
my $type = substr($p, $o + 8 + $name_len, 4); | |
print "[$o] [$name] [$name_len] [$tag] [$type]\n"; | |
$o += $name_len + 12; | |
if ($type eq 'bool') { $o += 1 } | |
elsif ($type =~ /shor|long|type/) { $o += 4; } | |
elsif ($type =~ /comp|dutc/) { $o += 8; } | |
elsif ($type eq 'ustr') { | |
my $n = 2 * u32($p, $o); | |
if ($tag eq 'ptbL') { | |
my $original_location = str($p, $o + 4, $n); | |
my $cmd = "mv \"$dir/$name\" \"/$original_location\""; | |
print "$cmd\n"; | |
system($cmd); | |
} | |
$o += $n + 4; | |
} | |
elsif ($type eq 'blob') { $o += u32($p, $o) + 4; } | |
else { last; } | |
} | |
return $cnt; | |
} | |
my $store = read_file("$dir/.DS_Store"); | |
my $off = u32($store, 0x14) & ~15; | |
while (1) { | |
last if read_block($store, $off) == 0; | |
$off = ($off & 0xfffff000) + 0x1000; | |
}; |
IS there a way just pick the date to recover from trash can? I just want to restore the files/ folder from that day.
Omg, people that writes scrips like this makes me fall in love with Programming time and time again!!
Thanks, you Sergey Lyubka, you are the man!!!!!!!!
Sir please help me.. where can i input this codes thank you
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I empty my folder and files from my mac trash can.
i download the code and type it in terminal "perl restore_mac_trash.pl"
After i do that, will my whole folder go back to original location? I try it but i don't see my files go back to the original folder. Does it take long to go back? because my folder is super large. It is my iTunes whole folder. I have a lot of mp3 files there.