Como digitar vários nomes de arquivo com menos pressionamentos de tecla

16

Se eu quiser converter um pdfem uma pngimagem com imagemagick, faço 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

O arquivo pdf geralmente possui um nome de arquivo muito longo por alguns motivos e eu quero que o pngarquivo tenha o mesmo nome, exceto a extensão.

Normalmente eu seleciono this_is_a_very_long_filename_of_my_pdf_file.pdfduas vezes via tab e zsh-menuentão mudo pdfpara pngmanualmente para o segundo argumento.

No entanto, existe uma maneira mais rápida de fazer isso?

aluna
fonte

Respostas:

23

Você pode usar expansões de chaves :

convert -trim -density 400 this_is_a_very_long_filename_of_my_pdf_file.{pdf,png}
nandhp
fonte
11
Também pode-se notar autocompletion nome de arquivo (ele está presente em zsh, não é?)
Ruslan
@Ruslan O OP disse que usa o preenchimento automático. Mas ainda assim, bom ponto de economia de tempo.
Cammy_the_block
5

Esta chamada para mogrify criará um novo arquivo png em vez de sobrescrever o pdf - espero;)

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

para th * .pdf, use o número apropriado de caracteres para selecionar o arquivo correto ou o melhor preenchimento da guia até obter o nome completo.

Dessa forma, você pode criar um alias para todo o comando até o parâmetro png.

gugu
fonte
5

Se você sempre usar o mesmo comando com pequenas variações (como o nome do arquivo), poderá escrever uma função:

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

(essa função é específica para zsh) e para cada arquivo your_file.pdf que você deseja converter:

pdf2png your_file.pdf

Nota 1: Você pode escrever o mesmo tipo de função para outros shells, mas isso é um pouco mais complexo.

Nota 2: Com zsh, as aspas são úteis apenas se a SH_WORD_SPLITopção estiver definida (que não é o padrão).

vinc17
fonte
4

Considere usar variáveis ​​para armazenar seus nomes de arquivos. Eles também são preenchidos automaticamente:

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

Uso aspas porque às vezes os espaços picam.

Os benefícios significativos disso são:

  1. Você pode executar outras operações com o valor em $ f, sabendo que ele aponta para o arquivo certo
  2. É o menor lúpulo para colocar isso em uma cat listOfFiles | while read f; do ... ; doneestrutura de loop.
  3. Geralmente, os nomes de arquivos gerados automaticamente são muito semelhantes, e o preenchimento automático fica muito irritante muito rapidamente se você precisar fazer isso abc<tab>d<tab>x<tab>2<tab>etc. Dessa forma, você só precisa digitá-lo uma vez e pode até escolher o arquivo mais recente ou o maior arquivo via um script como f=\ls -t | head -1``, em vez de executar a pesquisa pela primeira vez, procurando o nome do arquivo e transcrevendo-o como uma espécie de macaco treinado.
Phil H
fonte
2

Você também pode usar a Expansão do histórico para se referir às palavras na linha de comando atual:

convert -trim -density 400 this_is_a_very_long_filename_of_my_pdf_file.pdf !#:$:r.png
  • O designador de evento !# refere-se à linha de comando digitada até o momento
  • O designador de palavras $ indica a última palavra (antes da expansão)
  • Modificador r remove a extensão do arquivo. Isso também marca o final do texto, que é substituído quando ocorre a expansão do histórico.
  • .pngé a nova extensão. Isso não pertence à própria expansão.

Quando esta linha é executada, !#:$:ré substituída pelo nome do seu arquivo pdf menos a extensão, criando assim o comando a partir da pergunta:

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

Essa linha é então executada diretamente.

Se você deseja verificar o comando após a expansão do histórico, antes da execução, use

setopt histverify

Isso recarregará a linha expandida no buffer de edição, em vez de executá-lo.

Nota: Diferentemente de qualquer outra expansão, a expansão do histórico é executada antes que o comando seja salvo no histórico. Então echo !#, aparecerá como echo echoe não como echo !#no seu $HISTFILE.

Adaephon
fonte
2

O uso da expansão de chaves não pode ser derrotado neste exemplo especial. No entanto, um pouco mais flexível é o widget zle copy-prev-shell-word, que faz o que o nome sugere e é útil se você deseja um argumento semelhante ao anterior, que não pode derivar sistematicamente dele.

Ligue o widget, por exemplo CTRL+W:

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

Se você é tão preguiçoso quanto eu, use esta sequência de teclas de ligação

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

para obter o seguinte comportamento:

  • CTRL+Winsere a palavra shell anterior com um espaço em branco à esquerda (portanto, você salva um pressionamento de tecla!)
  • CTRL+W CTRL+W insere a palavra shell anterior diretamente
mpy
fonte