Monday, 16 January 2017

 

=========================================================

cleanup_folderstructure.pl

=========================================================

#!/usr/bin/perl -w
# Cleanup_FolderStructure.pl
# This script takes a folder as input, recurses through the folder structure, and deletes any files it finds which are older than X days.
# It will also remove any empty folders which are left behind after the files are deleted.
# You can configure the script to either remove or ignore the first level of subfolders it finds using the $remove_top_level variable. (0=ignore, 1=remove)
# Version 1.2 - moves variables to input values

############ MODULES TO USE ###############
use File::Glob qw(bsd_glob);
use strict;

############ USER VARIABLES ###############


if (scalar @ARGV != 4)
{
    print "USAGE: $0 <Source Folder> <day limit> <Unique Name for Logs> <remove top level>\n";
    exit;
}

my $source_dir = $ARGV[0]; #"E:\\Shields"; # Set the source directory to start the listing from
my $log_path = "D:\\GIST\\LOGS";
my $max_days = $ARGV[1];
my $log_name = $ARGV[2];
my $remove_top_level = $ARGV[3];
my $info = "short";

############ GLOBAL VARS ##################
my $totalmoved = 0;
my $totaldups = 0;
my $totalskipped = 0;
my $totalnomatch = 0;
my ($second, $minute, $hour, $dayOfMonth, $month, $yearOffset, $dayOfWeek, $dayOfYear, $daylightSavings, $year);

sub GetTime
{
    ($second, $minute, $hour, $dayOfMonth, $month, $yearOffset, $dayOfWeek, $dayOfYear, $daylightSavings) = localtime(time);
    $year = 1900 + $yearOffset;
    $month = $month + 1;
    if ($month < 10) { $month = "0" . "$month"};
    if ($dayOfMonth < 10) { $dayOfMonth = "0" . "$dayOfMonth"};
    if ($minute < 10) { $minute = "0" . "$minute"};
    if ($hour < 10) { $hour = "0" . "$hour"};
}

sub removeEmptyFolders
{
    my $source = $_[0];
    chdir($source) or die("Cannot access folder $source");
    my @directories;
   

    # Update the current Date and time
    GetTime();

    # Contstruct the Log filename
    my $logfile = $log_path . "\\cleanup-$log_name-" . $dayOfMonth . "-" . $month . "-" . $year . ".log";

    my $counter = 0;
    # Pass 1 - list the contents of the folder
    my @all_files = (bsd_glob("*"),bsd_glob(".*"));
    foreach (@all_files)
    {
        # check for the dodgy . and .. in the listed path (i.e. current dir and parent dir), as we don't want to recurse into these.
        # ... it's really not very fun when you start running this program outside of the given source path!
        open LOGFILE, ">>$logfile" or die "unable to open logfile $logfile for writing";
        if (($_ eq '.') || ($_ eq '..'))
        {
                #print "$_ matched . or .. and was discarded\n";
        }
        else   
        {
            # Check if the file is a directory or not. Directories don't get checked for mod time, but they get added to the directories array for
            # recursive processing to find files.
            if (-d $_)
            {
                #print "Adding new dir - $source\\$_\n";
                push @directories, "$source\\$_";
                $counter++;
            }
            else
            {
                # If it's not a dir then it's a file. Find the mod time of the file, and delete that file if it's old.
                my $days_old = -M $_;
                if ((-f $_) && ($days_old > $max_days))# check if the file is an actual file and that it's more than 2 days old
                {
                    print LOGFILE "Cleanup: Deleting $_ ($days_old days old)\n";
                    #$counter++;
                    unlink ("$_");
                }
                else
                {
                    # If it's a file but not older than our limit then add to the counter to say files were found
                    print LOGFILE "Cleanup: Ignoring $_ ($days_old days old)\n";
                    $counter++;
                }
            }
        }
        close LOGFILE;
    }
   
    if ($counter == 0)
    {
            # this means that no subfolders or files were found, so we should be able to delete the folder
            print "==> CLEANUP - Delete $source\n";   
            return 1;
    }
    else
    {
        foreach (@directories) # recursively call itself to process any directories which have been found
        {
            my $return_value = &removeEmptyFolders($_);
            chdir "$source" or die "cannot chdir to $source: $!";
            if ($return_value == 1)
            {
                    # If it returns 1 then delete the folder
                    print "==> CLEANUP - Deleting $_\n";
                    rmdir ("$_") or print "$!\n";
                    open LOGFILE, ">>$logfile" or die "unable to open logfile $logfile for writing";
                    print LOGFILE "==> CLEANUP - Deleting $_\n";
                    close LOGFILE;       
            }
        }
       
        my @second_pass = (bsd_glob("*"),bsd_glob(".*"));
        my $secondcounter = 0;
        foreach (@second_pass)
        {
            if (($_ eq '.') || ($_ eq '..'))
            {
                    #print "$_ matched . or .. and was discarded\n";
            }
            else
            {
                    $secondcounter++;
            }
        }
       
        if ($secondcounter == 0)
        {
                # this means that no subfolders or files were found, so we should be able to delete the folder
                print "==> CLEANUP (Pass 2) - Delete $source\n";
                return 1;
        }
        else
        {
                return 0;
        }
    }
}

