У меня есть сценарий, где у меня есть два файла в папке:

1) Foo bar.pdf

2) Другой файл.pdf

Я объединяю оба файла в один. Полученный файл должен иметь имя «Foo.pdf».

Таким образом, файл .sh будет содержать следующую функцию:

Проверьте, содержит ли * .pdf "bar" // проверьте все PDF-файлы в папке на наличие слова "bar" в имени файла.

If TRUE ($ value = "Foo.pdf") // извлечь "Foo" из имени файла

mkfile = $ value.pdf

Таким образом, я хотел бы получить что-то вроде следующего:

(Справочник 1)

ФАЙЛ 1: Фу Бла Бла 123.pdf

ФАЙЛ 2: Другой файл.pdf

... запустить скрипт ...

ФАЙЛ 3: Foo.pdf // созданный файл

Надеюсь, что имеет смысл? Может кто-нибудь, пожалуйста, укажите мне в правильном направлении?

1 ответ1

0

Вот один из способов:

for FILE in *bar.pdf; do
    NEWNAME=$(echo $FILE | sed -En 's/(.*)bar.pdf/\1.pdf/p')
    mv $FILE $NEWNAME
done

Объяснение: При этом используется синтаксис цикла for bash и глобализация оболочки (сопоставление имени файла на основе подстановочного знака) для обработки каждого файла, заканчивающегося на "bar.pdf". Он берет имя каждого файла и отправляет его в sed . sed должен запомнить часть имени файла перед «bar.pdf», а затем заменить имя файла на запомненную часть с добавлением «.pdf» в конце. Это новое имя файла сохраняется как NEWNAME. Затем вызывается mv чтобы переименовать файл с новым именем, и цикл продолжает обрабатывать следующий файл (если есть еще файлы, соответствующие * bar.pdf).

(Протестировано с использованием встроенного в MacOS High Sierra 10.13.6 bash и sed . Инструменты вашей системы могут отличаться. Я почти уверен, что GNU sed в Linux использует параметры командной строки, отличные от sed на основе BSD в macOS, поэтому сначала проверьте вашу локальную страницу руководства sed .)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .