Использование команды переименования в Ubuntu для переименования набора файлов. - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть сценарий оболочки для переименования нескольких файлов в папке. Он работает на хосте rhel, но выдает ошибку на хосте ubuntu14.

#!/usr/bin/env bash

SOME_NUMBER=1
rename _file_name.c _file_${SOME_NUMBER}.c path/of/file/*_file_name.c

Какие изменения я должен внести в код, чтобы он работал на хосте ubuntu14?

EDIT-1:

Для запуска кода на машине с Ubuntu я сделал следующее изменение, и оно работает:

rename 's/\_file_name.c$/\_file_1.c/' path/of/file/*_file_name.c

, но следующее не работает, и я получаю сообщение об ошибке ниже:

rename 's/\_file_name.c$/\_file_${SOME_NUMBER}.c/' path/of/file/*_file_name.c

СООБЩЕНИЕ ОБ ОШИБКЕ:

Global symbol "$SOME_NUMBER" requires explicit package name at (eval 1) line 1.
Global symbol "$SOME_NUMBER" requires explicit package name at (eval 1) line 1.

1 Ответ

0 голосов
/ 06 ноября 2018

Одинарные кавычки предотвращают расширение параметров. Поскольку синтаксис Perl и оболочки в этом отношении похож, буквенная строка s/\_file_name.c$/\_file_${SOME_NUMBER}.c/ передается в Perl, где он пытается раскрыть неопределенную переменную $SOME_NUMBER.

Вместо этого используйте двойные кавычки:

rename "s/\_file_name.c$/\_file_${SOME_NUMBER}.c/" path/of/file/*_file_name.c

См. Разница между одинарными и двойными кавычками в Bash

Убедитесь, что значение SOME_NUMBER в вашем сценарии оболочки на самом деле является просто числом или, по крайней мере, чем-то, что при раскрытии дает допустимое выражение Perl.

...