Ответ на ваш вопрос зависит от того, может ли эта строка появляться только один раз или несколько раз в рассматриваемом PDF-файле (с ). Предполагая, что это может произойти только один раз, и рассматриваемая строка содержится как фактический текст (, т.е. не только в графической форме )следующий подход, который требует GNU Awk и внешнего инструмента pdftotext
, должно работать (пример для одного файла, переданного в качестве параметра):
#!/bin/bash
OLDNAME="$1"
NUMBER="$(pdftotext "$OLDNAME" - | awk '/R E A D I N G/ {match($0,"R E A D I N G ([[:digit:]])( [[:digit:]])*",a); gsub(" ","",a[2]); print a[1] a[2];}')"
NEWNAME="$NUMBER.$OLDNAME"
mv "$OLDNAME" "$NEWNAME"
Функция match
функции awk
проверяет наличие определенного паттерна и выводит «фактическое значение» паттерна в выходной массив a
, где записи a[0]
содержат весь найденный паттерн и a[1]
- a[n]
содержат «фактические значения» любых вложенных -выражений, заключенных в круглые скобки в шаблоне, в нашем случае «числовая часть» ([[:digit:]])( [[:digit:]])*
в элементах массива 1 и 2 (ср. например. раздел GNU Awk User's Guide, посвященный «строковым функциям»). Если результат однозначный -, число a[2]
останется пустым, что не имеет значения. Поскольку в случае двух цифр -пробел между цифрами также будет совпадать, мы используем функцию awk
gsub()
, чтобы удалить его в случае двух цифр -.
Чтобы применить его к нескольким файлам, вы можете изменить сценарий следующим образом, а затем передать весь список PDF-файлов в качестве аргумента (, например./rename.sh *.pdf
).
#!/bin/bash
for OLDNAME in "$@"
do
NUMBER="$(pdftotext "$OLDNAME" - | awk '/R E A D I N G/ {match($0,"R E A D I N G ([[:digit:]])( [[:digit:]])*",a); gsub(" ","",a[2]); print a[1] a[2];}')"
NEWNAME="$NUMBER.$OLDNAME"
mv "$OLDNAME" "$NEWNAME"
done
ш+ожидать
Напишите сценарий sh
со всеми тремя вашими командами, как они есть -вам все равно придется вводить пароль три раза, но это все равно будет проще сделать по сравнению с ручными командами.
Если у вас есть сценарий, вы можете поиграть с expect
и ввести пароль с его помощью. Но это можно считать небезопасным, так как с expect
вы должны открыто хранить пароли в скрипте.
Лично я часто останавливаюсь на первом решении -вводить пароль несколько раз не очень сложно (просто раздражает ). Но если позволяет обстановка безопасности,-expect
может творить чудеса/
Если это не было специально отключено, вы можете попробовать мультиплексирование. Это по-прежнему несколько команд, но поскольку для аутентификации используется только начальное основное соединение, а остальные команды выполняются по этому предварительно -аутентифицированному каналу, вы обнаружите, что оно выполняется быстрее :
.# Set up master connection to target system
ssh -S "$HOME/.ssh.sock" -M -o ControlPersist=yes -fN user@server
# Perform the commands using the master connection
scp -o ControlPath="$HOME/.ssh.sock" localfile.jar user@server:path/
ssh -S "$HOME/.ssh.sock" user@server java -jar path/localfile.jar some argument >path/output.bin
# Tear down the master connection when you have finished
ssh -S "$HOME/.ssh.sock" -O exit user@server
Вам не нужна последняя команда из набора из трех примеров, потому что ваша команда ssh
уже помещает свой вывод в локальный файл path/output.bin
.
Вы можете указать тайм-аут для основного сеанса, чтобы, если вы перестанете его использовать и забудете закрыть, он завершится автоматически (, например, ControlPersist=60
вместо ControlPersist=yes
на минуту -длительный тайм-аут ).
Если вы часто выполняете эти операции, возможно, стоит использовать ~/.ssh/ssh_config
для переопределения предпочтительных настроек по умолчанию для цели server
.