############ DRIVER FUNCTION ##############
# Check that the log path exists
if (!-d $log_path)
{
    print "Log Path - $log_path does not exist - please create it to run this script.\n";
    exit;
}

if (!-d $source_dir)
{
    print "Source Dir - $source_dir does not exist - please create it to run this script.\n";
    exit;
}
else
{
    print "Analyzing $source_dir\n";
}
my $waiting = 0;

chdir($source_dir) or die("Cannot access folder $source_dir");
GetTime();

my $logfile = $log_path . "\\cleanup-$log_name-" . $dayOfMonth . "-" . $month . "-" . $year . ".log";
my @directories;
my @all_files = (bsd_glob("*"),bsd_glob(".*"));

foreach (@all_files)
{
    if (($_ eq '.') || ($_ eq '..'))
    {
            #print "$_ matched . or .. and was discarded\n";
    }
    else
    {
        if (-d $_)
        {
            my $current_folder = "$source_dir\\$_";
            GetTime();
           
            open LOGFILE, ">>$logfile" or die "unable to open logfile $logfile for writing\n";
            print LOGFILE "[$dayOfMonth/$month/$year $hour:$minute] Found $source_dir\\$_ \n";
            push @directories, "$source_dir\\$_";
            close LOGFILE;
        }
    # If it's not a dir then it's a file. Find the mod time of the file, and delete that file if it's old.
    my $days_old = -M $_;
    if ((-f $_) && ($days_old > $max_days))# check if the file is an actual file and that it's more than 2 days old
    {
        open LOGFILE, ">>$logfile" or die "unable to open logfile $logfile for writing\n";
        print LOGFILE "Cleanup: Deleting $_ ($days_old days old)\n";
        unlink ("$_");
    }
    else
    {
        # If it's a file but not older than our limit then add to the counter to say files were found
        open LOGFILE, ">>$logfile" or die "unable to open logfile $logfile for writing\n";
        print LOGFILE "Cleanup: Ignoring $_ ($days_old days old)\n";
        close LOGFILE;
    }
    }
}

chdir ($source_dir);
if (scalar(@directories) > 0)
{    
    foreach (@directories)
    {
        GetTime();
        open LOGFILE, ">>$logfile" or die "unable to open logfile $logfile for writing";
        print "**** [$dayOfMonth/$month/$year $hour:$minute] Starting to process $_ ****\n";
        print LOGFILE "**** [$dayOfMonth/$month/$year $hour:$minute] Starting to process $_ ****\n";
        close LOGFILE;       
       
        # if the return value here is 1 from the function then usually we delete the folder, but we don't want to remove the top level folders in this case
        my $return_value = &removeEmptyFolders($_);
       
        if ($remove_top_level)
        {
            # Remove the top level folder if it has been requested!
            if ($return_value == 1)
            {
                chdir ($source_dir);
                # If it returns 1 then delete the folder
                print "==> CLEANUP - Deleting $_\n";
                rmdir ("$_") or print "$!\n";
                open LOGFILE, ">>$logfile" or die "unable to open logfile $logfile for writing";
                print LOGFILE "==> CLEANUP - Deleting $_\n";
                close LOGFILE;
            }
            else
            {
                open LOGFILE, ">>$logfile" or die "unable to open logfile $logfile for writing";
                print LOGFILE "==> CLEANUP - Ignoring Top Level Folder: $_\n";
                close LOGFILE;
            }
        }
        print "Completed deletion of files older than $max_days from $_\n";       
    }
}   

