
Ich habe ein Verzeichnis in
Mein Haupt-DIR ist/tmp/folder
Darin /tmp/folder
befinden sich nur eine X-Anzahl von Ordnern (keine Dateien). Zum Beispiel
/tmp/folder/1
/tmp/folder/2
/tmp/folder/3
/tmp/folder/4
/tmp/folder/5
In diesen Ordnern befinden sich viele Dateien mit derselben Erweiterung. Ich möchte aus jedem dieser Ordner die zuletzt und zuerst erstellten Dateien (Änderungszeit) abrufen.
Die Ausgabe sollte meiner Meinung nach so aussehen
/tmp/folder/1,OLD_FILE,NEW_FILE
/tmp/folder/2,OLD_FILE,NEW_FILE
/tmp/folder/3,OLD_FILE,NEW_FILE
/tmp/folder/4,OLD_FILE,NEW_FILE
/tmp/folder/5,OLD_FILE,NEW_FILE
Ich werde diese Ausgabe mithilfe eines Skripts analysieren, Sie können also jede gewünschte Ausgabe erstellen. Bitte tun Sie dies jedoch auf benutzerfreundliche Weise, damit ich sie problemlos analysieren kann.
Der Bash-Befehl sollte nur 1 sein
Antwort1
find "$DIR" -type d | while read d; do echo "$d,$(ls -t "$d" | sed -n '1h; $ { G; s/\n/,/g; p }')"; done
Oder in einem besser lesbaren Format und unter Verwendung einer zusätzlichen Variablen zur Demonstration:
find "$DIR" -type d |
while read d;
do
files=$(ls -t "$d" | sed -n '1h; $ { G; s/\n/,/g; p }')
printf '%s,%s\n' "$d" "$files";
done
Dadurch werden alle Unterverzeichnisse gefunden, die mit $DIR
dem find
Befehl aufgerufen wurden. Für jedes gefundene Verzeichnis wird ls -tr
eine Liste der Dateien in diesem Verzeichnis angezeigt, sortiert nach Datum (die neusten zuerst).
Die Ausgabe von „pipe“ ls -tr
in „ sed
verbindet die erste und letzte Zeile mit einem Komma“: Option -n
unterdrückt die Standardausgabe, 1h
speichert die erste Zeile (neuester Dateiname) in derLeertaste gedrückt halten, und hängt in der letzten Zeile der Datei (ausgewählt durch $
) den Haltebereich (neuester Dateiname) an H
den Musterbereich (durch eine neue Zeile getrennt) an und ändert diese neue Zeile in ein Komma.
Das Skript printf
gibt dann den Namen des Unterverzeichnisses ein, gefolgt von einem Komma und den Dateien, die daraus stammen sed
.
Bei der ältesten/neuesten Auswahl wird nicht zwischen Verzeichnissen und Dateien unterschieden. Wenn Sie dort also keine Verzeichnisse möchten, müssen Sie die Ausgabe filtern, ls -t
um die Verzeichnisse zu entfernen.