Beim Arbeiten in der Konsole möchte man oft etwas mit der zuletzt modifizierten Datei machen. Hierfür kann eine kleine Bash-Funktion "lf" für "last file" geschrieben werden, welche schlicht den Namen der neuesten (bzw. zuletzt modifizierten) Datei zurückgibt. Übergibt man ein Argument, wird dies als auf die Datei anzuwendenes Kommando aufgefasst.
Hierfür legt man eine ausführbare Datei namens "~/.local/bin/lf" mit folgendem Inhalt an:
#!/bin/sh
# File: "~/.local/bin/lf
# Usage: lf [cmd [options]...] will execute cmd with the last modified file as argument
newest=
dir=`pwd`
# default command: just show the file
if [ $# -eq 0 ]; then
set -- ls;
fi
# find newest file
for f in "$dir"/*; do
if [ -f "$f" ]; then
if [ -z "$newest" ] || [ "$f" -nt "$newest" ]; then
newest="$f"
fi
fi
done
if ! [ -e "$newest" ]; then
exit 1
fi
# run command on newest file
"$@" "$newest"
Möchte man das ganze in der Fish-Shell benutzen, muss zusätzlich eine Umleitung in einer der Konfigurationsdateien von Fish, also zum Beispiel ~/.config/fish/config.fish angelegt werden:
function lf
bash -c '$HOME/.local/bin/lf "$@"' _ $argv
end
Diese eignet sich auch dafür, andere Bash-Funktionen in Fish einzupflegen.
Vorsicht ist geboten, wenn man in Verzeichnissen mit Schreibvorgängen anderer Programme oder Benutzer unterwegs ist, da die "neueste Datei" eventuell nicht die anvisierte Datei ist.
Nette Idee! Ich würde es lieber
nf
nennen (newest file), da für michlf
(last file) eher nach „last access“ klingt (das können wir aufgrund der üblichen mount-Optionnoatime
vergessen).Außerdem würde ich es stattdessen in eine kurze Funktion in der
.bashrc
(o. ä.) packen:Aufruf dann gleich.
Für mich häufiger nötig ist allerdings „die Datei, die ich im letzten Befehl verwendet habe“: Die erhält man (in Bash) mit
!$
, genau genommen das letzte Argument des letzten Befehls, also z. B. nach einemls /ganz/langer/komplizierter/pfad/datei.adoc
ein Bearbeiten miteditor !$
; mit einemalias e='editor'
geht es noch kürzer mite !$
:) Sollen es alle Argumente des letzten Befehls sein, entsprechend mit!*
.P. S.: Für einen solchen Kommentar vermisse ich die Vorschaufunktion vorm Abschicken schon – hoffen wir, dass es gutgeht ;)
Schade, im Code hat das nicht ganz funktioniert … Viele hier wissen es vielleicht, aber die obigen „Ampersand…Semikolon“ sind zu ersetzen durch:
amp
: Ampersandquot
: einfaches (englisches) AnführungszeichenDanke! Das $! für letztes Argument des letzten Befehls kannte ich noch nicht. Weißt du zufällig wie das in fish gemacht wird?
Interessant zu erwähnen ist vielleicht noch, dass bei vielen debianbasierten Distributionen in der .bashrc das entsprechenden PATH Argument für die Anwendun fehlt:
echo 'PATH="$HOME/bin:$HOME/.local/bin:$PATH"' >> ~/.bashrc source ~/.bashrc
gemeint war natürlich
echo 'PATH="$HOME/bin:$HOME/.local/bin:$PATH"' >> ~/.bashrc && source ~/.bashrc