So geben Sie mehrere Dateinamen mit weniger Tastenanschlägen ein

16

Wenn ich mit imagemagick ein pdfin ein pngBild 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 pngDatei mit Ausnahme der Erweiterung denselben Namen hat.

Normalerweise wähle ich this_is_a_very_long_filename_of_my_pdf_file.pdfzweimal über Register und , zsh-menuund ändern Sie dann pdfauf pngmanuell für das zweite Argument.

Gibt es jedoch einen schnelleren Weg, dies zu tun?

Schüler
quelle

Antworten:

23

Sie können Klammererweiterungen verwenden :

convert -trim -density 400 this_is_a_very_long_filename_of_my_pdf_file.{pdf,png}
Nandhp
quelle
1
Kann auch die automatische Vervollständigung von Dateinamen vermerken (es ist in zsh vorhanden, nicht wahr?)
Ruslan
@ Ruslan Das OP sagte, er benutzt Autocomplete. Aber trotzdem, schöner Zeitsparpunkt.
Cammy_the_block
5

Dieser Aufruf an mogrify erzeugt eine neue PNG-Datei, anstatt die PDF-Datei zu überschreiben - hoffentlich;)

mogrify -trim density 400 -format png th*.pdf

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.

Gugu
quelle
5

Wenn Sie immer den gleichen Befehl mit kleinen Variationen (wie dem Dateinamen) verwenden, können Sie eine Funktion schreiben:

pdf2png() { convert -trim -density 400 "$1" "$1:r.png" }

(Diese Funktion ist spezifisch für zsh) und für jede Datei your_file.pdf, die Sie konvertieren möchten:

pdf2png your_file.pdf

Hinweis 1: Sie können die gleiche Art von Funktion für andere Shells schreiben, dies ist jedoch etwas komplexer.

Hinweis 2: Mit zshsind die Anführungszeichen nur dann nützlich, wenn die SH_WORD_SPLITOption aktiviert ist (was nicht die Standardeinstellung ist).

vinc17
quelle
4

Erwägen Sie die Verwendung von Variablen zum Speichern Ihrer Dateinamen. Sie werden auch automatisch vervollständigt:

f="this_is_a_very_long_filename_of_my_pdf_file"
convert -trim -density 400 "$f.pdf" "$f.png"

Ich benutze Zitate, weil manchmal Leerzeichen beißen.

Wesentliche Vorteile davon sind:

  1. Sie können weitere Operationen mit dem Wert in $ f ausführen, wenn Sie wissen, dass er auf die richtige Datei verweist
  2. Es ist der kürzeste Hopfen, der in eine cat listOfFiles | while read f; do ... ; doneSchleifenstruktur gesteckt wird.
  3. Oft sind sich automatisch generierte Dateinamen sehr ähnlich, und die automatische Vervollständigung wird sehr schnell ärgerlich, wenn Sie dies tun müssen 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 wie f=\ls -t | Kopf -1``, anstatt zuerst die Suche zu starten, nach dem Dateinamen zu suchen und ihn wie einen trainierten Affen zu transkribieren.
Phil H
quelle
2

Sie können die Verlaufserweiterung auch verwenden , um auf Wörter in der aktuellen Befehlszeile zu verweisen:

convert -trim -density 400 this_is_a_very_long_filename_of_my_pdf_file.pdf !#:$:r.png
  • Der Ereignisbezeichner !# bezieht sich auf die bisher eingegebene Befehlszeile
  • Wortkennung $ kennzeichnet das letzte Wort (vor der Erweiterung)
  • Modifier r entfernt die Dateierweiterung. Dies markiert auch das Ende des Texts, das beim Erweitern des Verlaufs ersetzt wird.
  • .pngist die neue Erweiterung. Dies gehört nicht zur Erweiterung selbst.

Wenn diese Zeile ausgeführt wird, !#:$:rwird sie durch den Namen Ihrer PDF-Datei ohne die Erweiterung ersetzt, wodurch der Befehl aus der Frage erstellt wird:

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

Diese Zeile wird dann direkt ausgeführt.

Wenn Sie den Befehl nach der Protokollerweiterung vor der Ausführung überprüfen möchten, verwenden Sie

setopt histverify

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 wie echo echound nicht wie echo !#in deinem $HISTFILE.

Adaephon
quelle
2

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:

bindkey '^W' copy-prev-shell-word

Wenn Sie so faul sind wie ich, verwenden Sie diese Bindkey-Sequenz

bindkey '^W^W' copy-prev-shell-word
bindkey -s '^W' ' ^W^W'

um folgendes Verhalten zu erhalten:

  • CTRL+Wfü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 ein
mpy
quelle