<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
		<id>http://www.hypersecuresolutions.com/wiki/index.php?action=history&amp;feed=atom&amp;title=Dirvish_Cleanup</id>
		<title>Dirvish Cleanup - Revision history</title>
		<link rel="self" type="application/atom+xml" href="http://www.hypersecuresolutions.com/wiki/index.php?action=history&amp;feed=atom&amp;title=Dirvish_Cleanup"/>
		<link rel="alternate" type="text/html" href="http://www.hypersecuresolutions.com/wiki/index.php?title=Dirvish_Cleanup&amp;action=history"/>
		<updated>2026-04-17T03:11:53Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://www.hypersecuresolutions.com/wiki/index.php?title=Dirvish_Cleanup&amp;diff=2686&amp;oldid=prev</id>
		<title>Srapaz: Created page with &quot;Script that will do a dry-run of outdated files to be deleted for Dirvish. Once dry-run is completed and verified, a full run can be completed.  &lt;pre&gt; #!/usr/bin/env bash # cl...&quot;</title>
		<link rel="alternate" type="text/html" href="http://www.hypersecuresolutions.com/wiki/index.php?title=Dirvish_Cleanup&amp;diff=2686&amp;oldid=prev"/>
				<updated>2025-10-01T04:50:35Z</updated>
		
		<summary type="html">&lt;p&gt;Created page with &amp;quot;Script that will do a dry-run of outdated files to be deleted for Dirvish. Once dry-run is completed and verified, a full run can be completed.  &amp;lt;pre&amp;gt; #!/usr/bin/env bash # cl...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Script that will do a dry-run of outdated files to be deleted for Dirvish. Once dry-run is completed and verified, a full run can be completed. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env bash&lt;br /&gt;
# cleanup.sh / dirvish_purge_dates.sh&lt;br /&gt;
# Delete snapshot directories named YYYY-MM-DD (or loose prefix) under given roots.&lt;br /&gt;
# Dry-run preview by default. Use --force to actually delete.&lt;br /&gt;
&lt;br /&gt;
set -euo pipefail&lt;br /&gt;
&lt;br /&gt;
DRY_RUN=1&lt;br /&gt;
YES=0&lt;br /&gt;
LOOSE=0&lt;br /&gt;
YEARS=(2023 2024)&lt;br /&gt;
ROOTS=()&lt;br /&gt;
EXCLUDES=()&lt;br /&gt;
LOGFILE=&amp;quot;/var/log/dirvish_purge_dates.log&amp;quot;&lt;br /&gt;
&lt;br /&gt;
usage() {&lt;br /&gt;
cat &amp;lt;&amp;lt;&amp;#039;EOF&amp;#039;&lt;br /&gt;
Usage: cleanup.sh [options] &amp;lt;ROOT&amp;gt; [ROOT ...]&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
  -f, --force        Actually delete (default is dry-run preview).&lt;br /&gt;
  -y, --yes          Auto-confirm when prompted (still dry-run unless --force).&lt;br /&gt;
  --loose            Match prefix YYYY-* (not strict YYYY-MM-DD).&lt;br /&gt;
  --years LIST       Comma-separated years (e.g. 2021,2022,2023).&lt;br /&gt;
  --exclude LIST     Comma-separated dir-name patterns to skip.&lt;br /&gt;
  --log FILE         Path to log file (default: /var/log/dirvish_purge_dates.log).&lt;br /&gt;
  -h, --help         Show this help.&lt;br /&gt;
EOF&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# -----------------------------&lt;br /&gt;
# Parse arguments&lt;br /&gt;
# -----------------------------&lt;br /&gt;
while [[ $# -gt 0 ]]; do&lt;br /&gt;
  case &amp;quot;$1&amp;quot; in&lt;br /&gt;
    -f|--force) DRY_RUN=0; shift ;;&lt;br /&gt;
    -y|--yes) YES=1; shift ;;&lt;br /&gt;
    --loose) LOOSE=1; shift ;;&lt;br /&gt;
    --years)&lt;br /&gt;
      [[ $# -ge 2 ]] || { echo &amp;quot;Error: --years needs a value&amp;quot; &amp;gt;&amp;amp;2; exit 1; }&lt;br /&gt;
      IFS=&amp;#039;,&amp;#039; read -r -a YEARS &amp;lt;&amp;lt;&amp;lt; &amp;quot;$2&amp;quot;&lt;br /&gt;
      shift 2 ;;&lt;br /&gt;
    --exclude)&lt;br /&gt;
      [[ $# -ge 2 ]] || { echo &amp;quot;Error: --exclude needs a value&amp;quot; &amp;gt;&amp;amp;2; exit 1; }&lt;br /&gt;
      IFS=&amp;#039;,&amp;#039; read -r -a EXCLUDES &amp;lt;&amp;lt;&amp;lt; &amp;quot;$2&amp;quot;&lt;br /&gt;
      shift 2 ;;&lt;br /&gt;
    --log)&lt;br /&gt;
      [[ $# -ge 2 ]] || { echo &amp;quot;Error: --log needs a file path&amp;quot; &amp;gt;&amp;amp;2; exit 1; }&lt;br /&gt;
      LOGFILE=&amp;quot;$2&amp;quot;; shift 2 ;;&lt;br /&gt;
    -h|--help) usage; exit 0 ;;&lt;br /&gt;
    --) shift; break ;;&lt;br /&gt;
    -*) echo &amp;quot;Unknown option: $1&amp;quot; &amp;gt;&amp;amp;2; usage; exit 1 ;;                                                                                                                                       &lt;br /&gt;
     *) ROOTS+=(&amp;quot;$1&amp;quot;); shift ;;                                                                                                                                                               &lt;br /&gt;
  esac                                                                                                                                                                                        &lt;br /&gt;
