Gibt es eine Möglichkeit, die Ausgabe von ls -ltr
mit zu verwenden xargs
?
Nehmen Sie an, dass das Ergebnis von ls eine Datei wie unten ist.
ls -ltr | tail -1 | xargs -I{} open {}
Zum Vergleich verwende ich den folgenden Befehl, um mit find Dateien zu verschieben:
find ~/Downloads/ -iname '*hello*' -print0 | xargs -0 -I{} mv {} ./
Können wir irgendwie NUL-Zeichen verwenden?
[Gelöst]
Wie in den Kommentaren von @illkachu erwähnt, funktioniert Folgendes, wird aber nicht empfohlen.
somecmd "$(ls -tr | tail -1)"
Was Stéphane vorschlägt, scheinen Alternativen zu sein.
Antwort1
Dies würden Sie im Allgemeinen nicht tun, da die Ausgabe ls
nicht zuverlässig nachbearbeitbar ist.
Zum Beispiel:
open -- "$(ls -t | head -n 1)"
funktioniert nicht, wenn der Name der neuesten Datei Zeilenumbruchzeichen enthält.
Idealerweise möchten Sie:
ls -zt | head -zn1 | xargs -r0 open --
Aber leider kenne ich keine Implementierung, die eine / -Option ls
unterstützt , und-z
-0
die Betreuer von GNU ls
haben es zumindest mehrfach abgelehnt, es hinzuzufügen.
Nun gibt es bei einigen Implementierungen auch andere Möglichkeiten.
Bei den GNU- und ast-open-Implementierungen von im ls
Gebietsschema C kann die Ausgabe mit der Option mit oder --quoting-style=shell-always
nachbearbeitet werden :zsh
ksh93
bash
export LC_ALL=C
eval "files=($(ls --quoting-style=shell-always -t))"
open -- "${files[0]}" # $files[1] with zsh
In zsh würden Sie jedoch einfach Folgendes tun:
open ./*(om[1])
oder:
offen ./Ctrl+Xm
Es zsh
verfügt über integrierte Unterstützung zum Sortieren von Dateien nach Änderungszeit (und vielen anderen Kriterien, die weit über ls
die Möglichkeiten hinausgehen).
FreeBSD ls
bietet eine --libxo
Option zum Generieren von JSON- oder XML-Ausgaben. Sie haben daher folgende Möglichkeiten:
ls --libxo=json -t | perl -MJSON::PP -0777 -l0 -ne '
print decode_json($_)
->{"file-information"}
->{directory}->[0]
->{entry}->[0]
->{name}' | xargs -r0 open --
Aber dann wäre es einfacher, das Ganze in zu machen perl
.
Antwort2
Wie Ihnen bereits gesagt wurde: Im Allgemeinen ist dies nicht der Ansatz, den Sie wählen sollten. Als Anfang jedoch:
ls -ltr | awk '/^-/ { print $9; }' | xargs