Daha az tuş vuruşuyla birkaç dosya adı nasıl yazılır


16

Ben pdfbir pnggörüntü imagemagick ile dönüştürmek istiyorsanız ben gibi bir şey yapmak:

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

Pdf dosyası genellikle bazı nedenlerden dolayı çok uzun bir dosya adına sahiptir ve pngdosyanın uzantı dışında aynı ada sahip olmasını istiyorum .

Genellikle this_is_a_very_long_filename_of_my_pdf_file.pdfsekme yoluyla iki kez seçerim ve zsh-menusonra ikinci argüman pdfiçin pngmanuel olarak değiştiririm .

Ancak bunu yapmanın daha hızlı bir yolu var mı?

Yanıtlar:


23

Küme ayracı genişletmelerini kullanabilirsiniz :

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

1
Ayrıca dosya adı otomatik tamamlamasını da not edebilir (zsh'da mevcut, değil mi?)
Ruslan

@Ruslan OP otomatik tamamlamayı kullandığını söyledi. Ama yine de, güzel zaman tasarrufu noktası.
Cammy_the_block

5

Bu mogrify çağrısı pdf üzerine yazmak yerine yeni bir png dosyası oluşturacaktır - umarım;)

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

th * .pdf için tam dosya olana kadar doğru dosyayı veya daha iyi sekme tamamlamayı seçmek için uygun sayıda karakter kullanın.

Bu şekilde png parametresine kadar tüm komut için bir takma ad oluşturabilirsiniz.


5

Her zaman aynı komutu küçük varyasyonlarla (dosya adı gibi) kullanırsanız, bir işlev yazabilirsiniz:

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

(bu işlev spesifiktir zsh) ve dönüştürmek istediğiniz her dosya için dosya_file.pdf:

pdf2png your_file.pdf

Not 1: Diğer kabuklar için aynı tür bir işlev yazabilirsiniz, ancak bu biraz daha karmaşıktır.

Not 2: ile zshtırnaklar yalnızca SH_WORD_SPLITseçenek ayarlanmışsa (varsayılan olmayan) kullanışlıdır .


4

Dosya adlarınızı saklamak için değişkenler kullanmayı düşünün. Onlar da otomatik tamamlar:

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

Tırnak işaretleri kullanıyorum çünkü bazen boşluklar ısırıyor.

Bunun önemli faydaları:

  1. Doğru dosyayı gösterdiğini bilerek, $ f değeriyle başka işlemler yapabilirsiniz.
  2. Bunu bir cat listOfFiles | while read f; do ... ; donedöngü yapısına yapıştırmak için en kısa şerbetçiotu .
  3. Genellikle otomatik olarak oluşturulan dosya adları çok benzer ve otomatik tamamlama çok hızlı bir şekilde yapmak zorunda kalırsanız çok can sıkıcı olur abc<tab>d<tab>x<tab>2<tab>. f=\ls -t gibi bir komut dosyası aracılığıyla | baş -1 ``, ilk önce arama yapmak, dosya adını aramak ve bir çeşit eğitimli maymun gibi kopyalamak yerine.

2

Geçerli komut satırındaki kelimelere başvurmak için Geçmiş Genişletme'yi de kullanabilirsiniz :

convert -trim -density 400 this_is_a_very_long_filename_of_my_pdf_file.pdf !#:$:r.png
  • Olay belirleyicisi !# şimdiye kadar yazılan komut satırını ifade eder
  • Sözcük belirleyici $ son sözcüğü belirtir (genişletmeden önce)
  • Değiştirici r dosya uzantısını kaldırır. Bu aynı zamanda metnin, geçmiş genişlemesi gerçekleştiğinde değiştirilen sonunu da işaretler.
  • .pngyeni uzantıdır. Bu, genişlemenin kendisine ait değildir.

Bu satır çalıştırıldığında, !#:$:rpdf dosyanızın uzantısı eksi adı ile değiştirilir, böylece sorudan komut oluşturulur:

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

Bu çizgi daha sonra doğrudan yürütülür.

Geçmişi genişlettikten sonra komutu yürütmeden önce, yürütmeden önce şunu kullanın:

setopt histverify

Bu, genişletilmiş satırı yürütmek yerine düzenleme arabelleğine yeniden yükleyecektir.

Not: Diğer genişletmelerin aksine, geçmiş genişletmesi, komut geçmişe kaydedilmeden önce gerçekleştirilir. Yani sizin gibi echo !#görünecek echo echove değil .echo !#$HISTFILE


2

Bu özel örnek için küme ayracı genişletme özelliği kullanılamaz . Bununla birlikte, copy-prev-shell-wordisminin önerdiğini yapan ve önceki ile benzer bir argüman istiyorsanız , ondan sistematik olarak türetilemeyen zle widget'ı biraz daha esnektir .

Widget'ı örneğin CTRL+W:

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

Benim kadar tembelsen, bu bindkey dizisini kullan

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

aşağıdaki davranışı elde etmek için:

  • CTRL+Wönceki kabuk kelimesini öndeki boşlukla ekler (bu nedenle bir tuş vuruşu kaydedersiniz!)
  • CTRL+W CTRL+W önceki kabuk sözcüğünü doğrudan ekler
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.