Wenn ich mit imagemagick ein pdf
in ein png
Bild konvertieren möchte, mache ich etwas wie:
convert -trim -density 400 this_is_a_very_long_filename_of_my_pdf_file.pdf this_is_a_very_long_filename_of_my_pdf_file.png
Die PDF-Datei hat aus bestimmten Gründen oft einen sehr langen Dateinamen, und ich möchte, dass die png
Datei mit Ausnahme der Erweiterung denselben Namen hat.
Normalerweise wähle ich this_is_a_very_long_filename_of_my_pdf_file.pdf
zweimal über Register und , zsh-menu
und ändern Sie dann pdf
auf png
manuell für das zweite Argument.
Gibt es jedoch einen schnelleren Weg, dies zu tun?
command-line
zsh
imagemagick
Schüler
quelle
quelle
Dieser Aufruf an mogrify erzeugt eine neue PNG-Datei, anstatt die PDF-Datei zu überschreiben - hoffentlich;)
Verwenden Sie für die * .pdf-Datei die entsprechende Anzahl von Zeichen, um die richtige Datei oder eine bessere Registerkartenvervollständigung auszuwählen, bis Sie den vollständigen Namen haben.
Auf diese Weise können Sie einen Alias für den gesamten Befehl bis zum Parameter png erstellen.
quelle
Wenn Sie immer den gleichen Befehl mit kleinen Variationen (wie dem Dateinamen) verwenden, können Sie eine Funktion schreiben:
(Diese Funktion ist spezifisch für
zsh
) und für jede Datei your_file.pdf, die Sie konvertieren möchten:Hinweis 1: Sie können die gleiche Art von Funktion für andere Shells schreiben, dies ist jedoch etwas komplexer.
Hinweis 2: Mit
zsh
sind die Anführungszeichen nur dann nützlich, wenn dieSH_WORD_SPLIT
Option aktiviert ist (was nicht die Standardeinstellung ist).quelle
Erwägen Sie die Verwendung von Variablen zum Speichern Ihrer Dateinamen. Sie werden auch automatisch vervollständigt:
Ich benutze Zitate, weil manchmal Leerzeichen beißen.
Wesentliche Vorteile davon sind:
cat listOfFiles | while read f; do ... ; done
Schleifenstruktur gesteckt wird.abc<tab>d<tab>x<tab>2<tab>
usw. Auf diese Weise müssen Sie sie nur einmal eingeben und können sogar die neueste oder die größte Datei abrufen über ein Skript wief=\
ls -t | Kopf -1``, anstatt zuerst die Suche zu starten, nach dem Dateinamen zu suchen und ihn wie einen trainierten Affen zu transkribieren.quelle
Sie können die Verlaufserweiterung auch verwenden , um auf Wörter in der aktuellen Befehlszeile zu verweisen:
!#
bezieht sich auf die bisher eingegebene Befehlszeile$
kennzeichnet das letzte Wort (vor der Erweiterung)r
entfernt die Dateierweiterung. Dies markiert auch das Ende des Texts, das beim Erweitern des Verlaufs ersetzt wird..png
ist die neue Erweiterung. Dies gehört nicht zur Erweiterung selbst.Wenn diese Zeile ausgeführt wird,
!#:$:r
wird sie durch den Namen Ihrer PDF-Datei ohne die Erweiterung ersetzt, wodurch der Befehl aus der Frage erstellt wird:Diese Zeile wird dann direkt ausgeführt.
Wenn Sie den Befehl nach der Protokollerweiterung vor der Ausführung überprüfen möchten, verwenden Sie
Dadurch wird die erweiterte Zeile neu in den Bearbeitungspuffer geladen, anstatt sie auszuführen.
Hinweis: Im Gegensatz zu anderen Erweiterungen wird die Verlaufserweiterung ausgeführt, bevor der Befehl im Verlauf gespeichert wird. So
echo !#
wird es erscheinen wieecho echo
und nicht wieecho !#
in deinem$HISTFILE
.quelle
Die Verwendung der Klammererweiterung ist für dieses spezielle Beispiel nicht zu übertreffen. Etwas flexibler ist jedoch das zle-Widget
copy-prev-shell-word
, das genau das tut, was der Name andeutet. Es ist praktisch, wenn Sie ein ähnliches Argument wie das vorherige haben möchten , das nicht systematisch abgeleitet werden kann.Binden Sie das Widget zB an
CTRL+W
:Wenn Sie so faul sind wie ich, verwenden Sie diese Bindkey-Sequenz
um folgendes Verhalten zu erhalten:
CTRL+W
fügt das vorherige Shell-Wort mit einem führenden Leerzeichen ein (Sie speichern also einen Tastendruck!)CTRL+W CTRL+W
Fügt das vorherige Shell-Wort direkt einquelle