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- oSortieren Sie die resultierende Liste nach Änderungszeit, zuletzt zuerst
Es ist dieses omGlob-Qualifikationsmerkmal, das die ganze eigentliche Arbeit hier erledigt.
Hier sind einige Beispielläufe. myprogist 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.shist 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 treemit \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 lskeine gute Praxis?ls -rt | myprogramwürde funktionieren, würde der Dateiname, wenn er ein Leerzeichen hat, einfachobject-oriented\ data\ model.pdfeinen Backslash vor jedem Leerzeichen verwenden. Oder wennmyprogrames in C geschrieben ist, könnten Sie es verwenden.popen("ls -rt", "r")Ich mache das die ganze Zeit und es funktioniert großartig.