Aufstellen

Aufstellen

Ich lade häufig PDF-Dateien mit abscheulichen numerischen Dateinamen von meinem Browser herunter. Diese werden automatisch in . umgewandelt ~/Downloads. Idealerweise würde ich diese Dateien gerne einfach mit folgendem öffnen können:

evince "the most recently modified file"

ohne dass man sie öffnen muss, ~/Downloadsum den Dateinamen zu finden.

Gibt es eine einfache Möglichkeit, „die zuletzt geänderte Datei“ in anzugeben bash?

HINWEIS: Ich weiß, dass esmöglichum dies zu tun, aber idealerweise suche ich nach einer Lösung, die einfacher wäre, als den Namen ls -tmit 'ing ~/Downloadszu überprüfen.

Antwort1

evince "$(ls -t | head -n1)"

Obwohl Leerzeichen, Tabulatoren und (glaube ich) das Drucken von Sonderzeichen verarbeitet werden, bricht die Funktion ab, wenn der Dateiname eine neue Zeile enthält und möglicherweise auch bei einigen anderen nicht druckbaren Zeichen.

Antwort2

Dies ist ein korrekterer und robusterer Ansatz als ls -t, allerdings auf Kosten einer gewissen zusätzlichen Komplexität.

Aufstellen

Fügen Sie Ihrem ein kurzes Shell-Skript (Code unten) hinzu $PATH. ~/binist ein guter Platz dafür.

Denken Sie daran, sicherzustellen

  • Das Skript ist ausführbarchmod +x ~/bin/script_name
  • ~/binist in Ihrem$PATH

Verwendung

Übergeben Sie den Befehl, den Sie für die neueste Datei ausführen möchten, ~/Downloadan last_download.

Beispiele

Angenommen, Sie haben das Skript benanntlast_download

  • last_download(keine Argumente): führt evinceden Standardbefehl auf der neuesten Datei in~/Downloads
  • last_download mplayer: läuft mplayerauf der neuesten Datei in~/Downloads
  • last_download cp -t ~/Desktop: kopiert die neuste Datei ~/Downloadsnach~/Desktop

Code

#!/bin/sh
# Usage: last_download [cmd [options]...]

newest=
dir=~/Downloads

# default command
if [ $# -eq 0 ]; then
        set -- evince;
fi

# find newest file
for f in "$dir"/*; do
        if [ -z "$newest" ] || [ "$f" -nt "$newest" ]; then
                newest="$f"
        fi
done
if ! [ -e "$newest" ]; then
        exit 1
fi

# run command on newest file
"$@" "$newest"

Hinweis: Das Skript sucht nur hinein, ~/Downloadaber es wäre nicht schwer, es zu verallgemeinern, um jedes Verzeichnis zu unterstützen. In diesem Fall wäre auch eine Namensänderung gerechtfertigt.

Antwort3

exec zsh
evince ~/Downloads/*.pdf(om[1])

oder wenn Sie nicht zu zsh wechseln möchten

cd ~/Downloads
zsh -c 'evince ./*.pdf(om[1])'

Die Bits zwischen den Klammern sindGlob-Qualifikation. omändert die Reihenfolge der Globs, um die Änderungszeit statt des Namens zu verwenden (neueste zuerst). [1]bedeutet, dass nur die erste Übereinstimmung verwendet wird.

Weitere Informationen finden Sie unterdiese Antwort auf „Wie filtere ich einen Glob in zsh“.

Antwort4

Nein, und selbst wenn dies der Fall wäre, könnten Sie nicht sicher sein, dass es sich bei einem Systemprotokoll nicht in der Regel um die zuletzt aktualisierte Datei handelt.

Kevins Antwort (er kam mir zuvor) funktioniert, wenn Sie nur vermeiden möchtenmanuellÖffnung ~/Downloads.

verwandte Informationen