Bash macht es noch nicht einfach, Dateien nach Änderungszeit zu sortieren. Hier ist die obligatorische zsh-basierte Antwort. Sie müssen nicht als Anmeldeshell zu zsh wechseln, um die Funktionen nutzen zu können.
Hier habe ich eine Wrapper-Funktion eingerichtet, die entweder ein oder zwei Argumente erwartet. das erste Argument ist das auszuführende Programm (zB myprogram
); Das zweite optionale Argument ist das Verzeichnis mit den Dateien, die Sie an das Programm übergeben möchten. Wenn Sie kein zweites Argument angeben, wird standardmäßig das aktuelle Verzeichnis verwendet.
zeio() {
# Zsh-based Execute with files In Order
[ -d "${2:-.}" ] || return
zsh -c "$1 \"${2:-.}\"/*(.om)"
}
Nennen Sie es natürlich wie Sie wollen. Nach einer kurzen Überprüfung des zweiten Arguments (standardmäßig .
das aktuelle Verzeichnis) rufen wir zsh mit einer einzelnen Zeichenfolge in doppelten Anführungszeichen auf, die das Programm und einige Anfangsargumente (Argument 1) und das Verzeichnis (Argument #) enthält. 2) - standardmäßig .
- mit einer Wildcard / Glob-Erweiterung, die zwei "Glob-Qualifizierer" in der nachfolgenden Klammer enthält:
.
- müssen reguläre Dateien sein (keine Verzeichnisse oder Symlinks usw.)
om
- o
Sortieren Sie die resultierende Liste nach Änderungszeit, zuletzt zuerst
Es ist dieses om
Glob-Qualifikationsmerkmal, das die ganze eigentliche Arbeit hier erledigt.
Hier sind einige Beispielläufe. myprog
ist ein einfaches Shell-Skript, um die empfangenen Argumente in der folgenden Reihenfolge zu demonstrieren:
#!/bin/sh
for arg do
printf 'Arg: ->%s<-\n' "$arg"
done
und go.sh
ist die Datei, in der ich die Funktion gespeichert habe. Der Rest der Verzeichnisstruktur lautet:
$ tree .
.
├── dir1
│ ├── 203142
│ ├── 203143
│ └── 203144
├── dir3
│ ├── first\012filename
│ ├── this is 3rd
│ └── this is second
├── dir two
│ ├── 203225
│ ├── 203226
│ └── 203227
├── go.sh
└── myprog
... wo ich die Sätze von drei Dateien in jedem Unterverzeichnis in der aufgelisteten Reihenfolge erstellt habe; Ich erwarte, sie in derselben Reihenfolge zu sehen, wenn ich die Funktion ausführe. Der erste Dateiname unter dir3 enthält eine neue Zeile, dargestellt durch tree
mit \012
. Die Ergebnisse sind:
Demonstration des Verhaltens des Standardverzeichnisses im aktuellen Verzeichnis:
$ zeio ./myprog
Arg: ->./myprog<-
Arg: ->./go.sh<-
Normale Dateinamen-Demonstration
$ zeio ./myprog dir1
Arg: ->dir1/203142<-
Arg: ->dir1/203143<-
Arg: ->dir1/203144<-
Das Verzeichnis enthält ein Leerzeichen
$ zeio ./myprog "dir two"
Arg: ->dir two/203225<-
Arg: ->dir two/203226<-
Arg: ->dir two/203227<-
Dateinamen enthalten Leerzeichen
$ zeio ./myprog dir3
Arg: ->dir3/first
filename<-
Arg: ->dir3/this is second<-
Arg: ->dir3/this is 3rd<-
parsing ls
keine gute Praxis?ls -rt | myprogram
würde funktionieren, würde der Dateiname, wenn er ein Leerzeichen hat, einfachobject-oriented\ data\ model.pdf
einen Backslash vor jedem Leerzeichen verwenden. Oder wennmyprogram
es in C geschrieben ist, könnten Sie es verwenden.popen("ls -rt", "r")
Ich mache das die ganze Zeit und es funktioniert großartig.