FindDupesInSubfolders lets you find duplicate files stored in the same folder within a directory structure. It works by enumerating the selection and running Find non-recursively on every folder. The results are returned as a dated collection.
How to setup and use
Save CommandFindDupesInSubfolders.js.txt to
%appdata%\GPSoftware\Directory Opus\Script AddIns
Add the new command to a button, hotkey, context menu, etc. like any built-in command. It can also be run from the FAYT Command field.
Select the folders you want to get checked and run FindDupesInSubfolders on them.
After the command has finished make sure the correct collection is selected in the panel, otherwise you may be unable to select and delete files.
Things you might enjoy reading
How to use buttons and scripts from this forum
The script's inner workings
JScript
function OnInit(initData) {
initData.name = 'FindDupesInSubfolders';
initData.version = '2023-07-04';
initData.url = 'https://resource.dopus.com/t/find-duplicates-in-subfolders/44909';
initData.desc = '';
initData.default_enable = true;
initData.min_version = '12.0';
}
function OnAddCommands(addCmdData) {
var cmd = addCmdData.AddCommand();
cmd.name = 'FindDupesInSubfolders';
cmd.method = 'OnFindDupesInSubfolders';
cmd.desc = '';
cmd.label = '';
cmd.template = '';
cmd.hide = false;
cmd.icon = 'script';
}
function OnFindDupesInSubfolders(scriptCmdData) {
var cmd = scriptCmdData.func.command;
var tab = scriptCmdData.func.sourcetab;
var lst = tab.lister;
var fsu = DOpus.FSUtil();
var ssi = DOpus.Create().StringSetI();
cmd.deselect = false;
if (tab.selected_dirs.count == 0) return;
cmd.RunCommand('Set UTILITY=otherlog');
DOpus.ClearOutput();
DOpus.Output('Enumerating selection...');
for (var e = new Enumerator(tab.selected_dirs); !e.atEnd(); e.moveNext()) {
var item = e.item();
if (String(item.realpath).indexOf('$RECYCLE.BIN') >= 0) continue;
ssi.insert(item);
var folderEnum = fsu.ReadDir(item, 'r');
while (!folderEnum.complete) {
var folderItem = folderEnum.Next();
if (!folderItem.is_dir) continue;
ssi.insert(folderItem);
}
folderEnum.Close();
}
DOpus.Output('');
DOpus.Output('... done.');
var k = ssi.count;
var newColl = fsu.GetItem('coll://Dupes-' + DOpus.Create().Date().Format('D#yyyyMMdd-T#HHmmss'));
cmd.RunCommand('CreateFolder NAME="' + newColl + '" READAUTO=tab,dual');
DOpus.Output('');
DOpus.Output('Searching ' + k + ' folders...');
DOpus.Output('');
for (var e = new Enumerator(ssi); !e.atEnd(); e.moveNext()) {
var item = e.item();
var cmdLine = 'Find' +
' NAME=*.*' +
' DUPES' +
' MD5=cache' +
' DELMODE' +
' COLLNAME="' + newColl.name + '"' +
' IN="' + item + '"';
DOpus.Output(k + '\t\t' + cmdLine);
cmd.RunCommand(cmdLine);
k--;
}
DOpus.Output('');
DOpus.Output('... done.');
lst.Update();
cmd.SetSourceTab(lst.desttab);
cmd.RunCommand('Set SORTBY=parent,-name');
cmd.RunCommand('Set CHECKBOXMODE=on');
cmd.RunCommand('Set GROUPBY=dupes');
cmd.RunCommand('Set UTILITY=dupe');
}