=========================================================

cleanup file structure.bat

=========================================================

@ echo off
Q:
cd Q:\ShieldsFiles\Shields

echo [%DATE%] [%TIME%] Start.

forfiles.exe /p Q:\ShieldsFiles\Shields\Outgoing /s /m *.* /d -10 /c "cmd /c del @file"
forfiles.exe /p Q:\ShieldsFiles\Shields\BASH /s /m *.* /d -21 /c "cmd /c del @file"
forfiles.exe /p Q:\ShieldsFiles\Shields\BASHDupsZip /s /m *.* /d -21 /c "cmd /c del @file"
forfiles.exe /p Q:\ShieldsFiles\Shields\BASHDups /s /m *.* /d -21 /c "cmd /c del @file"
forfiles.exe /p Q:\ShieldsFiles\Shields\BASHRescan /s /m *.* /d -21 /c "cmd /c del @file"
 
echo [%DATE%] [%TIME%] Done.

 

=========================================================

deleteanythingunderthat folder.bat

=========================================================

@ echo off
c:
cd C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp
FOR /D %%p IN ("C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\*.*") DO rmdir "%%p" /s /q
forfiles.exe /p C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp /s /m *.* /d -1 /c "cmd /c del @file"
mkdir c:\temp\new
move C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\*.* c:\temp\new
rmdir /s /q c:\temp\new

 

=========================================================

deloldestfile..cmd

=========================================================

@echo off
setlocal
set Folder=E:\W\Screenshots
set FileMask=*.png
set OldestFile=
for /f "delims=" %%a in ('dir /b /o:d "%Folder%\%FileMask%" 2^>NUL') do (
    set OldestFile=%%a
    goto Break
)
:Break
if "%OldestFile%"=="" (
    echo No files found in '%Folder%' matching '%FileMask%'!
) else (
    del "%Folder%\%OldestFile%"
)

0 comments:

Post a Comment

ShortNewsWeb

Blog Archive

Categories

