Как набрать несколько имен файлов с меньшим количеством нажатий клавиш

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}
nandhp
источник
1
Можно также отметить автозаполнение имени файла (оно присутствует в zsh, не так ли?)
Руслан
@Ruslan ОП сказал, что использует автозаполнение. Но все же, хороший момент для экономии времени.
Cammy_the_block
5

Этот вызов mogrify создаст новый png-файл вместо перезаписи pdf - надеюсь;)

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

для th * .pdf используйте соответствующее количество символов, чтобы выбрать правильный файл или лучше завершить вкладку, пока у вас не будет полное имя.

Таким образом, вы можете создать псевдоним для всей команды вплоть до параметра png.

Gugu
источник
5

Если вы всегда используете одну и ту же команду с небольшими вариациями (например, имя файла), вы можете написать функцию:

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

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

pdf2png your_file.pdf

Примечание 1: Вы можете написать такую ​​же функцию для других оболочек, но это немного сложнее.

Примечание 2: с zsh, кавычки полезны, только если установлен SH_WORD_SPLITпараметр (который не по умолчанию).

vinc17
источник
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 | head -1`` вместо того, чтобы сначала запустить поиск, отыскивая имя файла и расшифровывая его, как некую обученную обезьяну.
Phil H
источник
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.

Adaephon
источник
2

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

Привязать виджет, например CTRL+W:

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

Если вы так же ленивы, как и я, используйте эту последовательность клавиш

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

чтобы получить следующее поведение:

  • CTRL+Wвставляет предыдущее слово оболочки с пробелом в начале (следовательно, вы сохраняете одно нажатие клавиши!)
  • CTRL+W CTRL+W вставляет предыдущее слово оболочки напрямую
МРУ
источник