Wie verwende ich die Ausgabe von ls, um die zuletzt geänderte Datei zu öffnen?

Wie verwende ich die Ausgabe von ls, um die zuletzt geänderte Datei zu öffnen?

Gibt es eine Möglichkeit, die Ausgabe von ls -ltrmit 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 lsnicht 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 lsunterstützt , und-z-0die Betreuer von GNU lshaben 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 lsGebietsschema C kann die Ausgabe mit der Option mit oder --quoting-style=shell-alwaysnachbearbeitet werden :zshksh93bash

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 zshverfügt über integrierte Unterstützung zum Sortieren von Dateien nach Änderungszeit (und vielen anderen Kriterien, die weit über lsdie Möglichkeiten hinausgehen).

FreeBSD lsbietet eine --libxoOption 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

verwandte Informationen