Skip to content

Instantly share code, notes, and snippets.

@khalman-m
Forked from cpq/restore_mac_trash.pl
Last active April 13, 2020 01:26
Show Gist options
  • Select an option

  • Save khalman-m/8ccc248963bb65df2214 to your computer and use it in GitHub Desktop.

Select an option

Save khalman-m/8ccc248963bb65df2214 to your computer and use it in GitHub Desktop.
#!/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 $cmd0 = "mkdir -p \"/$original_location\"";
my $cmd = "mv \"$dir/$name\" \"/$original_location\"";
print "$cmd0\n";
print "$cmd\n";
system($cmd0);
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;
};
@ed8888new

Copy link
Copy Markdown

Hi, it's very good script. Thank you very much.

ghost commented Jun 17, 2017

Copy link
Copy Markdown

How long does this take to run on average?

@cmicat

cmicat commented Oct 10, 2017

Copy link
Copy Markdown

I have such error
mv: cannot stat '/Users/cmicat/.Trash/weedfs_0.70_darwin_amd64.zip': No such file or directory
Anyone know how to check if file exists before move?

@afshinrahimi

Copy link
Copy Markdown

million thanks, saved me hours!

@drKreso

drKreso commented May 27, 2019

Copy link
Copy Markdown

thanks!

@shurekek19

Copy link
Copy Markdown

Sir please help me. Where can i input this codes thank you so much

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment