Vielleicht so etwas:
find . -type d -print0 | while read -r -d '' dir; do file="$(find "$dir" -maxdepth 1 -type f -printf '%T+ %p\n' | sort -r | head -1 | cut -d' ' -f2-)";if [ -n "$file" ]; then touch "$dir" -mr "$file"; fi; done
Erläuterung:
Um das Änderungsdatum von einer Datei an eine andere zu übergeben, müssen Sie Folgendes ausführen:
touch file1 -mr file2
Zuerst müssen wir Unterverzeichnisse finden:
find . -type d -print0 | while read -r -d '' dir; do echo "$dir"; done
In diesem Fall -exec
würde die Option zu komplex werden. Sie müssen sicherstellen, dass Sie die Ausgabe von find
mit NUL
als Datensatztrennzeichen übermitteln und angeben read
, dass das Split ( -d ''
) erfolgen soll.
Um Dateien mit dem letzten Änderungsdatum zu finden, kann ich Folgendes verwenden:
find ./ -maxdepth 1 -type f -printf '%T+ %p\n' | sort -r | head -1 | cut -d' ' -f2-
Kombiniere es:
find . -mindepth 1 -type d -print0 | while read -r -d '' dir; do file="$(find "$dir" -maxdepth 1 -type f -printf '%T+ %p\n' | sort -r | head -1 | cut -d' ' -f2-)";echo "$dir <- $file"; done
Zum Schluss fügen Sie einen Touch hinzu:
find . -mindepth 1 -type d -print0 | while read -r -d '' dir; do file="$(find "$dir" -maxdepth 1 -type f -printf '%T+ %p\n' | sort -r | head -1 | cut -d' ' -f2-)";touch "$dir" -mr "$file"; done
Ich verwende die -mindepth
Option hier, weil ich diesen Befehl aus einem Verzeichnis mit dir_a gestartet habe, das keine Datei zum Lesen des Datums enthält. Um dieses Problem zu beseitigen, kann ich if-else verwenden, um sicherzustellen, dass ich nicht versuche, die Zeit aus einer nicht vorhandenen Datei zu lesen:
find . -type d -print0 | while read -r -d '' dir; do file="$(find "$dir" -maxdepth 1 -type f -printf '%T+ %p\n' | sort -r | head -1 | cut -d' ' -f2-)";if [ -n "$file" ]; then touch "$dir" -mr "$file"; fi; done