У меня есть несколько файлов в каталоге с именем edit_file_names.sh, каждый из которых содержит ? в своем имени. Я хочу использовать сценарий Bash для сокращения имен файлов прямо перед ?. Например, это будут мои текущие имена файлов:

test.file.1?twagdsfdsfdg
test.file.2?
test.file.3?.?

И это будут мои желаемые имена файлов после запуска скрипта:

test.file.1
test.file.2
test.file.3

Однако я не могу зафиксировать начало имен файлов в моем регулярном выражении, чтобы использовать их при переименовании файлов. Вот мой текущий сценарий:

#!/bin/bash
cd test_file_name_edit/

regex="(^[^\?]*)"

for filename in *; do
  $filename =~ $regex
  echo ${BASH_REMATCH[1]}
done

На этом этапе я просто пытаюсь распечатать начало каждого имени файла, чтобы знать, что я захватываю правильную строку, однако я получаю следующую ошибку:

./edit_file_names.sh: line 7: test.file.1?twagdsfdsfdg: command not found

./edit_file_names.sh: line 7: test.file.2?: command not found

./edit_file_names.sh: line 7: test.file.3?.?: command not found

Как я могу исправить свой код, чтобы успешно зафиксировать начало этих имен файлов?

0
J0HN_TIT0R 14 Мар 2018 в 02:57

2 ответа

Лучший ответ

Вы пропустили тестовую команду [[ ]]:

for filename in *; do
  [[ $filename =~ $regex ]] && echo ${BASH_REMATCH[1]}
done
1
Gilles Quenot 13 Мар 2018 в 23:58