Comment taper plusieurs noms de fichiers avec moins de touches

16

Si je veux convertir un pdfen pngimage avec imagemagick, je fais quelque chose comme:

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

Le fichier pdf a souvent un nom de fichier très long pour certaines raisons et je veux que le pngfichier ait le même nom sauf l'extension.

En général , je choisis this_is_a_very_long_filename_of_my_pdf_file.pdfdeux fois par onglet et zsh-menuet puis changer pdfà la pngmain pour le second argument.

Cependant, existe-t-il un moyen plus rapide de le faire?

étudiant
la source

Réponses:

23

Vous pouvez utiliser des extensions d'accolade :

convert -trim -density 400 this_is_a_very_long_filename_of_my_pdf_file.{pdf,png}
nandhp
la source
1
Peut également noter l'auto-complétion du nom de fichier (il est présent dans zsh, n'est-ce pas?)
Ruslan
@Ruslan L'OP a déclaré qu'il utilise la saisie semi-automatique. Mais bon point de gain de temps.
Cammy_the_block
5

Cet appel à mogrify créera un nouveau fichier png au lieu d'écraser le pdf - j'espère;)

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

pour th * .pdf, utilisez le nombre approprié de caractères pour sélectionner le bon fichier ou une meilleure tabulation jusqu'à ce que vous ayez le nom complet.

De cette façon, vous pouvez créer un alias pour la commande entière jusqu'au paramètre png.

gugu
la source
5

Si vous utilisez toujours la même commande avec de petites variations (comme le nom du fichier), vous pouvez écrire une fonction:

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

(cette fonction est spécifique à zsh), et pour chaque fichier your_file.pdf que vous souhaitez convertir:

pdf2png your_file.pdf

Remarque 1: vous pouvez écrire le même type de fonction pour d'autres shells, mais c'est un peu plus complexe.

Remarque 2: Avec zsh, les guillemets ne sont utiles que si l' SH_WORD_SPLIToption est définie (ce qui n'est pas la valeur par défaut).

vinc17
la source
4

Pensez à utiliser des variables pour stocker vos noms de fichiers. Ils remplissent également automatiquement:

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

J'utilise des guillemets car parfois les espaces mordent.

Les avantages significatifs de ceci sont:

  1. Vous pouvez effectuer d'autres opérations avec la valeur en $ f, sachant qu'elle pointe vers le bon fichier
  2. C'est le plus court des sauts pour coller cela dans une cat listOfFiles | while read f; do ... ; donestructure en boucle.
  3. Souvent, les noms de fichiers générés automatiquement sont très similaires, et la saisie automatique devient très ennuyeuse très rapidement si vous devez le faire, abc<tab>d<tab>x<tab>2<tab>etc. De cette façon, vous n'avez qu'à le taper une fois, et vous pouvez même récupérer le dernier fichier ou le plus gros fichier via un script comme f=\ls -t | head -1 '', au lieu d'exécuter d'abord la recherche, de rechercher le nom de fichier et de le transcrire comme une sorte de singe entraîné.
Phil H
la source
2

Vous pouvez également utiliser l' historique pour faire référence aux mots de la ligne de commande actuelle:

convert -trim -density 400 this_is_a_very_long_filename_of_my_pdf_file.pdf !#:$:r.png
  • Le désignateur d'événement !# fait référence à la ligne de commande tapée jusqu'à présent
  • Le désignateur de mot $ indique le dernier mot (avant l'extension)
  • Le modificateur r supprime l'extension du fichier. Cela marque également la fin du texte, qui est remplacé lorsque l'expansion de l'historique se produit.
  • .pngest la nouvelle extension. Cela n'appartient pas à l'expansion elle-même.

Lorsque cette ligne est exécutée, !#:$:rest remplacée par le nom de votre fichier pdf moins l'extension, créant ainsi la commande à partir de la question:

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

Cette ligne est alors directement exécutée.

Si vous souhaitez vérifier la commande après l'expansion de l'historique, avant l'exécution, utilisez

setopt histverify

Cela rechargera la ligne développée dans le tampon d'édition au lieu de l'exécuter.

Remarque: contrairement à toute autre extension, l'expansion de l'historique est effectuée avant l'enregistrement de la commande dans l'historique. Ainsi echo !#apparaîtra comme echo echoet non comme echo !#dans votre $HISTFILE.

Adaephon
la source
2

L'utilisation de l'accolade ne peut pas être battue pour cet exemple spécial. Cependant, un peu plus flexible est le widget zle copy-prev-shell-word, qui fait ce que son nom suggère et est pratique si vous voulez un argument similaire au précédent, qui ne peut pas systématiquement en dériver.

Liez le widget par exemple à CTRL+W:

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

Si vous êtes aussi paresseux que moi, utilisez cette séquence de touches

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

pour obtenir le comportement suivant:

  • CTRL+Winsère le mot de shell précédent avec un blanc de début (par conséquent, vous enregistrez une frappe!)
  • CTRL+W CTRL+W insère directement le mot shell précédent
mpy
la source