done                                                                                                                                                                                          &lt;br /&gt;
                                                                                                                                                                                              &lt;br /&gt;
if [[ $# -gt 0 ]]; then ROOTS+=(&amp;quot;$@&amp;quot;); fi                                                                                                                                                     &lt;br /&gt;
if [[ ${#ROOTS[@]} -eq 0 ]]; then                                                                                                                                                             &lt;br /&gt;
  echo &amp;quot;Error: provide at least one ROOT directory.&amp;quot; &amp;gt;&amp;amp;2                                                                                                                                      &lt;br /&gt;
  usage; exit 1                                                                                                                                                                               &lt;br /&gt;
fi                                                                                                                                                                                            &lt;br /&gt;
                                                                                                                                                                                              &lt;br /&gt;
# -----------------------------                                                                                                                                                               &lt;br /&gt;
# Safety checks                                                                                                                                                                               &lt;br /&gt;
# -----------------------------                                                                                                                                                               &lt;br /&gt;
for r in &amp;quot;${ROOTS[@]}&amp;quot;; do                                                                                                                                                                    &lt;br /&gt;
  [[ -d &amp;quot;$r&amp;quot; ]] || { echo &amp;quot;Error: not a directory: $r&amp;quot; &amp;gt;&amp;amp;2; exit 1; }                                                                                                                         &lt;br /&gt;
  [[ &amp;quot;$r&amp;quot; == &amp;quot;/&amp;quot; ]] &amp;amp;&amp;amp; { echo &amp;quot;Refusing to operate on root /&amp;quot; &amp;gt;&amp;amp;2; exit 1; }                                                                                                                  &lt;br /&gt;
done                                                                                                                                                                                          &lt;br /&gt;
                                                                                                                                                                                              &lt;br /&gt;
if [[ $DRY_RUN -eq 0 ]]; then                                                                                                                                                                 &lt;br /&gt;
  mkdir -p &amp;quot;$(dirname &amp;quot;$LOGFILE&amp;quot;)&amp;quot;                                                                                                                                                            &lt;br /&gt;
  touch &amp;quot;$LOGFILE&amp;quot; || { echo &amp;quot;Cannot write log file: $LOGFILE&amp;quot; &amp;gt;&amp;amp;2; exit 1; }                                                                                                                 &lt;br /&gt;
fi                                                                                                                                                                                            &lt;br /&gt;
                                                                                                                                                                                              &lt;br /&gt;
join_alt() { local IFS=&amp;#039;|&amp;#039;; echo &amp;quot;${YEARS[*]}&amp;quot;; }                                                                                                                                             &lt;br /&gt;
                                                                                                                                                                                              &lt;br /&gt;
# -----------------------------                                                                                                                                                               &lt;br /&gt;
# Build exclusion arguments (returns a string)                                                                                                                                                &lt;br /&gt;
# -----------------------------                                                                                                                                                               &lt;br /&gt;
build_exclude_args() {                                                                                                                                                                        &lt;br /&gt;
  local args=()                                                                                                                                                                               &lt;br /&gt;
  if (( ${#EXCLUDES[@]} )); then                                                                                                                                                              &lt;br /&gt;
    for pat in &amp;quot;${EXCLUDES[@]}&amp;quot;; do                                                                                                                                                           &lt;br /&gt;
      args+=( -not -path &amp;quot;*/${pat}&amp;quot; -not -path &amp;quot;*/${pat}/*&amp;quot; )                                                                                                                                 &lt;br /&gt;
    done                                                                                                                                                                                      &lt;br /&gt;
  fi                                                                                                                                                                                          &lt;br /&gt;
  echo &amp;quot;${args[@]:-}&amp;quot;                                                                                                                                                                         &lt;br /&gt;
}                                                                                                                                                                                             &lt;br /&gt;
                                                                                                                                                                                              &lt;br /&gt;
# -----------------------------                                                                                                                                                               &lt;br /&gt;
# Build find command as array                                                                                                                                                                 &lt;br /&gt;
# -----------------------------                                                                                                                                                               &lt;br /&gt;
build_find_cmd() {                                                                                                                                                                            &lt;br /&gt;
  local root=$1                                                                                                                                                                               &lt;br /&gt;
  local excl_args                                                                                                                                                                             &lt;br /&gt;
  excl_args=$(build_exclude_args)                                                                                                                                                             &lt;br /&gt;
                                                                                                                                                                                              &lt;br /&gt;
  if (( LOOSE )); then                                                                                                                                                                        &lt;br /&gt;
    local cmd=(find &amp;quot;$root&amp;quot; -type d &amp;quot;(&amp;quot;)                                                                                                                                                      &lt;br /&gt;
    local first=1                                                                                                                                                                             &lt;br /&gt;
    for y in &amp;quot;${YEARS[@]}&amp;quot;; do                                                                                                                                                                &lt;br /&gt;
      if (( first )); then                                                                                                                                                                    &lt;br /&gt;
        cmd+=( -name &amp;quot;${y}-*&amp;quot; )                                                                                                                                                               &lt;br /&gt;
        first=0                                                                                                                                                                               &lt;br /&gt;
      else                                                                                                                                                                                    &lt;br /&gt;
        cmd+=( -o -name &amp;quot;${y}-*&amp;quot; )                                                                                                                                                            &lt;br /&gt;
      fi                                                                                                                                                                                      &lt;br /&gt;
    done                                                                                                                                                                                      &lt;br /&gt;
    cmd+=( &amp;quot;)&amp;quot; )                                                                                                                                                                              &lt;br /&gt;
    if [[ -n &amp;quot;$excl_args&amp;quot; ]]; then cmd+=( $excl_args ); fi                                                                                                                                    &lt;br /&gt;
    cmd+=( -prune -print0 )                                                                                                                                                                   &lt;br /&gt;
    printf &amp;#039;%s\0&amp;#039; &amp;quot;${cmd[@]}&amp;quot; | tr &amp;#039;\0&amp;#039; &amp;#039; &amp;#039;                                                                                                                                                   &lt;br /&gt;
  else                                                                                                                                                                                        &lt;br /&gt;
    local yrs                                                                                                                                                                                 &lt;br /&gt;
    yrs=$(join_alt)                                                                                                                                                                           &lt;br /&gt;
    local cmd=(find &amp;quot;$root&amp;quot; -regextype posix-extended -type d \                                                                                                                               &lt;br /&gt;
               -regex &amp;quot;.*/(${yrs})-[0-9]{2}-[0-9]{2}$&amp;quot; )                                                                                                                                      &lt;br /&gt;
    if [[ -n &amp;quot;$excl_args&amp;quot; ]]; then cmd+=( $excl_args ); fi                                                                                                                                    &lt;br /&gt;
    cmd+=( -prune -print0 )                                                                                                                                                                   &lt;br /&gt;
    printf &amp;#039;%s\0&amp;#039; &amp;quot;${cmd[@]}&amp;quot; | tr &amp;#039;\0&amp;#039; &amp;#039; &amp;#039;                                                                                                                                                   &lt;br /&gt;
  fi                                                                                                                                                                                          &lt;br /&gt;
}                                                                                                                                                                                             &lt;br /&gt;
                                                                                                                                                                                              &lt;br /&gt;
log_msg() {                                                                                                                                                                                   &lt;br /&gt;
  [[ $DRY_RUN -eq 0 ]] &amp;amp;&amp;amp; echo &amp;quot;[$(date &amp;#039;+%F %T&amp;#039;)] $*&amp;quot; &amp;gt;&amp;gt;&amp;quot;$LOGFILE&amp;quot;                                                                                                                           &lt;br /&gt;
}                                                                                                                                                                                             &lt;br /&gt;
                                                                                                                                                                                              &lt;br /&gt;
# -----------------------------                                                                                                                                                               &lt;br /&gt;
# Main                                                                                                                                                                                        &lt;br /&gt;
# -----------------------------                                                                                                                                                               &lt;br /&gt;
echo &amp;quot;=== $( ((DRY_RUN)) &amp;amp;&amp;amp; echo &amp;#039;DRY RUN&amp;#039; || echo &amp;#039;DELETION MODE (--force)&amp;#039;) ===&amp;quot;                                                                                                            &lt;br /&gt;
(( ${#EXCLUDES[@]} )) &amp;amp;&amp;amp; echo &amp;quot;Excluding patterns: ${EXCLUDES[*]}&amp;quot;                                                                                                                            &lt;br /&gt;
echo &amp;quot;Log file: $LOGFILE&amp;quot;                                                                                                                                                                     &lt;br /&gt;
                                                                                                                                                                                              &lt;br /&gt;
total=0                                                                                                                                                                                       &lt;br /&gt;
                                                                                                                                                                                              &lt;br /&gt;
for r in &amp;quot;${ROOTS[@]}&amp;quot;; do                                                                                                                                                                    &lt;br /&gt;
  echo &amp;quot;Scanning: $r&amp;quot;                                                                                                                                                                         &lt;br /&gt;
  cmd_array=($(build_find_cmd &amp;quot;$r&amp;quot;))                                                                                                                                                          &lt;br /&gt;
                                                                                                                                                                                              &lt;br /&gt;
  count=$(&amp;quot;${cmd_array[@]}&amp;quot; | tr -cd &amp;#039;\0&amp;#039; | wc -c | tr -d &amp;#039; &amp;#039;)                                                                                                                                &lt;br /&gt;
  echo &amp;quot;  Matches: $count&amp;quot;                                                                                                                                                                    &lt;br /&gt;
  total=$(( total + count ))                                                                                                                                                                  &lt;br /&gt;
                                                                                                                                                                                              &lt;br /&gt;
  if (( count &amp;gt; 0 )); then                                                                                                                                                                    &lt;br /&gt;
    echo &amp;quot;  Preview (up to 30):&amp;quot;                                                                                                                                                              &lt;br /&gt;
    &amp;quot;${cmd_array[@]/-print0/-print}&amp;quot; | head -n 30 | sed &amp;#039;s/^/    /&amp;#039;                                                                                                                           &lt;br /&gt;
                                                                                                                                                                                              &lt;br /&gt;
    if (( DRY_RUN == 0 )); then                                                                                                                                                               &lt;br /&gt;
      echo &amp;quot;  Deleting...&amp;quot;                                                                                                                                                                    &lt;br /&gt;
      &amp;quot;${cmd_array[@]}&amp;quot; | xargs -0 -I{} sh -c &amp;#039;echo &amp;quot;    removed: {}&amp;quot;; rm -rf -- &amp;quot;{}&amp;quot;&amp;#039;                                                                                                        &lt;br /&gt;
      &amp;quot;${cmd_array[@]}&amp;quot; | xargs -0 -I{} bash -c \                                                                                                                                             &lt;br /&gt;
        &amp;#039;printf &amp;quot;[%s] removed: %s\n&amp;quot; &amp;quot;$(date &amp;quot;+%F %T&amp;quot;)&amp;quot; &amp;quot;{}&amp;quot;&amp;#039; &amp;gt;&amp;gt;&amp;quot;$LOGFILE&amp;quot;                                                                                                                    &lt;br /&gt;
    fi                                                                                                                                                                                        &lt;br /&gt;
  fi                                                                                                                                                                                          &lt;br /&gt;
done                                                                                                                                                                                          &lt;br /&gt;
                                                                                                                                                                                              &lt;br /&gt;
echo &amp;quot;Total matches across roots: $total&amp;quot;                                                                                                                                                     &lt;br /&gt;
                                                                                                                                                                                              &lt;br /&gt;
if (( DRY_RUN == 1 &amp;amp;&amp;amp; total &amp;gt; 0 )); then                                                                                                                                                      &lt;br /&gt;
  echo                                                                                                                                                                                        &lt;br /&gt;
  if (( YES == 0 )); then                                                                                                                                                                     &lt;br /&gt;
    read -r -p &amp;quot;Type DELETE to remove these directories now (or Enter to abort): &amp;quot; ans                                                                                                        &lt;br /&gt;
    [[ &amp;quot;$ans&amp;quot; == &amp;quot;DELETE&amp;quot; ]] || { echo &amp;quot;Aborted. Nothing deleted.&amp;quot;; exit 0; }                                                                                                                 &lt;br /&gt;
  fi                                                                                                                                                                                          &lt;br /&gt;
                                                                                                                                                                                              &lt;br /&gt;
  exec_args=( --force )                                                                                                                                                                       &lt;br /&gt;
  (( LOOSE )) &amp;amp;&amp;amp; exec_args+=( --loose )                                                                                                                                                       &lt;br /&gt;
  exec_args+=( --years &amp;quot;$(IFS=&amp;#039;,&amp;#039;; echo &amp;quot;${YEARS[*]}&amp;quot;)&amp;quot; )                                                                                                                                     &lt;br /&gt;
  (( ${#EXCLUDES[@]} )) &amp;amp;&amp;amp; exec_args+=( --exclude &amp;quot;$(IFS=&amp;#039;,&amp;#039;; echo &amp;quot;${EXCLUDES[*]}&amp;quot;)&amp;quot; )                                                                                                       &lt;br /&gt;
  exec_args+=( --log &amp;quot;$LOGFILE&amp;quot; )                                                                                                                                                             &lt;br /&gt;
  exec_args+=( &amp;quot;${ROOTS[@]}&amp;quot; )                                                                                                                                                                &lt;br /&gt;
                                                                                                                                                                                              &lt;br /&gt;
  exec &amp;quot;$0&amp;quot; &amp;quot;${exec_args[@]}&amp;quot;                                                                                                                                                                 &lt;br /&gt;
else                                                                                                                                                                                          &lt;br /&gt;
  (( DRY_RUN )) &amp;amp;&amp;amp; echo &amp;quot;Dry-run complete. Nothing deleted.&amp;quot;                                                                                                                                  &lt;br /&gt;
fi            &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Srapaz</name></author>	</entry>

	</feed>