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, ~/Downloads
um 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 -t
mit 'ing ~/Downloads
zu ü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
. ~/bin
ist ein guter Platz dafür.
Denken Sie daran, sicherzustellen
- Das Skript ist ausführbar
chmod +x ~/bin/script_name
~/bin
ist in Ihrem$PATH
Verwendung
Übergeben Sie den Befehl, den Sie für die neueste Datei ausführen möchten, ~/Download
an last_download
.
Beispiele
Angenommen, Sie haben das Skript benanntlast_download
last_download
(keine Argumente): führtevince
den Standardbefehl auf der neuesten Datei in~/Downloads
last_download mplayer
: läuftmplayer
auf der neuesten Datei in~/Downloads
last_download cp -t ~/Desktop
: kopiert die neuste Datei~/Downloads
nach~/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, ~/Download
aber 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
.