Cara mengetik beberapa nama file dengan sedikit penekanan tombol

16

Jika saya ingin mengonversi gambar pdfmenjadi pnggambar dengan imagemagick, saya melakukan sesuatu seperti:

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

File pdf sering memiliki nama file yang sangat panjang karena beberapa alasan dan saya ingin pngfile tersebut memiliki nama yang sama kecuali ekstensi.

Biasanya saya pilih this_is_a_very_long_filename_of_my_pdf_file.pdfdua kali melalui tab dan zsh-menudan mengubah kemudian pdfke pngmanual untuk argumen kedua.

Namun adakah cara yang lebih cepat untuk melakukan ini?

siswa
sumber

Jawaban:

23

Anda dapat menggunakan ekspansi brace :

convert -trim -density 400 this_is_a_very_long_filename_of_my_pdf_file.{pdf,png}
nandhp
sumber
1
Dapat juga mencatat pelengkapan otomatis nama file (ada di zsh, bukan?)
Ruslan
@Ruslan OP mengatakan dia menggunakan autocomplete. Tapi tetap saja, menghemat waktu dengan baik.
Cammy_the_block
5

Panggilan untuk mogrify ini akan membuat file png baru alih-alih menimpa pdf - semoga;)

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

untuk th * .pdf gunakan jumlah karakter yang tepat untuk memilih file yang tepat atau penyelesaian tab yang lebih baik sampai Anda memiliki nama lengkap.

Dengan cara ini Anda dapat membuat alias ke seluruh perintah hingga ke parameter png.

gugu
sumber
5

Jika Anda selalu menggunakan perintah yang sama dengan variasi kecil (seperti nama file), Anda dapat menulis fungsi:

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

(fungsi ini khusus untuk zsh), dan untuk setiap file your_file.pdf Anda ingin mengkonversi:

pdf2png your_file.pdf

Catatan 1: Anda dapat menulis fungsi yang sama untuk shell lain, tetapi ini sedikit lebih rumit.

Catatan 2: Dengan zsh, tanda kutip hanya berguna jika SH_WORD_SPLITopsi disetel (yang bukan default).

vinc17
sumber
4

Pertimbangkan menggunakan variabel untuk menyimpan nama file Anda. Mereka juga dilengkapi secara otomatis:

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

Saya menggunakan tanda kutip karena terkadang spasi menggigit.

Manfaat signifikan dari ini adalah:

  1. Anda dapat melakukan operasi lebih lanjut dengan nilai dalam $ f, mengetahui itu menunjuk ke file yang tepat
  2. Ini adalah hop terpendek untuk menempel ini dalam cat listOfFiles | while read f; do ... ; donestruktur loop.
  3. Seringkali nama file yang dihasilkan secara otomatis sangat mirip, dan pelengkapan otomatis menjadi sangat menjengkelkan dengan sangat cepat jika Anda harus melakukannya abc<tab>d<tab>x<tab>2<tab>dll. Dengan cara ini, Anda hanya perlu mengetiknya sekali, dan Anda bahkan dapat mengambil file terbaru atau file terbesar melalui skrip seperti f=\ls -t | head -1``, alih-alih menjalankan pencarian terlebih dahulu, mencari nama file dan menyalinnya seperti semacam monyet terlatih.
Phil H
sumber
2

Anda juga dapat menggunakan Riwayat Ekspansi untuk merujuk kata-kata di baris perintah saat ini:

convert -trim -density 400 this_is_a_very_long_filename_of_my_pdf_file.pdf !#:$:r.png
  • Designator acara !# mengacu pada baris perintah yang diketik sejauh ini
  • Penunjuk kata $ menunjukkan kata terakhir (sebelum ekspansi)
  • Pengubah r menghapus ekstensi file. Ini juga menandai akhir teks, yang diganti ketika ekspansi sejarah terjadi.
  • .pngadalah ekstensi baru. Ini bukan milik ekspansi itu sendiri.

Ketika baris ini dijalankan, !#:$:rdiganti dengan nama file pdf Anda minus ekstensi, sehingga menciptakan perintah dari pertanyaan:

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

Baris ini kemudian langsung dieksekusi.

Jika Anda ingin memeriksa perintah setelah ekspansi sejarah, sebelum eksekusi, gunakan

setopt histverify

Ini akan memuat ulang baris yang diperluas ke buffer pengeditan alih-alih menjalankannya.

Catatan: Tidak seperti ekspansi lainnya, ekspansi riwayat dilakukan sebelum perintah disimpan ke riwayat. Jadi echo !#akan muncul echo echodan tidak seperti echo !#di Anda $HISTFILE.

Adaephon
sumber
2

Menggunakan ekspansi brace tidak dapat dikalahkan untuk contoh khusus ini. Namun, yang sedikit lebih fleksibel adalah widget zlecopy-prev-shell-word , yang melakukan apa yang disarankan namanya dan berguna jika Anda ingin argumen yang sama seperti sebelumnya, yang tidak dapat secara sistematis diturunkan darinya.

Bind widget misalnya ke CTRL+W :

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

Jika Anda malas seperti saya, gunakan urutan bindkey ini

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

untuk mendapatkan perilaku berikut:

  • CTRL+W menyisipkan kata shell sebelumnya dengan a blanko terkemuka (karenanya, Anda menyimpan satu penekanan tombol!)
  • CTRL+W CTRL+W menyisipkan kata shell sebelumnya secara langsung
mpy
sumber