Diese semi-einzelne Zeile druckt die "nächtlichen" Dateien:
( \ llimit=$((60*5+0)); \ ulimit=$((60*22+45)); \ find -type f -exec bash -c '\ hm=`stat -c "%y" "$0" | cut -c 12-16`; \ t=$((60*10#`echo $hm | cut -c 1-2`+10#`echo $hm | cut -c 4-5`)); \ test \( $t -lt $1 \) -o \( $t -gt $2 \)' \ {} $llimit $ulimit \; \ -print \ )
Unterzeilen erklärt:
- Startet eine Subshell, um die Variablen lokal zu machen.
- Berechnet die Untergrenze in Minuten nach Mitternacht.
- Berechnet die Obergrenze.
- Für jede Datei wird eine separate
bash
ausgeführt. Es wird die Arithmetik machen. - Extrahiert mtime as
HH:MM
. - Konvertiert
HH:MM
in einen Wert als Minuten nach Mitternacht. - Vergleicht diesen Wert mit vorberechneten Grenzwerten.
- Dies sind Argumente für das Innere
bash
; innen, werden sie bezeichnet als$0
,$1
,$2
. - Gibt den Pfad aus, wenn der vorherige Test true zurückgibt.
- Beendet die Subshell.
Einige Anmerkungen:
-exec
kann beimfind
Aufruf als Test dienen . Das ist kaum offensichtlich und doch sehr mächtig. In diesem Fall ist der Test wahr, wenn der letzte Teil der innerenbash
Befehlszeile (dhtest
) den Wert true zurückgibt (dh der Beendigungsstatus ist0
).- Bash-Arithmetik (
$((…))
) parst01
oder so als Oktalzahl08
und09
ist ungültige Oktalzahl. Deshalb müssen wir10#
sicherstellen, dass alle aus derstat
Ausgabe extrahierten Zahlen als Dezimalzahlen interpretiert werden. - Ich habe benutzt
-lt
und-gt
intest
. Verwenden Sie-le
und / oder-ge
wenn sie besser zu Ihnen passen. - Um Dateien zu entfernen, ersetzen Sie sie
-print
mit-delete
(oder verwenden Sie sie zusammen:)-print -delete
. Um Dateien in ein einzelnes Verzeichnis zu verschieben, ersetzen Sie diese
-print
mit-print0
und erstellen eine Pipe wie folgt:( … find … -print0 ) | xargs -0r mv -t /target/directory/