I would like to find all folders that DO NOT have a specific file. I tried some things, but gave up.
It can be done but would require some scripting.
We can help with some more detail:
- What's the filename you want to check for?
- If folder
A
doesn't contain the file directly below it, should it then look in other folders below it, or stop straight away? - If
A
doesn't have the file, butA\B
does contain the file, do you wantA
to be included or excluded?
- filename is FolderArt.xmv
- No, there won't be any
- Assuming this is dependant on #2? If yes, this doesn't matter then.
Thanks.
Download this and drop it into the list in Preferences / Toolbars / Scripts:
- HasFolderArt.js.txt (1.2 KB)
(For more detail on installing it: How to use buttons and scripts from this forum )
You can then use it like this:
Script code for reference:
// Called by Directory Opus to initialize the script
function OnInit(initData)
{
initData.name = "HasFolderArt";
initData.version = "1.0";
initData.copyright = "(c) 2018 Leo Davidson";
initData.url = "https://resource.dopus.com/t/this-type-of-search-possible/28558";
initData.desc = "Adds a column that says if a folder contains a FolderArt.xmv file, which can be used for searching.";
initData.default_enable = true;
initData.min_version = "12.0";
var col = initData.AddColumn();
col.name = "HasFolderArt";
col.method = "OnHasFolderArt";
col.label = "Has Folder Art";
col.justify = "left";
col.autogroup = true;
col.match.push_back("Yes");
col.match.push_back("No");
}
// Implement the HasFolderArt column
function OnHasFolderArt(scriptColData)
{
if (!scriptColData.item.is_dir)
{
scriptColData.value = "";
return;
}
if (DOpus.FSUtil.Exists(scriptColData.item.realpath + "\\FolderArt.xmv"))
{
scriptColData.value = "Yes";
}
else
{
scriptColData.value = "No";
}
}
Wow. That is above and beyond. Will try it out. Thanks @Leo!
Works like a champ! Thanks again. Save me a few hours.
Nice solution @Leo.
This kind of thing comes up every now and then. Would make a good generic script.
For when using a filter could we update it to accept a match string to the script column?
This would make mean the column does not work as a normal column. But would add some value in this scenario.
I don't think script columns can do that. They aren't told what the filter is looking for.
Might be a useful addition to support something like this.
For anyone finding this thread, here's a related thread which has some other methods of doing similar things.
The script I posted above is a good solution for some tasks, but the ones in the other thread may suit you better, depending on exactly what you need to do.
@Leo I am a brand new user, just bought the software about 10 minutes ago. During my trial period I made great use of this script. It saved me enough time that it convinced me to buy the software (along with lots of other reasons). I hope it's okay to dig up this old post, if that wasn't the correct course of action, I apologize.
I was wondering if this script could be tweaked a little bit? I have a feeling that what I want should be an easy tweak, but I am not a programmer and I couldn't figure it out for the life of me.
What I want to be able to do is locate folders that do not contain a certain file type. As an example, in my music directory, locate all folders that do not contain a .jpg file. Now, all of my album covers have different names so it would need to search with a wildcard, like *.jpg
Other than that, I want it to function exactly how the existing script functions.
TL;DR Can this script be changed to search for missing filetypes with various names instead of missing files with a specific name?
Thanks!
Easy enough:
HasFolderJpeg.js.txt (1.4 KB)
// This is a script for Directory Opus.
// See https://www.gpsoft.com.au/DScripts/redirect.asp?page=scripts for development information.
var wild = DOpus.FSUtil.NewWild("*.(jpg|jpeg)", "f");
// Called by Directory Opus to initialize the script
function OnInit(initData)
{
initData.name = "HasJPEG";
initData.version = "1.0";
initData.copyright = "(c) 2019 Leo Davidson";
initData.url = "https://resource.dopus.com/t/find-folders-that-do-not-have-a-specific-file/28558/11";
initData.desc = "A column that says if a folder contains any JPG file directly below it, for use with searching.";
initData.default_enable = true;
initData.min_version = "12.0";
var col = initData.AddColumn();
col.name = "HasJPEG";
col.method = "OnHasJPEG";
col.label = "Has JPEG";
col.justify = "left";
col.autogroup = true;
col.match.push_back("Yes");
col.match.push_back("No");
}
// Implement the HasJPEG column
function OnHasJPEG(scriptColData)
{
if (!scriptColData.item.is_dir)
{
scriptColData.value = "";
return;
}
var match = false;
var dir = DOpus.FSUtil.ReadDir(scriptColData.item.realpath);
while (!match && !dir.complete)
{
var item = dir.Next();
if (item.is_dir)
{
continue;
}
if (wild.Match(item))
{
match = true;
}
}
dir.Close();
if (match)
{
scriptColData.value = "Yes";
}
else
{
scriptColData.value = "No";
}
}
Perfecto! I assume that if I want to modify it to locate folders that don't contain .nfo files I would modify this line
var wild = DOpus.FSUtil.NewWild("*.(jpg|jpeg)", "f");
to
var wild = DOpus.FSUtil.NewWild("*.(nfo)", "f");
Thank you so much for doing that for me, this is going to come in very handy!