Shell: Dateien in einem Zeitraum finden und Grösse ermitteln

Die Dateien eines Monats oder Jahres aus einem grösseren Verzeichnis oder Verzeichnisbaum rausfiltern? Mit find kein Problem:

#!/bin/bash

date_start="201101010000.00";
date_end="201112312359.59";
range_start="/tmp/range_start";
range_end="/tmp/range_end";

logfile="/tmp/oldfiles.log";
start_dir="/home/user/Downloads";

# set range start marker
if [ -f $range_start ]; then
    rm -f $range_start;
fi
touch -t $date_start $range_start;

# set range end marker
if [ -f $range_end ]; then
    rm -f $range_end;
fi
touch -t $date_end $range_end;

# delete old logfile
if [ -f $logfile ]; then
    rm -f $logfile;
fi

# find all files in time range date_start:date_end and write their infos to logfile
find $start_dir -type f -newer $range_start ! -newer $range_end -print0 | xargs -0 ls -al > $logfile
# xargs is faster but may have problems with some dirnames - so here thr exec way
find $start_dir -type f -newer $range_start ! -newer $range_end -exec ls -al {}\; > $logfile

Falls mehrere Instanzen zum Einsatz kommen könnten, kann man auch noch mit einem pidfile arbeiten, um das Überschreiben der Range-Marker zu verhindern.
Find kann die Liste auch selber ausgeben find …. -ls, in diesem Fall wird wegen der Datumsdarstellung das Umleiten durch ls -al bevorzugt (geplante Weiterverarbeitung mit awk).

 

Die ganze Geschichte als Einzeiler (mit find option ls) und der Begrenzung auf eine Verzeichnisebene:

touch -t 201201010000.00 /tmp/range_start && touch -t 201212312359.59 /tmp/range_end && find /home/user/Downloads -maxdepth 1 -type f -newer /tmp/range_start ! -newer /tmp/range_end -ls > /tmp/oldfiles.log

(Aus Layoutgründen wurde die vorhergehende lange Zeile nicht in monospace gesetzt.)

 

Hier ein Teil der Weiterverarbeitung: Ermitteln der Grösse (in der 5. Spalte steht bei ls -al die Dateigrösse).

awk 'BEGIN{sum=0;}{sum+=$5;}END{print sum;}' /tmp/oldfiles.log

 

Schreibe einen Kommentar