Cómo escribir varios nombres de archivo con menos pulsaciones de teclas

16

Si quiero convertir pdfa una pngimagen con imagemagick, hago algo como:

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

El archivo pdf a menudo tiene un nombre de archivo muy largo por algunas razones y quiero que el pngarchivo tenga el mismo nombre, excepto la extensión.

Por lo general, selecciono this_is_a_very_long_filename_of_my_pdf_file.pdfdos veces a través de la pestaña y zsh-menuluego cambio pdfa pngmanualmente para el segundo argumento.

Sin embargo, ¿hay una manera más rápida de hacer esto?

estudiante
fuente

Respuestas:

23

Puede usar expansiones de llaves :

convert -trim -density 400 this_is_a_very_long_filename_of_my_pdf_file.{pdf,png}
nandhp
fuente
1
También puede notar la autocompletación de nombre de archivo (está presente en zsh, ¿no?)
Ruslan
@Ruslan El OP dijo que usa autocompletar. Pero aún así, un buen punto para ahorrar tiempo.
Cammy_the_block
5

Esta llamada a mogrify creará un nuevo archivo png en lugar de sobrescribir el pdf, con suerte;)

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

para th * .pdf, use el número apropiado de caracteres para seleccionar el archivo correcto o completar la pestaña mejor hasta que tenga el nombre completo.

De esta manera, puede crear un alias para todo el comando hasta el parámetro png.

gugu
fuente
5

Si siempre usa el mismo comando con pequeñas variaciones (como el nombre del archivo), puede escribir una función:

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

(esta función es específica de zsh), y para cada archivo your_file.pdf que desea convertir:

pdf2png your_file.pdf

Nota 1: puede escribir el mismo tipo de función para otros shells, pero esto es un poco más complejo.

Nota 2: Con zsh, las comillas son útiles solo si la SH_WORD_SPLITopción está configurada (que no es la predeterminada).

vinc17
fuente
4

Considere usar variables para almacenar sus nombres de archivo. También se autocompletan:

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

Uso comillas porque a veces los espacios muerden.

Los beneficios significativos de esto son:

  1. Puede realizar más operaciones con el valor en $ f, sabiendo que apunta al archivo correcto
  2. Es el más corto de los saltos para pegar esto en una cat listOfFiles | while read f; do ... ; doneestructura de bucle.
  3. A menudo, los nombres de archivos generados automáticamente son muy similares, y el autocompletado se vuelve muy molesto muy rápidamente si tiene que hacerlo, abc<tab>d<tab>x<tab>2<tab>etc. De esta manera, solo tiene que escribirlo una vez, e incluso puede recoger el último archivo o el archivo más grande a través de un script como f=\ls -t | cabeza -1 '', en lugar de ejecutar primero la búsqueda, buscar el nombre del archivo y transcribirlo como una especie de mono entrenado.
Phil H
fuente
2

También puede usar la expansión del historial para referirse a palabras en la línea de comando actual:

convert -trim -density 400 this_is_a_very_long_filename_of_my_pdf_file.pdf !#:$:r.png
  • El designador de eventos se !# refiere a la línea de comando escrita hasta ahora
  • El designador de palabras $ indica la última palabra (antes de la expansión)
  • El modificador r elimina la extensión del archivo. Esto también marca el final del texto, que se reemplaza cuando se produce la expansión del historial.
  • .pngEs la nueva extensión. Esto no pertenece a la expansión misma.

Cuando se ejecuta esta línea, !#:$:rse reemplaza por el nombre de su archivo pdf menos la extensión, creando así el comando a partir de la pregunta:

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

Esta línea se ejecuta directamente.

Si desea verificar el comando después de la expansión del historial, antes de la ejecución, use

setopt histverify

Esto volverá a cargar la línea expandida en el búfer de edición en lugar de ejecutarla.

Nota: a diferencia de cualquier otra expansión, la expansión del historial se realiza antes de que el comando se guarde en el historial. Entonces echo !#aparecerá como echo echoy no como echo !#en tu $HISTFILE.

Adaephon
fuente
2

El uso de la expansión de llaves no puede ser mejor para este ejemplo especial. Sin embargo, un poco más flexible es el widget zle copy-prev-shell-word, que hace lo que su nombre sugiere y es útil si desea un argumento similar al anterior, que no puede derivarse sistemáticamente de él.

Vincula el widget, por ejemplo, a CTRL+W:

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

Si eres tan flojo como yo, usa esta secuencia de Bindkey

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

para obtener el siguiente comportamiento:

  • CTRL+Winserta la palabra de shell anterior con un espacio en blanco inicial (por lo tanto, ¡guarda una pulsación de tecla!)
  • CTRL+W CTRL+W inserta la palabra de shell anterior directamente
mpy
fuente