Come digitare più nomi di file con un minor numero di tasti


16

Se voglio convertire un pdfin pngun'immagine con imagemagick, faccio qualcosa del tipo:

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

Il file pdf ha spesso un nome di file molto lungo per alcuni motivi e voglio che il pngfile abbia lo stesso nome tranne l'estensione.

Di solito seleziono this_is_a_very_long_filename_of_my_pdf_file.pdfdue volte tramite scheda e zsh-menue cambiare poi pdfper pngmanualmente per il secondo argomento.

Tuttavia c'è un modo più veloce per farlo?

Risposte:


23

Puoi usare le espansioni di parentesi graffe :

convert -trim -density 400 this_is_a_very_long_filename_of_my_pdf_file.{pdf,png}

1
Posso anche notare il completamento automatico del nome file (è presente in zsh, non è vero?)
Ruslan,

@Ruslan L'OP ha detto che usa il completamento automatico. Ma comunque, bel punto per risparmiare tempo.
Cammy_the_block il

5

Questa chiamata a mogrify creerà un nuovo file png invece di sovrascrivere il pdf - si spera;)

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

per th * .pdf usa il numero appropriato di caratteri per selezionare il file giusto o un migliore completamento della scheda fino ad avere il nome completo.

In questo modo puoi creare un alias per l'intero comando fino al parametro png.


5

Se usi sempre lo stesso comando con piccole variazioni (come il nome del file), puoi scrivere una funzione:

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

(questa funzione è specifica per zsh), e per ogni file tuo_file.pdf che vuoi convertire:

pdf2png your_file.pdf

Nota 1: è possibile scrivere lo stesso tipo di funzione per altre shell, ma questo è un po 'più complesso.

Nota 2: Con zsh, le virgolette sono utili solo se l' SH_WORD_SPLITopzione è impostata (che non è l'impostazione predefinita).


4

Prendi in considerazione l'utilizzo di variabili per memorizzare i nomi dei file. Si completano automaticamente anche:

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

Uso le virgolette perché a volte morde gli spazi.

I vantaggi significativi di questo sono:

  1. È possibile eseguire ulteriori operazioni con il valore in $ f, sapendo che punta al file giusto
  2. È il luppolo più corto per attaccarlo in una cat listOfFiles | while read f; do ... ; donestruttura ad anello.
  3. Spesso i nomi dei file generati automaticamente sono molto simili e il completamento automatico diventa molto fastidioso molto rapidamente se devi fare abc<tab>d<tab>x<tab>2<tab>ecc. In questo modo, devi solo digitarlo una volta e puoi anche raccogliere l'ultimo file o il file più grande tramite uno script come f=\ls -t | testa -1 '', invece di eseguire prima la ricerca, cercando il nome del file e trascrivendolo come una specie di scimmia addestrata.

2

È inoltre possibile utilizzare Espansione cronologia per fare riferimento alle parole nella riga di comando corrente:

convert -trim -density 400 this_is_a_very_long_filename_of_my_pdf_file.pdf !#:$:r.png
  • Il designatore di eventi si !# riferisce alla riga di comando digitata finora
  • Il designatore di parole $ indica l'ultima parola (prima dell'espansione)
  • Il modificatore r rimuove l'estensione del file. Questo segna anche la fine del testo, che viene sostituito quando si verifica l'espansione della cronologia.
  • .pngè la nuova estensione. Questo non appartiene all'espansione stessa.

Quando viene eseguita questa riga, !#:$:rviene sostituito dal nome del file pdf meno l'estensione, creando così il comando dalla domanda:

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

Questa riga viene quindi eseguita direttamente.

Se si desidera controllare il comando dopo l'espansione della cronologia, prima dell'esecuzione, utilizzare

setopt histverify

Ciò ricaricherà la linea espansa nel buffer di modifica anziché eseguirla.

Nota: a differenza di qualsiasi altra espansione, l'espansione della cronologia viene eseguita prima che il comando venga salvato nella cronologia. Quindi echo !#apparirà come echo echoe non come echo !#nel tuo $HISTFILE.


2

L'uso dell'espansione del controvento non può essere battuto per questo esempio speciale. Tuttavia, un po 'più flessibile è il widget zle copy-prev-shell-word, che fa quello che suggerisce il nome ed è utile se si desidera un argomento simile al precedente, che non può derivare sistematicamente da esso.

Associa il widget ad es. A CTRL+W:

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

Se sei pigro come me, usa questa sequenza bindkey

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

per ottenere il seguente comportamento:

  • CTRL+Winserisce la parola shell precedente con uno spazio vuoto (quindi, si salva una sequenza di tasti!)
  • CTRL+W CTRL+W inserisce direttamente la parola shell precedente
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.