Як набрати кілька імен файлів із меншою кількістю натискань клавіш


16

Якщо я хочу перетворити зображення pdfв pngзображення за допомогою imagemagick, я роблю щось на кшталт:

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 з якихось причин часто є дуже довге ім'я файлу, і я хочу, щоб у pngфайлу було те саме ім'я, крім розширення.

Зазвичай я вибираю this_is_a_very_long_filename_of_my_pdf_file.pdfдва рази через вкладку і zsh-menuі змінити те , pdfщоб pngвручну для другого аргументу.

Однак чи існує швидший спосіб зробити це?

Відповіді:


23

Ви можете використовувати розширення дужок :

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

1
Можна також відзначити ім’я файлу автодоповнення (воно присутнє в zsh, чи не так?)
Руслан

@Ruslan ОП заявив, що використовує автозаповнення. Але все-таки приємний ощадний час.
Cammy_the_block

5

Цей заклик змінити зможе створити новий png-файл замість того, щоб перезаписати pdf - сподіваємось;)

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

для th * .pdf використовуйте відповідну кількість символів, щоб вибрати потрібний файл або краще заповнити вкладку, поки ви не отримаєте повне ім'я.

Таким чином ви можете зробити псевдонім для всієї команди до параметра png.


5

Якщо ви завжди використовуєте одну і ту ж команду з невеликими варіаціями (наприклад, ім'я файлу), ви можете написати функцію:

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

(ця функція специфічна для zsh), і для кожного файлу your_file.pdf, який ви хочете перетворити:

pdf2png your_file.pdf

Примітка 1: Ви можете записати такий самий варіант функції для інших оболонок, але це трохи складніше.

Примітка 2: З zsh, лапки корисні лише в тому випадку, якщо встановлено SH_WORD_SPLITпараметр (що не є типовим).


4

Подумайте про використання змінних для зберігання своїх імен файлів. Вони також автозаповнюються:

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

Я використовую цитати, бо іноді пробіли кусаються.

Істотними перевагами цього є:

  1. Ви можете виконувати подальші операції зі значенням у $ f, знаючи, що воно вказує на потрібний файл
  2. Це найкоротший з хмелів, щоб вписати це в cat listOfFiles | while read f; do ... ; doneструктуру петлі.
  3. Часто автогенеровані назви файлів дуже схожі, і автоматичне завершення дуже дратує дуже швидко, якщо вам доведеться це робити abc<tab>d<tab>x<tab>2<tab>і т. Д. Таким чином, вам потрібно ввести його лише один раз, і ви навіть можете отримати останній файл або найбільший файл через такий сценарій, як f=\ls -t | голова -1 ', замість того, щоб спочатку запустити пошук, шукати ім’я файлу і переписати його, як якусь навчену мавпу.

2

Ви також можете використовувати розширення історії для позначення слів у поточному командному рядку:

convert -trim -density 400 this_is_a_very_long_filename_of_my_pdf_file.pdf !#:$:r.png
  • Позначення подій !# посилається на набраний до цього часу командний рядок
  • Словознавець $ вказує останнє слово (перед розширенням)
  • Модифікатор r видаляє розширення файлу. Це також позначає кінець тексту, який замінюється, коли відбувається розширення історії.
  • .pngє новим розширенням. Це не належить до самого розширення.

Коли цей рядок запущений, !#:$:rзамінюється назвою вашого pdf-файла за вирахуванням розширення, створюючи команду з питання:

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

Потім цей рядок виконується безпосередньо.

Якщо ви хочете перевірити команду після розширення історії, перед її виконанням використовуйте

setopt histverify

Це перезавантажить розширений рядок у буфер редагування замість його виконання.

Примітка. На відміну від будь-якого іншого розширення, розширення історії виконується до того, як команда буде збережена в історію. Так echo !#з'являться як echo echoі не як echo !#у вашому $HISTFILE.


2

Використання розширення дужок не можна перемогти в цьому спеціальному прикладі. Однак трохи більш гнучким є віджет zle copy-prev-shell-word, який робить те, що пропонує його ім'я, і ​​є зручним, якщо ви хочете аналогічний аргумент, як попередній, який не може систематично виводити з нього.

Прив’яжіть віджет, наприклад, до CTRL+W:

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

Якщо ти такий самий ледачий, як і я, використовуй цю послідовність bindkey

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

щоб отримати таку поведінку:

  • CTRL+Wвставляє попереднє слово оболонки з основним порожнім (отже, ви зберігаєте один натискання клавіші!)
  • CTRL+W CTRL+W вставляє попереднє слово оболонки безпосередньо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.