'The Woks of Life' Reminded Me to Cook With All the Flavors I Love (1) 10 Scary Podcasts to Listen to in the Dark (1) 13 of the Best Spooky Episodes From (Mostly) Un-Spooky Shows (1) 13 Spooky Movies Set on Halloween Night (1) 1Password Now Generates QR Codes to Share Wifi Passwords (1) 2024 (15) 21 Thanksgiving Movies About Families As Screwed-Up As Yours (1) 30 Movies and TV Shows That Are Basically 'Competence Porn' (1) 30 of the Most Obscenely Patriotic Movies Ever (1) 31 Spooky Movies to Watch Throughout October (1) 40 Netflix Original Series You Should Watch (1) 55 Box Office Bombs Totally Worth Watching (1) Active Directory (1) Adobe's AI Video Generator Might Be as Good as OpenAI's (1) AIX (1) and I'd Do It Again (1) and Max Bundle Isn't a Terrible Deal (1) Apache (2) Apple Intelligence Is Running Late (1) Apple Intelligence's Instructions Reveal How Apple Is Directing Its New AI (1) August 18 (1) August 4 (1) August 5 (1) Avoid an Allergic Reaction by Testing Your Halloween Makeup Now (1) Backup & Restore (2) best practices (1) bleepingcomputer (65) Blink Security Cameras Are up to 68% Off Ahead of Prime Day (1) CentOS (1) Configure PowerPath on Solaris (1) Documents (2) Don't Fall for This 'New' Google AI Scam (1) Don't Rely on a 'Monte Carlo' Retirement Analysis (1) Eight Cleaning Products TikTok Absolutely Loves (1) Eight of the Best Methods for Studying so You Actually Retain the Information (1) Eight Unexpected Ways a Restaurant Can Mislead You (1) Elevate Your Boring Store-Bought Pretzels With This Simple Seasoning Technique (1) Everything Announced at Apple's iPhone 16 Event (1) file system (6) Find (1) Find a Nearby ‘Gleaning Market’ to Save Money on Groceries (1) Five Red Flags to Look for in Any Restaurant (1) Five Ways You Can Lose Your Social Security Benefits (1) Flappy Bird's Creator Has Nothing to Do With Its 'Remake' (1) Four Reasons to Walk Out of a Job Interview (1) Four Signs Thieves Are Casing Your House (1) gaming (1) Goldfish Crackers Have a New Name (for a Little While) (1) Hackers Now Have Access to 10 Billion Stolen Passwords (1) How I Finally Organized My Closet With a Digital Inventory System (1) How I Pack Up a Hotel Room So I Don’t Forget Anything (1) How to Cancel Your Amazon Prime Membership After Prime Day Is Over (1) How to Choose the Best Weightlifting Straps for Your Workout (1) How to Enable (and Turn Off) Apple Intelligence on an iPhone (1) How to Get Started With Bluesky (1) How to Keep Squirrels Off Your Bird Feeders (1) How to Remotely Control Another iPhone or Mac Using FaceTime (1) How to Set Up Your Bedroom Like a Hotel Room (and Why You Should) (1) How to Speak With a Real Person at Target Customer Service (1) How to Take a Screenshot on a Mac (1) How to Take Full Control of Your Notifications on a Chromebook (1) How to Use Picture-in-Picture Mode on an Android Phone (1) Hulu (1) I Chose the Beats Fit Pro Over the AirPods Pro (1) If You Got a Package You Didn't Order (1) If You Hate Running (1) Important Questions (17) Install and Configure PowerPath (1) interview questions for linux (2) Is ‘Ultra-Processed’ Food Really That Bad for You? (1) Is Amazon Prime Really Worth It? (1) It Might Be a Scam (1) July 14 (1) July 21 (1) July 28 (1) July 7 (1) June 30 (1) LifeHacker (139) Linux (36) Make and Freeze Some Roux Now for Easy Turkey Gravy (1) Meta Releases Largest Open-Source AI Model Yet (1) Monitoring (3) music (688) My Favorite 14TB Hard Drive Is 25% Off Right Now (1) My Favorite Amazon Deal of the Day: Apple AirPods Max (2) My Favorite Amazon Deal of the Day: Apple Pencil Pro (1) My Favorite Amazon Deal of the Day: Google Nest Mesh WiFi Router (1) My Favorite Amazon Deal of the Day: Google Pixel 8 (1) My Favorite Amazon Deal of the Day: PlayStation 5 (1) My Favorite Amazon Deal of the Day: Samsung Odyssey G9 Gaming Monitor (1) My Favorite Amazon Deal of the Day: SHOKZ OpenMove Bone Conduction Headphones (1) My Favorite Amazon Deal of the Day: The 13-Inch M3 Apple MacBook Air (1) My Favorite Amazon Deal of the Day: These Bose QuietComfort Headphones (1) My Favorite Tools for Managing Cords and Cables (1) Nagios (2) Newtorking (1) NFS (1) OMG! Ubuntu! (688) Oracle Linux (1) oracleasm (3) osnews (28) Password less communication (1) Patching (2) Poaching Is the Secret to Perfect Corn on the Cob (1) powerpath (1) Prioritize Your To-Do List By Imagining Rocks in a Jar (1) Red Hat Exam (1) register (74) Rsync (1) Safari’s ‘Distraction Control’ Will Help You Banish (Some) Pop Ups (1) Samba (1) Scrcpy (1) September 1 (1) September 15 (1) September 2 (1) September 22 (1) September 23 (1) September 30 (1) September 8 (1) Seven Home 'Upgrades' That Aren’t Worth the Money (1) Seven Things Your Credit Card’s Trip Protection Won’t Actually Cover (1) Six Unexpected Household Uses for Dry-Erase Markers (1) ssh (1) Swift Shift Is the Window Management Tool Apple Should Have Built (1) System hardening (1) Tailor Your iPhone's Fitness Summary to Your Workouts (1) Target’s ‘Circle Week’ Sale Is Still Going After October Prime Day (1) Target’s Answer to Prime Day Starts July 7 (1) Tech (9544) Tech CENTRAL (24) Technical stories (131) technpina (7) The 30 Best Movies of the 2020s so Far (and Where to Watch Them) (1) The 30 Best Sports Movies You Can Stream Right Now (1) The Best Deals on Robot Vacuums for Amazon’s Early Prime Day Sale (2) The Best Deals on Ryobi Tools During Home Depot's Labor Day Sale (1) The Best Early Prime Day Sales on Power Tools (1) The Best Movies and TV Shows to Watch on Netflix This Month (1) The Best October Prime Day Deals If You Are Experiencing Overwhelming Existential Dread (1) The Best Places to Go When You Don't Want to Be Around Kids (1) The Best Places to Order Thanksgiving Dinner to Go (1) The Best Strategies for Lowering Your Credit Card Interest Rate (1) The Best Ways to Store All Your Bags and Purses (1) The Latest watchOS Beta Is Breaking Apple Watches (1) The New Disney+ (1) The Two Best Times of Year to Look for a New Job (1) the X Rival Everyone's Flocking To (1) These Bissell Vacuums Are on Sale Ahead of Black Friday (and They're All Great) (1) These Meatball Shots Are My Favorite Football Season Snack (1) These Milwaukee Tools Are up to 69% off Right Now (1) This 2024 Sony Bravia Mini-LED TV Is $400 Off Right Now (1) This 75-Inch Hisense ULED 4K TV Is $500 Off Right Now (1) This Google Nest Pro Is 30% Off for Prime Day (1) This Peanut Butter Latte Isn’t As Weird As It Sounds (1) This Tech Brand Will Get the Biggest Discounts During Prime Day (1) Three Quick Ways to Shorten a Necklace (1) Three Services People Don't Know They Can Get From Their Bank for Free (1) Today’s Wordle Hints (and Answer) for Monday (4) Today’s Wordle Hints (and Answer) for Sunday (11) Try 'Pile Cleaning' When Your Mess Is Overwhelming (1) Try 'Pomodoro 2.0' to Focus on Deep Work (1) Try 'Rucking' (1) Ubuntu News (347) Ubuntu! (1) Unix (1) Use This App to Sync Apple Reminders With Your iPhone Calendar (1) Use This Extension to Find All Your X Followers on Bluesky (1) veritas (2) Videos (1) Was ChatGPT Really Starting Conversations With Users? (1) Watch Out for These Red Flags in a Realtor Contract (1) Wayfair Is Having a '72-Hour Closeout' Sale to Compete With Prime Day (1) We Now Know When Google Will Roll Out Android 15 (1) What Is the 'Die With Zero' Movement (and Is It Right for You)? (1) What Not to Do When Training for a Marathon (1) What to Do When Your Employer Shifts Your Pay From Salary to Hourly (1) What to Look for (and Avoid) When Selecting a Pumpkin (1) What to Wear to Run in the Cold (1) What's New on Prime Video and Freevee in September 2024 (1) Why You Can't Subscribe to Disney+ and Hulu Through Apple Anymore (1) Why Your Home Gym Needs Adjustable Kettlebells (1) Windows (5) You Can Easily Add Words to Your Mac's Dictionary (1) You Can Get 'World War Z' on Sale for $19 Right Now (1) You Can Get a Membership to BJ's for Practically Free Right Now (1) You Can Get Beats Studio Buds+ on Sale for $100 Right Now (1) You Can Get Microsoft Visio 2021 Pro on Sale for $20 Right Now (1) You Can Get This 12-Port USB-C Hub on Sale for $90 Right Now (1) You Can Get This Roomba E5 Robot Vacuum on Sale for $170 Right Now (1) You Can Hire Your Own Personal HR Department (1) You Can Search Through Your ChatGPT Conversation History Now (1) You Can Set Different Scrolling Directions for Your Mac’s Mouse and Trackpad (1)

Recent Comments

Popular Posts

Translate

My Blog List

Popular

System Admin Share

Total Pageviews