46 lines
1.3 KiB
Zig
46 lines
1.3 KiB
Zig
// using zig-0.15.2
|
|
const std = @import("std");
|
|
|
|
const File = struct {
|
|
path: [:0]u8,
|
|
size: u64,
|
|
duplicate_size: ?usize = null,
|
|
hash: ?u256 = null,
|
|
};
|
|
|
|
pub fn main() !void {
|
|
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
|
|
const allocator = gpa.allocator();
|
|
defer _ = gpa.deinit();
|
|
|
|
var list: std.ArrayList(File) = .empty;
|
|
defer list.deinit(allocator);
|
|
var args_it = std.process.args();
|
|
_ = args_it.next(); // skip program name
|
|
while (args_it.next()) |arg| {
|
|
const dir = try std.fs.cwd().openDir(arg, .{ .iterate = true });
|
|
var walker = try dir.walk(allocator);
|
|
defer walker.deinit();
|
|
while (try walker.next()) |entry| {
|
|
if (entry.kind == .file) {
|
|
const stat = try entry.dir.statFile(entry.basename);
|
|
try list.append(allocator, .{
|
|
.path = try allocator.dupeZ(u8, entry.path),
|
|
.size = stat.size,
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
for (list.items, 0..) |*item, idx| {
|
|
for (list.items) |*item2| {
|
|
if (item.size == item2.size) {
|
|
item.duplicate_size = idx;
|
|
item2.duplicate_size = idx;
|
|
}
|
|
}
|
|
std.debug.print("path: {s}, size {}\n", .{ item.path, item.size });
|
|
allocator.free(item.path);
|
|
}
|
|
}
|