Ich habe mehrere Dateien mit demselben Änderungsdatum in einem Ordner, und ich möchte das Datum für alle Dateien in diesem Ordner und das gleiche für andere Ordner im Verzeichnis ändern, sodass der Inhalt des Änderungsdatums jedes Ordners unterschiedlich ist in einen beliebigen Ordner.
Wenn das nicht sinnvoll war, hier ist ein Screenshot eines Beispielverzeichnisses. Das Ziel besteht darin, das Änderungsdatum auf ein anderes Datum für den Inhalt des Ordners zu ändern und dasselbe mit dem Inhalt des anderen Ordners mit einem anderen Datum zu tun.
Ich weiß, dass es möglich ist, mehrere Dateien auf einmal zu berühren, indem man verwendet touch -t YYYYMMDDhhmm file1 file2 file3
, aber gibt es eine Möglichkeit, diesen Vorgang mit einem zufälligen Datum zu automatisieren?
Dies ist eine ungewöhnliche Anfrage. Ich bin mir nicht sicher, warum Sie das tun möchten, aber es hat mein Interesse geweckt. Wir verwenden jot
, um uns eine Zufallszahl zwischen 1 und 16000 auszuwählen.
jot -r 1 1 16000
Dies ist die Anzahl der Stunden, die wir vom aktuellen Datum abziehen.
seed=$(jot -r 1 1 16000)
date -v-"$seed"H "+%Y%m%d%H%M.%S"
Beachten Sie, dass date
oben das Datum so formatiert wird, dass es mit Touch funktioniert.
Jetzt listen wir find
alle Verzeichnisse im aktuellen Arbeitsverzeichnis auf und verwenden ein "Inline" -Skript, um alle Dateisystemobjekte in jedem Verzeichnis mit einer eindeutigen Änderungszeit in jedem Verzeichnis zu berühren.
find . ! -name '.' -type d -exec bash -c ' for dir
do
seed=$(jot -r 1 1 16000)
echo touch -t "$(date -v-"$seed"H "+%Y%m%d%H%M.%S")" "${dir}/"*
done
' sh {} \;
Wir sind noch nicht fertig, weil wir die Änderungszeiten von verschachtelten Verzeichnissen wahllos geändert haben. Wir wollen eindeutige Mod-Zeiten für jedes Verzeichnis.
find . ! -name '.' -type d -exec bash -c ' for dir
do
seed=$(jot -r 1 1 16000)
echo touch -t "$(date -v-"$seed"H "+%Y%m%d%H%M.%S")" "${dir}"
done
' sh {} \;
Und um alles zusammenzufassen-
#! /bin/ksh
find . ! -name '.' -type d -exec bash -c ' for dir
do
seed=$(jot -r 1 1 16000)
echo touch -t "$(date -v-"$seed"H "+%Y%m%d%H%M.%S")" "${dir}/"*
done
' sh {} \;
find . ! -name '.' -type d -exec bash -c ' for dir
do
seed=$(jot -r 1 1 16000)
echo touch -t "$(date -v-"$seed"H "+%Y%m%d%H%M.%S")" "${dir}"
done
' sh {} \;
Dieses Skript könnte fehlschlagen, wenn Sie ARG_MAX überschreiten, und listet derzeit nur die Änderungen auf, die durch Berührung vorgenommen würden. Sie können das echo
davor entfernen, touch
um die Änderungen vorzunehmen. Bitte beachten Sie, dass dieses Skript nur begrenzt getestet wurde und OHNE MÄNGELGEWÄHR angeboten wird.
touch
erforderlichen Sekunden nicht, aber es war einfach, den zu entfernen, %S
um ihn zu beheben.ksh
Irgendwie ist der Punkt bei der Umwandlung der Datumsfunktion in die Verwendung des externen date
Befehls für verloren gegangen bash
.
IconDaemon
HerrU